0

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

4 回答 4

5

您可以简单地使用Form.ControlBox = false(或通过设计师在您的评论中相当消极地指出)然后在表单上添加自定义帮助按钮吗?

编辑:我的一位同事写了一个 Excel 插件,并要求X从某些表单中删除(例如不应关闭的进度条)。他找到了一个由 Stephen Bullen 编写的函数,可以做到这一点。我只在 VB 中看到过这个函数,但也许你可以从他使用 Windows API 解决问题的方法中得到一些想法或方向。

于 2012-08-23T19:00:34.530 回答
4

您最好的选择可能是像这样订阅表单的 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;
}

您可能还注意到,我在标题栏中包含了鼠标向下、向上和移动的事件。这样我就可以在表单中创建侦听器,以便在用户单击并拖动标题栏时移动表单。这是可选的,取决于您是否需要用户能够移动您的应用程序窗口。

这样做的额外好处是可以使用标题栏进行附加控件。例如,我的应用程序是自定义编写的,用于带有小型触摸屏显示器的笔记本式平板电脑。在我的应用程序中,有限空间的利用非常重要。我能够进一步修改我在这里描述的内容,还可以直接在标题栏上包含菜单栏样式控件。此外,我在支架左侧添加了更多按钮,最小化、最大化和关闭按钮。真的帮助我在我的应用程序中利用了每一平方英寸的屏幕。使用标准标题栏无法做到这一点。

于 2012-08-23T20:01:58.460 回答
2

此代码将禁用关闭按钮。我不确定你是否真的可以让它不可见。http://www.codeproject.com/Articles/20379/Disabling-Close-Button-on-Forms

祝你好运!

于 2012-08-23T18:59:07.363 回答
0

请尝试this.ControlBox = false

于 2020-12-11T06:06:19.383 回答