MFC UI对话框

发布于:2025-08-01 ⋅ 阅读:(18) ⋅ 点赞:(0)

对话框

模态对话框

​​阻塞父窗口​​,强制用户先处理对话框。关闭前父窗口无法响应事件。

创建

推荐:非指针方式(栈内存)

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() 中释放对象内存,避免泄漏。