winform攔截關(guān)閉按鈕觸發(fā)的事件示例
用戶關(guān)閉軟件時(shí),軟件一般會(huì)給“是否確認(rèn)關(guān)閉”的提示。通常,我們把它寫在FormClosing 事件中,如果確定關(guān)閉,就關(guān)閉;否則把FormClosingEventArgs 的 Cancel 屬性設(shè)置為 true,就取消了該窗體的關(guān)閉。
如果該窗體是主窗體,我們想在該窗體關(guān)閉時(shí)關(guān)閉整個(gè)應(yīng)用程序,會(huì)遇到至少兩種情況:
(1)該窗體同時(shí)是啟動(dòng)窗體,即它是應(yīng)用程序中所有窗體的父類,則整個(gè)應(yīng)用程序會(huì)被關(guān)閉。
(2)如果該窗體不是啟動(dòng)窗體,比如我們做了一個(gè)歡迎窗體,則應(yīng)用程序中所有窗體的父類就是這個(gè)歡迎窗體了。這時(shí)該窗體的關(guān)閉并不會(huì)關(guān)閉整個(gè)應(yīng)用程序。我們需要再加入“Application.Exit()”這行代碼來(lái)退出應(yīng)用程序。但同時(shí)又有問(wèn)題了,父窗體的關(guān)閉又會(huì)給該窗體發(fā)送關(guān)閉事件,于是該事件又被調(diào)用一次,確認(rèn)對(duì)話框又會(huì)彈出第二次。解決方法是用下面的代碼:
注:做歡迎體界面可以在主窗體中,ShowDialog方法打開歡迎界面,而不是把歡迎界面作為啟動(dòng)窗體。下面的方法僅有理論意義。
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)
{
//捕捉關(guān)閉窗體消息
//用戶點(diǎn)擊關(guān)閉窗體控制按鈕 注釋為最小化窗體
//this.WindowState = FormWindowState.Minimized;
//窗體隱藏
this.Hide();
return;
}
base.WndProc(ref m);
}
C# 窗體關(guān)閉時(shí)可以觸發(fā)的事件
FormClosing :在窗體關(guān)閉時(shí),F(xiàn)ormClosing 事件發(fā)生。窗體關(guān)閉時(shí),此事件會(huì)得到處理,從而釋放與此窗體關(guān)聯(lián)的所有資源。如果取消此事件,則該窗體保持打開狀態(tài)。若要取消窗體的關(guān)閉操作,請(qǐng)將傳遞給事件處理程序的 FormClosingEventArgs 的 Cancel 屬性設(shè)置為 true。
FormClosed:在用戶或 Application 類的 Close 方法或 Exit 方法關(guān)閉窗體后,會(huì)發(fā)生 FormClosed 事件。若要防止窗體關(guān)閉,請(qǐng)?zhí)幚?FormClosing 事件,并將傳遞給事件處理程序的 CancelEventArgs 的 Cancel 屬性設(shè)置為 true。可以使用此事件執(zhí)行一些任務(wù),如釋放窗體使用的資源,還可使用此事件保存輸入窗體中的信息或更新其父窗體。
當(dāng)窗體顯示為模式對(duì)話框時(shí),單擊“關(guān)閉”按鈕(窗體右上角帶 X 的按鈕)會(huì)隱藏窗體并將 DialogResult 屬性設(shè)置為 DialogResult.Cancel。通過(guò)在窗體的 FormClosing 事件的事件處理程序中設(shè)置 DialogResult 屬性,可以在用戶單擊“關(guān)閉”按鈕時(shí)重寫分配給 DialogResult 屬性的值。
注意
在顯示為無(wú)模式窗口的 Form 上調(diào)用 Close 方法時(shí),不能調(diào)用 Show 方法使窗體可見,因?yàn)榇绑w的資源已被釋放。若要隱藏窗體然后又使其可見,請(qǐng)使用 Hide 方法。
如果窗體是多文檔界面 (MDI) 父窗體,則在引發(fā) MDI 父窗體的 FormClosing 事件之前將引發(fā)所有 MDI 子窗體的 FormClosing 事件。同樣,在引發(fā) MDI 父窗體的 FormClosed 事件之前,將引發(fā)所有 MDI 子窗體的 FormClosed 事件。取消 MDI 子窗體的 FormClosing 事件不能防止引發(fā) MDI 父窗體的 FormClosing 事件。但是,取消該事件會(huì)將作為參數(shù)傳遞給父窗體的 FormClosingEventArgs 類的 Cancel 屬性設(shè)置成 false。要強(qiáng)制關(guān)閉所有 MDI 父窗體和子窗體,請(qǐng)將 MDI 父窗體中的 Cancel 屬性設(shè)置成 false。
下面一個(gè)簡(jiǎn)單例子:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("你確定要關(guān)閉嗎!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (result == DialogResult.OK)
{
e.Cancel = false; //點(diǎn)擊OK
}
else
{
e.Cancel = true;
}
}
- WinForm實(shí)現(xiàn)關(guān)閉按鈕不可用或隱藏的方法
- WinForm判斷關(guān)閉事件來(lái)源于用戶點(diǎn)擊右上角“關(guān)閉”按鈕的方法
- winform實(shí)現(xiàn)關(guān)閉按鈕失效的兩種方法
- C#中Winform窗體Form的關(guān)閉按鈕變灰色的方法
- C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法
- winform去掉右上角關(guān)閉按鈕的方法
- c# winform取消右上角關(guān)閉按鈕的實(shí)現(xiàn)方法
- WinForm實(shí)現(xiàn)的圖片拖拽與縮放功能示例
- WinForm中實(shí)現(xiàn)picturebox自適應(yīng)圖片大小的方法
- C# WinForm制作異形窗體與控件的方法
- WinForm實(shí)現(xiàn)頁(yè)面按鈕定時(shí)隱藏功能
相關(guān)文章
關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常詳解
這篇文章主要給大家介紹了關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04利用FlubuCore用C#來(lái)寫DevOps腳本的方法詳解
這篇文章主要介紹了利用FlubuCore用C#來(lái)寫DevOps腳本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07C#的FileSystemWatcher用法實(shí)例詳解
這篇文章主要介紹了C#的FileSystemWatcher用法,以實(shí)例形似詳細(xì)分析了FileSystemWatcher控件主要功能,并總結(jié)了FileSystemWatcher控件使用的技巧,需要的朋友可以參考下2014-11-11服務(wù)器端C#實(shí)現(xiàn)的CSS解析器
服務(wù)器端C#實(shí)現(xiàn)的CSS解析器2008-09-09測(cè)試框架nunit之a(chǎn)ssertion斷言使用詳解
NUnit是.Net平臺(tái)的測(cè)試框架,廣泛用于.Net平臺(tái)的單元測(cè)試和回歸測(cè)試中,下面我們用示例詳細(xì)學(xué)習(xí)一下他的使用方法2014-01-01