MFC UI对话框
文章目录
- 对话框
- 模态对话框
- 创建
- 销毁
- 关闭
- 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()
中释放对象内存,避免泄漏。