文章目錄
- 對話框
- 模態對話框
- 創建
- 銷毀
- 關閉
- CDialog::OnCancel()
- EndDialog()
- CDialog::DestroyWindow()
- 非模態對話框
- 創建
- 銷毀
- 關閉
- delete this
對話框
模態對話框
??阻塞父窗口??,強制用戶先處理對話框。關閉前父窗口無法響應事件。
創建
推薦:非指針方式(棧內存)
CMyDialog dlg;
dlg.DoModal();
銷毀
對象在函數結束時自動銷毀(棧內存自動回收)。
調用OnOK()
或OnCancel()
后,MFC自動觸發EndDialog()
并銷毀窗口。
關閉
用戶點擊標題欄關閉按鈕(“X”)或 代碼調用SendMessage(WM_CLOSE)
=》系統發送 WM_CLOSE
消息 =》觸發CDialog::OnClose()
=》CDialog::OnCancel()
CDialog::OnCancel()
=》 EndDialog(IDCANCEL)
關閉??對話框 =》CDialog::DestroyWindow()
銷毀窗口資源 =》向系統發送 WM_DESTROY 消息
=》CDialog::OnDestroy()
釋放動態資源(如內存、句柄)=》 CWnd::OnDestroy()
=》PostNcDestroy()
EndDialog()
EndDialog(IDCANCEL)
關閉??對話框。僅隱藏窗口。不立即銷毀窗口。結束模態消息循環(RunModalLoop),使 DoModal()返回。IDCANCEL會作為DoModal()的返回值。
CDialog::DestroyWindow()
銷毀窗口資源。銷毀窗口句柄(HWND)。但 CDialog 對象仍存在(需手動 delete)???
非模態對話框
與父窗口??獨立存在??,可同時交互。
創建
要求:使用指針方式(堆內存)。
CMyDialog* pDlg = new CMyDialog;
pDlg->Create(IDD_DIALOG_ID, this);
pDlg->ShowWindow(SW_SHOW);
銷毀
由程序員顯式控制,需手動delete。
必須重寫??OnCancel()
,以調用 DestroyWindow()
關閉窗口, 并配合 PostNcDestroy()
中調用 delete this
刪除對象,才能安全銷毀窗口和對象。
void CMyDialog::OnCancel() {DestroyWindow(); // 銷毀窗口,而非隱藏
}void CMyDialog::PostNcDestroy() {CDialog::PostNcDestroy();delete this; // 釋放堆內存
}
vs 模態對話框:不調用EndDialog()。
關閉
用戶點擊標題欄關閉按鈕(“X”)或 代碼調用SendMessage(WM_CLOSE)
=》系統發送 WM_CLOSE
消息 =》觸發CDialog::OnClose()
=》CDialog::OnCancel()
=》DestroyWindow()
銷毀窗口資源 =》向系統發送 WM_DESTROY 消息
=》OnNcDestroy
釋放動態資源(如內存、句柄) =》PostNcDestroy()
:delete this
delete this
在 PostNcDestroy()
中釋放對象內存,避免泄漏。