winform拦截关闭按钮触发的事件示例

用户关闭软件时,软件一般会给“是否确认关闭”的提示。通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭;否则把FormClosingEventArgs 的 Cancel 属性设置为 true,就取消了该窗体的关闭。

如果该窗体是主窗体,我们想在该窗体关闭时关闭整个应用程序,会遇到至少两种情况:

(1)该窗体同时是启动窗体,即它是应用程序中所有窗体的父类,则整个应用程序会被关闭。

(2)如果该窗体不是启动窗体,比如我们做了一个欢迎窗体,则应用程序中所有窗体的父类就是这个欢迎窗体了。这时该窗体的关闭并不会关闭整个应用程序。我们需要再加入“Application.Exit()”这行代码来退出应用程序。但同时又有问题了,父窗体的关闭又会给该窗体发送关闭事件,于是该事件又被调用一次,确认对话框又会弹出第二次。解决方法是用下面的代码:

注:做欢迎体界面可以在主窗体中,ShowDialog方法打开欢迎界面,而不是把欢迎界面作为启动窗体。下面的方法仅有理论意义。

代码如下:

protected override void WndProc(ref Message m)
{
    //Console.WriteLine(m.Msg);
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_CLOSE = 0xF060;
    if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
    {
        //捕捉关闭窗体消息
        //用户点击关闭窗体控制按钮   注释为最小化窗体  
        //this.WindowState = FormWindowState.Minimized;

//窗体隐藏
        this.Hide();
        return;
    }
    base.WndProc(ref m);
}

C# 窗体关闭时可以触发的事件

FormClosing :在窗体关闭时,FormClosing 事件发生。窗体关闭时,此事件会得到处理,从而释放与此窗体关联的所有资源。如果取消此事件,则该窗体保持打开状态。若要取消窗体的关闭操作,请将传递给事件处理程序的 FormClosingEventArgs 的 Cancel 属性设置为 true。

FormClosed:在用户或 Application 类的 Close 方法或 Exit 方法关闭窗体后,会发生 FormClosed 事件。若要防止窗体关闭,请处理 FormClosing 事件,并将传递给事件处理程序的 CancelEventArgs 的 Cancel 属性设置为 true。可以使用此事件执行一些任务,如释放窗体使用的资源,还可使用此事件保存输入窗体中的信息或更新其父窗体。

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带 X 的按钮)会隐藏窗体并将 DialogResult 属性设置为 DialogResult.Cancel。通过在窗体的 FormClosing 事件的事件处理程序中设置 DialogResult 属性,可以在用户单击“关闭”按钮时重写分配给 DialogResult 属性的值。

注意

在显示为无模式窗口的 Form 上调用 Close 方法时,不能调用 Show 方法使窗体可见,因为窗体的资源已被释放。若要隐藏窗体然后又使其可见,请使用 Hide 方法。

如果窗体是多文档界面 (MDI) 父窗体,则在引发 MDI 父窗体的 FormClosing 事件之前将引发所有 MDI 子窗体的 FormClosing 事件。同样,在引发 MDI 父窗体的 FormClosed 事件之前,将引发所有 MDI 子窗体的 FormClosed 事件。取消 MDI 子窗体的 FormClosing 事件不能防止引发 MDI 父窗体的 FormClosing 事件。但是,取消该事件会将作为参数传递给父窗体的 FormClosingEventArgs 类的 Cancel 属性设置成 false。要强制关闭所有 MDI 父窗体和子窗体,请将 MDI 父窗体中的 Cancel 属性设置成 false。

下面一个简单例子:

