当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/302717.html

相关文章:

  • 基于Uniapp及Spring Boot的奢侈品二手交易平台的设计与实现/基于微信小程序的二手交易系统
  • 零基础学习性能测试第九章:全链路追踪-系统中间件节点监控
  • 【pytest高阶】源码的走读方法及插件hook
  • Ubuntu lamp
  • 商用车的自动驾驶应用场景主要包括七大领域
  • 十七、K8s 可观测性:全链路追踪
  • AI对服务器行业的冲击与启示:从挑战走向重构
  • vue3【组件封装】头像裁剪 S-avatar.vue
  • 谋先飞(Motphys)亮相 2025 世界人工智能大会:以物理仿真重构智能未来
  • Apache Commons VFS:Java内存虚拟文件系统,屏蔽不同IO细节
  • YOLOv11改进:添加SCConv空间和通道重构卷积二次创新C3k2
  • Error reading config file (/home/ansible.cfg): ‘ACTION_WARNINGS(default) = True
  • 如何理解有符号数在计算机中用​​补码​​存储
  • 网络安全第14集
  • C51:使用PWM波调节LED灯的亮度
  • GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【三】
  • 如何检测并修复服务器中的rootkit威胁
  • 中型企业如何用 RUM 技术破解地理分布式用户体验难题?从指标监测到优化实操
  • 暴雨服务器更懂人工智能+
  • Jetson Orin nx识别不到imx219 需要额外设置
  • [ The Missing Semester of Your CS Education ] 学习笔记 Vim篇
  • 4.DRF 认证--Authentication4.DRF 认证--Authentication
  • 从文件到文件描述符:理解程序与文件的交互本质
  • TapData 出席 TDBC 2025 可信数据库发展大会,分享“实时+信创”时代的数据基础设施演进路径
  • Kylin10 安装tomcat9
  • Centos 7 命令:ip addr
  • 黑马商城微服务-下
  • 【QT搭建opencv环境】
  • R 语言科研绘图 --- 其他绘图-汇总1
  • Language Models are Few-Shot Learners: 开箱即用的GPT-3(四)