今天遇到了這么一個問題--在關(guān)閉對話框之后重新打開時,程序崩潰。開始的時候沒注意這是
一個非模式對話框,而非模式對話框時要求用戶自己關(guān)閉和銷毀。而且必須調(diào)用CWnd::DestroyWindow而不是Dialog::EndDialog來關(guān)閉非模態(tài)對話框。調(diào)用CWnd::DestroyWindow是直接刪除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函數(shù)均調(diào)用EndDialog,故程序員必須編寫自己的OnOK和OnCancel函數(shù)
并且在函數(shù)中調(diào)用DestroyWindow來關(guān)閉對話框。或者是截獲對話框的關(guān)閉消息WM_CLOSE,在消息響應(yīng)函數(shù)中來調(diào)用DestroyWindow函數(shù)。消息響應(yīng)的順序是:
首先響應(yīng)WM_CLOSE,調(diào)用DestroyWindow(),
DestroyWindow()又發(fā)送WM_DESTROY,
響應(yīng)WM_DESTROY,調(diào)用WM_QUIT,
GetMessage()發(fā)現(xiàn)WM_QUIT,退出程序。
下面介紹下三個關(guān)閉消息:
WM_CLOSE:
在系統(tǒng)菜單里選擇了“關(guān)閉”或者點擊了窗口右上角的“X”按鈕,你的窗口過程就會收到WM_CLOSE。DefWindowProc對WM_CLOSE的處理是調(diào)用DestroyWindow。當然,你可以不讓DefWindowProc處理,而是自己處理,例如詢問用戶是否保存更改等。如果用戶選擇“取消”,
你忽略此消息,那么程序照常運行;如果用戶確認要退出,你就調(diào)用DestroyWindow。
WM_DESTROY:
接下來,DestroyWindow完成窗口的清理工作,最后像窗口過程發(fā)送WM_DESTROY。對于 WM_DESTROY,DefWindowProc不會處理。也就是說,你如果不處理這個消息,雖然你的窗口
已經(jīng)銷毀,但進程并不會結(jié)束。一般處理 WM_DESTROY時都是釋放資源(例如申請的內(nèi)存等),
然后調(diào)用PostQuitMessage。
WM_QUIT:
PostQuitMessage會發(fā)送WM_QUIT給消息隊列。注意,WM_QUIT永遠不會到達窗口過程,
因為GetMessage得到WM_QUIT后就會返回FALSE,從而結(jié)束消息循環(huán),最后進程結(jié)束,程序退出。
假設(shè)使用者執(zhí)行HELLOWIN,并且使用者最終單擊了 Close按鈕,或者假設(shè)用鍵盤或鼠標從系統(tǒng)菜單中選擇了Close,DefWindowProc處理這一鍵盤或者鼠標輸入,在檢測到使用者選擇了Close選項之后,它給窗口消息處理程序發(fā)送一條WM_SYSCOMMAND消息。WndProc將這個消息
傳給DefWindowProc。 DefWindowProc給窗口消息處理程序發(fā)送一條WM_CLOSE消息來響應(yīng)之。WndProc再次將它傳給DefWindowProc。 DestroyWindow呼叫DestroyWindow來響應(yīng)這條WM_CLOSE消息。DestroyWindow導(dǎo)致Windows給窗口消息處理程序發(fā)送一條WM_DESTROY消息。WndProc再呼叫PostQuitMessage,將一條WM_QUIT消息放入消息隊列中,以此來響應(yīng)此消息。這個消息導(dǎo)致WinMain中的消息循環(huán)終止,然后程序結(jié)束。
函數(shù)DestroyWindow聲明如下:
WINUSERAPI BOOL WINAPI DestroyWindow(__in HWND hWnd);
hWnd是要刪除的窗口句柄。
注:使用DialgBox建立的對話框是“模式對話框”,只有關(guān)閉對話框后,程序的其他窗口才能進行
操作。與此相對應(yīng),存在“非模式對話框”,對話框建立后,并不強制要求用戶立即反應(yīng),而是與其他窗口同時接受用戶操作。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。