winform拦截关闭按钮触发的事件示例
用户关闭软件时,软件一般会给“是否确认关闭”的提示。通常,我们把它写在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;
}
}
相关文章
- C#winForm窗体美化
- winform控件之BindingNavigator
- C# WinForm 界面控件
- .NetWInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
- WinForm自动完成控件实例代码简析
- winform壁纸工具为图片添加当前月的日历信息
- 深入C#winform清除由GDI绘制出来的所有线条或图形的解决方法
- C#中使用IrisSkin2.dll美化WinForm程序界面的方法
- WinForm项目开发中Excel用法实例解析
- WinForm开发中屏蔽WebBrowser脚本错误提示的方法
- WinForm实现基于BindingSource的方法扩展
- C#采用Winform实现类似Android的Listener
- WinForm的延时加载控件概述