EndDialog和CDialog::OnOK()
生活随笔
收集整理的這篇文章主要介紹了
EndDialog和CDialog::OnOK()
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
第一,OnOK()和OnCancel()是CDialog基類的成員函數(shù),而OnClose()和OnDestroy()是CWnd基類的成員函數(shù),即WM消息響應(yīng)函數(shù)。從應(yīng)用程序結(jié)構(gòu)的角度,拿對(duì)話框來說,紅色的X對(duì)應(yīng)的是CWnd,而處于對(duì)話框中的“確定”、“取消”按鈕則對(duì)應(yīng)了CDialog。
第二,OnClose()和OnDestroy()
在單視圖程序中,根據(jù)<<深入淺出MFC>>所講,程序退出時(shí)執(zhí)行的操作順序?yàn)?從點(diǎn)X按鈕開始)
(1)用戶點(diǎn)擊X退出按鈕,發(fā)送了WM_CLOSE消息----->響應(yīng)OnClose()
(2)在WM_CLOSE消息的處理函數(shù)中,調(diào)用DestroyWindow()----->銷毀與指定CWnd窗口對(duì)象關(guān)聯(lián)的窗口,但未銷毀CWnd對(duì)象
(3)在DestroyWindow()中發(fā)送了WM_DESTROY消息----->窗口銷毀后響應(yīng)OnDestroy()
(4)在WM_DESTROY消息中調(diào)用PostQuitMessage(),發(fā)送WM_QUIT消息,結(jié)束消息循環(huán)
可以看到,程序的退出過程,是先響應(yīng)OnClose(),然后響應(yīng)OnDestroy(),在響應(yīng)OnDestroy()之前,窗口對(duì)象已經(jīng)被銷毀。OnDestroy()到底干了什么呢?它就像一個(gè)teller,先通知CWnd對(duì)象告訴它即將被銷毀,爾后OnDestroy的真正運(yùn)行是在CWnd對(duì)象已經(jīng)從屏幕上清除以后被調(diào)用的。
第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()
CDialog::OnOK首先調(diào)用UpdateData(TRUE)將數(shù)據(jù)傳給對(duì)話框成員變量,然后調(diào)用CDialog::EndDialog關(guān)閉對(duì)話框;
CDialog::OnCancel只調(diào)用CDialog::EndDialog關(guān)閉對(duì)話框;
OnClose()是響應(yīng) WM_CLOSE 的.一定程度上可以說CDialog::EndDialog()和OnClose()完成類似的工作,但處理的機(jī)制不一樣,前者是CDialog的對(duì)象機(jī)制,后者是WM的消息映射機(jī)制。
CDialog::EndDialog()-------->OnDestroy()
OnClose()-------->OnDestroy()
EndDialog()和OnClose()屬于“同級(jí)別”的,所以我們?cè)诎聪翺K按鈕的時(shí)候,程序是不會(huì)執(zhí)行OnClose()的,但兩種機(jī)制都必須經(jīng)過OnDestroy()
然后發(fā)現(xiàn)
下面這兩種說法不明晰
(1) EndDialog(-1);
關(guān)閉模態(tài)對(duì)話框,并且將參數(shù)作為父對(duì)話框調(diào)用的返回值。
(2) DestroyWindow(); ::PostQuitMessage(0);
DestroyWindow 關(guān)閉非模態(tài)對(duì)話框。 退出消息循環(huán),真正結(jié)束進(jìn)程。有不少程序窗口關(guān)閉,但是不等于退出運(yùn)行。
cDialog::onok(),enddialog(),destroywindow區(qū)別。 收藏
模式和無模式對(duì)話的中止是不一樣的:模式對(duì)話通過調(diào)用CDialog : : EndDialog 來中止,無模式對(duì)話則是調(diào)用CWnd: : DestroyWindow來中止的,函數(shù)CDialog : : OnOK和CDialog : : OnCancel調(diào)用EndDialog ,所以需要調(diào)用DestroyWindow并重置無模式對(duì)話的函數(shù)。
最后三個(gè)還不錯(cuò)
Windows API一日一練(18)EndDialog函數(shù) 收藏
上一次介紹了怎么樣顯示對(duì)話框的函數(shù),那么怎么樣關(guān)閉對(duì)話框呢?這就需要使用到函數(shù)EndDialog。這個(gè)函數(shù)只能在對(duì)話框的消息處理函數(shù)里使用,并且這個(gè)函數(shù)調(diào)用之后,沒有立即就刪除對(duì)話框的,而是設(shè)置了 操作系統(tǒng)里的結(jié)束標(biāo)志。當(dāng)操作系統(tǒng)查檢到有這個(gè)標(biāo)志時(shí),就去刪除對(duì)話框的消息循環(huán),同時(shí)也去釋放對(duì)話框占用的資源。其實(shí)對(duì)話框的生命周期是這樣的,先由函數(shù)DialogBox創(chuàng)建對(duì)話框,這樣函數(shù)DialogBox完成創(chuàng)建對(duì)話框但還沒有顯示前會(huì)發(fā)出消息WM_INITDIALOG,讓對(duì)話框有機(jī)會(huì)初始化上面所有窗口或控件的顯示,比如設(shè)置文本框的字符串等。最后當(dāng)用戶點(diǎn)出確定或者取消的按鈕,就收到兩個(gè)命令I(lǐng)DOK或IDCANCEL,這時(shí)就可以調(diào)用函數(shù)EndDialog來結(jié)束對(duì)話框的生命。
函數(shù)EndDialog聲明如下:
WINUSERAPI
BOOL
WINAPI
EndDialog(
__in HWND hDlg,
__in INT_PTR nResult);
hDlg是對(duì)話框窗口的句柄。
nResult是設(shè)置給函數(shù)DialogBox的返回值。
調(diào)用這個(gè)函數(shù)的例子如下:
#001 // 顯示關(guān)于對(duì)話框。
#002 //
#003 // 蔡軍生 2007/07/12
#004 //
#005 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
#006 {
#007 UNREFERENCED_PARAMETER(lParam);
#008 switch (message)
#009 {
#010 case WM_INITDIALOG:
#011 return (INT_PTR)TRUE;
#012
#013 case WM_COMMAND:
#014 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
#015 {
#016 EndDialog(hDlg, LOWORD(wParam));
#017 return (INT_PTR)TRUE;
#018 }
#019 break;
#020 }
#021 return (INT_PTR)FALSE;
#022 }
第16行就是調(diào)用函數(shù)EndDialog來關(guān)閉對(duì)話框。
第二,OnClose()和OnDestroy()
在單視圖程序中,根據(jù)<<深入淺出MFC>>所講,程序退出時(shí)執(zhí)行的操作順序?yàn)?從點(diǎn)X按鈕開始)
(1)用戶點(diǎn)擊X退出按鈕,發(fā)送了WM_CLOSE消息----->響應(yīng)OnClose()
(2)在WM_CLOSE消息的處理函數(shù)中,調(diào)用DestroyWindow()----->銷毀與指定CWnd窗口對(duì)象關(guān)聯(lián)的窗口,但未銷毀CWnd對(duì)象
(3)在DestroyWindow()中發(fā)送了WM_DESTROY消息----->窗口銷毀后響應(yīng)OnDestroy()
(4)在WM_DESTROY消息中調(diào)用PostQuitMessage(),發(fā)送WM_QUIT消息,結(jié)束消息循環(huán)
可以看到,程序的退出過程,是先響應(yīng)OnClose(),然后響應(yīng)OnDestroy(),在響應(yīng)OnDestroy()之前,窗口對(duì)象已經(jīng)被銷毀。OnDestroy()到底干了什么呢?它就像一個(gè)teller,先通知CWnd對(duì)象告訴它即將被銷毀,爾后OnDestroy的真正運(yùn)行是在CWnd對(duì)象已經(jīng)從屏幕上清除以后被調(diào)用的。
第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()
CDialog::OnOK首先調(diào)用UpdateData(TRUE)將數(shù)據(jù)傳給對(duì)話框成員變量,然后調(diào)用CDialog::EndDialog關(guān)閉對(duì)話框;
CDialog::OnCancel只調(diào)用CDialog::EndDialog關(guān)閉對(duì)話框;
OnClose()是響應(yīng) WM_CLOSE 的.一定程度上可以說CDialog::EndDialog()和OnClose()完成類似的工作,但處理的機(jī)制不一樣,前者是CDialog的對(duì)象機(jī)制,后者是WM的消息映射機(jī)制。
CDialog::EndDialog()-------->OnDestroy()
OnClose()-------->OnDestroy()
EndDialog()和OnClose()屬于“同級(jí)別”的,所以我們?cè)诎聪翺K按鈕的時(shí)候,程序是不會(huì)執(zhí)行OnClose()的,但兩種機(jī)制都必須經(jīng)過OnDestroy()
然后發(fā)現(xiàn)
下面這兩種說法不明晰
(1) EndDialog(-1);
關(guān)閉模態(tài)對(duì)話框,并且將參數(shù)作為父對(duì)話框調(diào)用的返回值。
(2) DestroyWindow(); ::PostQuitMessage(0);
DestroyWindow 關(guān)閉非模態(tài)對(duì)話框。 退出消息循環(huán),真正結(jié)束進(jìn)程。有不少程序窗口關(guān)閉,但是不等于退出運(yùn)行。
cDialog::onok(),enddialog(),destroywindow區(qū)別。 收藏
模式和無模式對(duì)話的中止是不一樣的:模式對(duì)話通過調(diào)用CDialog : : EndDialog 來中止,無模式對(duì)話則是調(diào)用CWnd: : DestroyWindow來中止的,函數(shù)CDialog : : OnOK和CDialog : : OnCancel調(diào)用EndDialog ,所以需要調(diào)用DestroyWindow并重置無模式對(duì)話的函數(shù)。
最后三個(gè)還不錯(cuò)
Windows API一日一練(18)EndDialog函數(shù) 收藏
上一次介紹了怎么樣顯示對(duì)話框的函數(shù),那么怎么樣關(guān)閉對(duì)話框呢?這就需要使用到函數(shù)EndDialog。這個(gè)函數(shù)只能在對(duì)話框的消息處理函數(shù)里使用,并且這個(gè)函數(shù)調(diào)用之后,沒有立即就刪除對(duì)話框的,而是設(shè)置了 操作系統(tǒng)里的結(jié)束標(biāo)志。當(dāng)操作系統(tǒng)查檢到有這個(gè)標(biāo)志時(shí),就去刪除對(duì)話框的消息循環(huán),同時(shí)也去釋放對(duì)話框占用的資源。其實(shí)對(duì)話框的生命周期是這樣的,先由函數(shù)DialogBox創(chuàng)建對(duì)話框,這樣函數(shù)DialogBox完成創(chuàng)建對(duì)話框但還沒有顯示前會(huì)發(fā)出消息WM_INITDIALOG,讓對(duì)話框有機(jī)會(huì)初始化上面所有窗口或控件的顯示,比如設(shè)置文本框的字符串等。最后當(dāng)用戶點(diǎn)出確定或者取消的按鈕,就收到兩個(gè)命令I(lǐng)DOK或IDCANCEL,這時(shí)就可以調(diào)用函數(shù)EndDialog來結(jié)束對(duì)話框的生命。
函數(shù)EndDialog聲明如下:
WINUSERAPI
BOOL
WINAPI
EndDialog(
__in HWND hDlg,
__in INT_PTR nResult);
hDlg是對(duì)話框窗口的句柄。
nResult是設(shè)置給函數(shù)DialogBox的返回值。
調(diào)用這個(gè)函數(shù)的例子如下:
#001 // 顯示關(guān)于對(duì)話框。
#002 //
#003 // 蔡軍生 2007/07/12
#004 //
#005 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
#006 {
#007 UNREFERENCED_PARAMETER(lParam);
#008 switch (message)
#009 {
#010 case WM_INITDIALOG:
#011 return (INT_PTR)TRUE;
#012
#013 case WM_COMMAND:
#014 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
#015 {
#016 EndDialog(hDlg, LOWORD(wParam));
#017 return (INT_PTR)TRUE;
#018 }
#019 break;
#020 }
#021 return (INT_PTR)FALSE;
#022 }
第16行就是調(diào)用函數(shù)EndDialog來關(guān)閉對(duì)話框。
總結(jié)
以上是生活随笔為你收集整理的EndDialog和CDialog::OnOK()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何更改CPropertySheet的背
- 下一篇: 怎么黑学校计算机室的电脑,大学计算机室变