I'm working on a Windows Forms app and I'm wanting to remove the close button from the top. I'm aware of the ControlBox
option, but I'm wanting to provide a help button. Is there a way to have the Close button not visible while maintaining the help button?
4 回答
您可以简单地使用Form.ControlBox = false
(或通过设计师在您的评论中相当消极地指出)然后在表单上添加自定义帮助按钮吗?
编辑:我的一位同事写了一个 Excel 插件,并要求X
从某些表单中删除(例如不应关闭的进度条)。他找到了一个由 Stephen Bullen 编写的函数,可以做到这一点。我只在 VB 中看到过这个函数,但也许你可以从他使用 Windows API 解决问题的方法中得到一些想法或方向。
您最好的选择可能是像这样订阅表单的 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;
}
您可能还注意到,我在标题栏中包含了鼠标向下、向上和移动的事件。这样我就可以在表单中创建侦听器,以便在用户单击并拖动标题栏时移动表单。这是可选的,取决于您是否需要用户能够移动您的应用程序窗口。
这样做的额外好处是可以使用标题栏进行附加控件。例如,我的应用程序是自定义编写的,用于带有小型触摸屏显示器的笔记本式平板电脑。在我的应用程序中,有限空间的利用非常重要。我能够进一步修改我在这里描述的内容,还可以直接在标题栏上包含菜单栏样式控件。此外,我在支架左侧添加了更多按钮,最小化、最大化和关闭按钮。真的帮助我在我的应用程序中利用了每一平方英寸的屏幕。使用标准标题栏无法做到这一点。
此代码将禁用关闭按钮。我不确定你是否真的可以让它不可见。http://www.codeproject.com/Articles/20379/Disabling-Close-Button-on-Forms
祝你好运!
请尝试this.ControlBox = false
。