代码如下:

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
 { 
     DialogResult result = MessageBox.Show("你确定要关闭吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
     if (result == DialogResult.OK) 
     { 
e.Cancel = false;  //点击OK
     } 
     else
     { 
e.Cancel = true; 
     } 
 }

(0)

相关推荐

  • C# WinForm制作异形窗体与控件的方法

    本文实例讲述了C# WinForm制作异形窗体与控件的方法.分享给大家供大家参考,具体如下: 制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件.生成region的方法有很多,最常用的就是从一幅图片生成,把该图片中的透明色部分"抠"掉,剩下的部分作为一个region.设置窗口或控件的region可以用SetWindowRgn API,不过.NET framework封装了这个操作,在C#中只要对窗口或控件的Region属性赋值就可以了.下面我就把我在

  • WinForm实现关闭按钮不可用或隐藏的方法

    本文实例演示了WinForm实现关闭按钮不可用或隐藏的方法,是C#应用程序开发中常见的功能,具体方法如下: 关键代码: /// <summary> /// </summary> private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParams { get { CreateParams _createParams = base.CreateParams; _createP

  • WinForm判断关闭事件来源于用户点击右上角“关闭”按钮的方法

    本文实例讲述了WinForm判断关闭事件来源于用户点击右上角"关闭"按钮的方法.分享给大家供大家参考.具体如下: protected override void WndProc(ref Message msg) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (msg.Msg == WM_SYSCOMMAND && ((int)msg.WParam == SC_CLOSE)) { /

  • C#中Winform窗体Form的关闭按钮变灰色的方法

    本文实例讲述了C#中Winform窗体Form的关闭按钮变灰色的方法,对C#程序设计有一定的借鉴价值,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: [ DllImport ( "USER32.DLL" ) ] public static extern int GetSystemMenu(int hwnd, int bRevert); [ DllImport ( "USER32.DLL" ) ] public static extern int Rem

  • WinForm中实现picturebox自适应图片大小的方法

    本文实例讲述了WinForm中实现picturebox自适应图片大小的方法.分享给大家供大家参考,具体如下: picturebox控件共有两种载入图片方式,分别为: pictureBox1.BackgroundImage = Image,pictureBox1.load(url) 为使加载的图片自使用控件尺寸,可以分别对pictureBox控件设置BackGroundImageLayout=Stretch,SizeMode=StretchImagewinform中picturebox自适应图片大

  • c# winform取消右上角关闭按钮的实现方法

    一种方法是可以在窗体的属性面板将窗体的 ControlBox属性设置为false,或者在窗体的构造函数中这样写: 复制代码 代码如下: public Form1() { InitializeComponent(); this.ControlBox = false;   // 设置不出现关闭按钮 } 不过这样做的话,会连同最小化和最大化按钮都给弄掉了,所以,如果你想只想让关闭按钮不起作用,然后保留最小化.最大化的话,就重写窗体的CreateParams方法: 复制代码 代码如下: //禁用窗体的关

  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法

    本文实例讲述了C# Winform实现捕获窗体最小化.最大化.关闭按钮事件的方法,主要是通过重写WndProc来实现的.分享给大家供大家参考.具体方法如下: 主要功能代码如下: const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const int SC_MINIMIZE = 0xF020; const int SC_MAXIMIZE = 0xF030; protected override void WndProc(ref

  • WinForm实现的图片拖拽与缩放功能示例

    本文实例讲述了WinForm实现的图片拖拽与缩放功能.分享给大家供大家参考,具体如下: 最近做项目的时候遇到上传施工平面布置图,查看,因为图片比较大,一般的显示器分辨率无法显示全,然后还需要放大看清楚图片里面的文字内容,所以需要用到图片的拖拽与缩放功能.这里整理下具体操作. 首先新建一个窗体,拖一个panel控件到窗体中,然后在拖一个pictureobx控件到panel中,然后在添加个上传图片的按钮: 具体代码: using System; using System.Collections.Ge

  • WinForm实现页面按钮定时隐藏功能

    本文实例讲述了WinForm实现页面按钮定时隐藏功能.分享给大家供大家参考,具体如下: 有时候在做程序时需要将页面上某一项显示出来,然后过一段时间后消失掉,这时可以通过timer定时来实现 private void Form1_Load(object sender, EventArgs e) { System.Timers.Timer t = new System.Timers.Timer(3000); t.Elapsed += new System.Timers.ElapsedEventHan

  • winform去掉右上角关闭按钮的方法

    一种方法是可以在窗体的属性面板将窗体的 ControlBox属性设置为false,或者在窗体的构造函数中这样写: 复制代码 代码如下: public Form1(){InitializeComponent();this.ControlBox = false;   // 设置不出现关闭按钮} 不过这样做的话,会连同最小化和最大化按钮都给弄掉了,所以,如果你想只想让关闭按钮不起作用,然后保留最小化.最大化的话,就重写窗体的CreateParams方法: 复制代码 代码如下: //禁用窗体的关闭按钮 

  • winform实现关闭按钮失效的两种方法

    本文实例讲述了winform实现关闭按钮失效的两种方法.分享给大家供大家参考.具体如下: 第一种: 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

随机推荐