我正在使用Windows窗体应用,我想要从顶部删除关闭按钮。我知道ControlBox
选项,但我想提供一个帮助按钮。有没有办法在保持帮助按钮时看不到关闭按钮?
答案 0 :(得分:4)
您可以简单地使用Form.ControlBox = false
(或者通过设计师在评论中指出相当消极的方式)然后在表单上添加自定义帮助按钮吗?
编辑:我的一位同事写了一个Excel插件,并要求从某些表格中删除X
(例如不应该关闭的进度条)。他找到了function written by Stephen Bullens就是这么做的。我只看过VB中使用的这个函数,但也许你可以从他使用Windows API来解决你的问题的方法中得到一些想法或方向。
答案 1 :(得分:3)
您最好的选择可能是订阅此类表单的FormClosing事件并取消结束操作:
// In your code somewhere subscribe to this event
Form1.FormClosing += Form1_FormClosing;
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
这样做的好处是可以防止用户从关闭按钮和任务栏关闭应用程序。
显然你不想总是从结束时取消表格。因此,您需要设置某种类型的布尔标志,您将在事件监听器中检查是否要允许表单关闭。例如:
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (BlockClosing)
e.Cancel = true;
}
编辑:如果您不想以这种方式解决问题,并且您确实打算完全删除关闭按钮,那么您最好的选择是创建自己的自定义标题栏。在这种情况下,您将窗体的FormBorderStyle属性设置为None。然后,您将自定义标题栏停靠在表单顶部。以下是我之前做过的一些示例代码:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Spectrum.UI
{
public partial class TitleBar : UserControl
{
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler MinButtonClick;
public event EventHandler MaxButtonClick;
public event EventHandler CloseButtonClick;
#region Properties
[Category("Appearance")]
public string Title
{
get { return TitleLabel.Text; }
set { TitleLabel.Text = value; }
}
[Category("Appearance")]
public bool MinimizeEnabled
{
get
{
return minButton.Visible;
}
set
{
minButton.Visible = value;
}
}
[Category("Appearance")]
public bool MaximizeEnabled
{
get
{
return maxButton.Visible;
}
set
{
maxButton.Visible = value;
}
}
#endregion
public TitleBar()
{
InitializeComponent();
ShowTitleBarImage = false;
}
#region Mouse Events
private void TitleBar_MouseDown(object sender, MouseEventArgs e)
{
this.OnMouseDown(e);
}
private void TitleBar_MouseUp(object sender, MouseEventArgs e)
{
this.OnMouseUp(e);
}
private void TitleBar_MouseMove(object sender, MouseEventArgs e)
{
this.OnMouseMove(e);
}
#endregion
#region Button Click Events
private void minButton_Click(object sender, EventArgs e)
{
if (MinButtonClick != null)
this.MinButtonClick.Invoke(this, e);
}
private void maxButton_Click(object sender, EventArgs e)
{
if (MaxButtonClick != null)
this.MaxButtonClick.Invoke(this, e);
}
private void closeButton_Click(object sender, EventArgs e)
{
if (CloseButtonClick != null)
this.CloseButtonClick.Invoke(this, e);
}
#endregion
}
}
从图像中可以看出,我还为控件添加了背景图像。根据您的耐心和要求,您可以使用图像和PictureBox控件使其看起来像您需要的标准标题栏。
在上面的示例中,我在控件上放置了三个按钮,我在网上找到的图像表示最小化,最大化和关闭。在您的情况下,您只需排除关闭按钮。我还在控件上放了一个字符串,并使用适当的字体作为窗口的标题。
将自定义标题栏添加到表单很简单。
public TitleBar titleBar = new TitleBar();
titleBar.Dock = DockStyle.Top;
titleBar.MaximizeEnabled = true;
titleBar.MinimizeEnabled = true;
titleBar.Size = new System.Drawing.Size(10, 40); // Width doesn't matter - I wanted it 40 pixels tall
titleBar.Title = "Title Example";
titleBar.MinButtonClick += titleBar_MinButtonClick;
titleBar.Max ButtonClick += titleBar_MaxButtonClick;
this.Controls.Add(this.TitleBar);
然后最后一步是为最小和最大按钮点击设置事件监听器:
private void titleBar_MinButtonClick(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
}
private void titleBar_MaxButtonClick(object sender, EventArgs e)
{
WindowState = FormWindowState.Maximized;
}
您可能还会注意到,我在标题栏中包含了鼠标按下,向上和移动的事件。这样我就可以在我的表单中创建监听器,以便在用户单击并拖动标题栏时移动表单。这是可选的,取决于您是否需要用户能够移动您的应用程序窗口。
这样做的另一个好处是可以使用标题栏进行其他控制。例如,我的应用程序是自定义编写的,用于带有小型触摸屏显示器的坚固型平板电脑。在我的应用中,利用有限的空间非常重要。我能够进一步修改我在这里描述的内容,直接在标题栏上包含菜单栏样式控件。此外,我在支架左侧添加了更多按钮,最小化,最大化和关闭按钮。真的帮助我在我的应用程序中使用每平方英寸的屏幕。无法用标准标题栏完成。
答案 2 :(得分:2)
此代码将禁用“关闭”按钮。我不确定你是否真的能让它看不见。 http://www.codeproject.com/Articles/20379/Disabling-Close-Button-on-Forms
祝你好运!答案 3 :(得分:0)
请尝试this.ControlBox = false
。