zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

Winform事件 示例 关闭 按钮 触发 拦截
2023-06-13 09:15:16 时间

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

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

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

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

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

复制代码代码如下:

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

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

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。

下面一个简单例子:

复制代码代码如下:


 privatevoidForm2_FormClosing(objectsender,FormClosingEventArgse) 
 { 
    DialogResultresult=MessageBox.Show("你确定要关闭吗!","提示信息",MessageBoxButtons.OKCancel,MessageBoxIcon.Information); 
    if(result==DialogResult.OK) 
    { 
e.Cancel=false; //点击OK
    } 
    else
    { 
e.Cancel=true; 
    } 
 }