一句话记住区别:模态对话框不关掉它,父窗口动不了;非模态对话框开着也能操作其他窗口。
模态对话框(Modal)
使用场景:必须让用户立即处理的操作(如警告弹窗、登录框)。
实现步骤(3步搞定):
1)创建对话框资源:在资源视图中拖拽按钮、输入框等控件
2)添加对话框类:右键对话框 → 添加类(如 CMyModalDlg)
3)显示对话框:在父窗口按钮点击事件中写:
CMyModalDlg dlg;
dlg.DoModal(); // 核心代码!阻塞在这里直到对话框关闭
非模态对话框(Modeless)
使用场景:需要同时操作多个窗口(如工具箱、实时监控窗口)。
实现步骤(重点防内存泄漏!):
1)创建对话框资源:在资源视图中拖拽按钮、输入框等控件
2)添加对话框类(如 CMyModelessDlg)
3)在父窗口类中声明成员变量:
CMyModelessDlg* m_pDlg; // 必须用指针!
4)创建并显示对话框:
void CParentWnd::OnOpenDialog()
{
if (!m_pDlg) // 防止重复创建
{
m_pDlg = new CMyModelessDlg();
m_pDlg->Create(IDD_MY_DIALOG, this); // 创建 (IDD_MY_DIALOG,对话框资源ID)
m_pDlg->ShowWindow(SW_SHOW); // 显示
}
}
5)销毁对话框:
重写 PostNcDestroy:
virtual void PostNcDestroy() override; //CMyModelessDlg头文件
/////////////
void CMyModelessDlg::PostNcDestroy()
{
CDialogEx::PostNcDestroy();
delete this; // 删除自己
}
避坑指南
- 模态对话框不要用
new创建(自动销毁) - 非模态对话框必须用
new创建(防止栈对象提前销毁) - 非模态对话框关闭时,必须置空父窗口的指针(防止野指针)

2281

被折叠的 条评论
为什么被折叠?



