当前位置: 首页 > 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.lryc.cn/news/602032.html

相关文章:

  • puppeteer 系列模块的系统性、详细讲解
  • 使用JavaScript实现一个代办事项的小案例
  • 八大神经网络的区别
  • 【RH134 问答题】第 6 章 管理 SELinux 安全性
  • 计算机网络(基础篇)
  • 《零基础入门AI: 从轮廓查找到形态学变换(OpenCV图像预处理)》
  • 【深度学习新浪潮】基于文字生成3D城市景观的算法有哪些?
  • Leaflet 综合案例-聚类图层控制
  • Python快速入门(2025版):输入
  • 婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
  • C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)
  • 数值计算 | 图解基于龙格库塔法的微分方程计算与连续系统离散化(附Python实现)
  • C primer plus (第六版)第九章 编程练习第6题
  • 【Rust异步】async和await异步编程实战:高并发任务处理全解析
  • Java 排序
  • 股指期货周度想法
  • RWA 正当红,是 DeFi 的终点、拐点,还是新起点?
  • 【C++】手搓一个STL风格的vector容器
  • 7.DRF 过滤、排序、分页
  • 开发指南125-HTML DOM事件
  • 【Linux篇章】穿越数据迷雾:HTTPS构筑网络安全的量子级护盾,重塑数字信任帝国!
  • Kafka——请求是怎么被处理的?
  • 云原生MySQL Operator开发实战(三):高级特性与生产就绪功能
  • RabbitMQ+内网穿透远程访问教程:实现异地AMQP通信+Web管理
  • MongoDB索引及其原理
  • Java#包管理器来时的路
  • k8s的权限
  • Windows|CUDA和cuDNN下载和安装,默认安装在C盘和不安装在C盘的两种方法
  • C++ 中实现 `Task::WhenAll` 和 `Task::WhenAny` 的两种方案
  • Android启动时间优化大全