Winform窗体关闭按钮禁用(失效)的四种方法

在winform中,系统默认是不能够禁用窗体的关闭功能。但是有时候为了功能需要,需要对关闭按钮做一些处理,下面列举几种关闭按钮禁用(失效)的几种方法。

一.关闭按钮失效(两种方法):这时候关闭按钮正常显示,只是点击后不能关闭窗体,即按钮功能失效。
1.重载WndProc方法。示例代码如下:
        protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_CLOSE = 0xF060;
            if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
            {
                return;
            }

            base.WndProc(ref m);
        }

2.利用窗体的FormClosing事件(需要注意的是:自定义关闭窗体时,需要首先将该事件移除,否则窗体永远关不掉。)示例代码如下:
        FormClosing += new FormClosingEventHandler(Form_FormClosing);
        private void Form_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
        }

二.关闭按钮禁用(两种方法):这时候关闭按钮灰化,无法点击。
1.重载CreateParams属性,该属性功能很强大,可以参照msdn。
        protected override CreateParams CreateParams
        {
            get
            {
                int CS_NOCLOSE = 0x200;
                CreateParams parameters = base.CreateParams;
                parameters.ClassStyle |= CS_NOCLOSE;
                return parameters;
            }
        }

2.利用导入用户Dll方法,将标题栏按钮禁用。(需要引用System.Runtime.InteropServices命名空间)
        [DllImport("USER32.DLL")]
        public static extern int GetSystemMenu(int hwnd, int bRevert);
        [DllImport("USER32.DLL")]
        public static extern int EnableMenuItem(int hMenu, int nPosition, int wFlags);

        const int MF_REMOVE = 0x1000;
        const int SC_RESTORE = 0xF120; //还原
        const int SC_MOVE = 0xF010; //移动
        const int SC_SIZE = 0xF000; //大小
        const int SC_MINIMIZE = 0xF020; //最小化
        const int SC_MAXIMIZE = 0xF030; //最大化
        const int SC_CLOSE = 0xF060; //关闭

        private void Form_Load(object sender, EventArgs e)
        {
            int hMenu = GetSystemMenu(this.Handle.ToInt32(), 0);
            EnableMenuItem(hMenu, SC_CLOSE, MF_REMOVE);
        }

三.另外,可能还有很多需求是让关闭按钮隐藏掉,目前还没很好的办法,可能考虑设置窗体 FormBorderStyle 属性 为 None,彻底隐藏标题栏,然后自己在窗体顶部加一个Panel,模拟出来一个窗体标题栏,里面的内容可以根据需要来设置。

posted @ 2012-03-16 16:31  forl  阅读(5805)  评论(1编辑  收藏  举报