Windows窗体删除关闭按钮

时间:2012-08-23 18:56:37

标签: c# winforms

我正在使用Windows窗体应用,我想要从顶部删除关闭按钮。我知道ControlBox选项,但我想提供一个帮助按钮。有没有办法在保持帮助按钮时看不到关闭按钮?

4 个答案:

答案 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
    }
}

This is how my custom titlebar looked when I was done

从图像中可以看出,我还为控件添加了背景图像。根据您的耐心和要求,您可以使用图像和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