惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Apple Machine Learning Research
Apple Machine Learning Research
量子位
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
博客园 - 聂微东
博客园_首页
D
Docker
博客园 - 叶小钗
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
爱范儿
爱范儿
腾讯CDC
罗磊的独立博客
雷峰网
雷峰网
博客园 - Franky

博客园 - 晨光静默

centos 命令 curl用到的一些命令 nginx记录 html select qq作文 mfc开启控制台打印日记 mfc右键菜单(包括系统托盘菜单)弹窗后如何消失 angular单页应用点击button自动刷新页面 setTimeout中调用angular的作用域生效 c/c++元转分的bug c/c++中的崩溃代码片段 查看网络端口连接情况 win7x64安装python运行报错:api-ms-win-crt-runtime-|1-1-0.dll SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes qt导入头文件报错 python记录 (转)Curl命令详解 开箱即用的clogger 异步重叠IO linux xshell 命令上传下载文件 png转CBitmap
mfc模态对话框和非模态对话框注意点
晨光静默 · 2024-01-22 · via 博客园 - 晨光静默

1,非模态不是堵塞 最好用NEW对象或者一个全局变量

XxxDlg* dlg = NULL;
dlg = new XxxDlg(this);
dlg->Create(IDD_DIALOG_XXX);
dlg->ShowWindow(SW_SHOW);

2,模拟对话框是阻塞的

显示模式对话框:

CDialogDemo dlg; 

dlg.DoModal();

3,退出对话框

第一种:点X
OnClose()->OnCancel()->DestroyWindow()->OnDestroy()

第二种:按回车
OnOK()->DestroyWindow()–>OnDestroy()

第三种:按ESC
OnCancel()->DestroyWindow()–>OnDestroy()

4,注意点

1)OnCancel()和OnOK()内部调用的是EndDialog() 这个函数是针对销毁模态对话框调用的,如果是非模态对话框,要改成手动调用DestroyWindow() 

2)非模态对话框必须重载的函数就是PostNcDestroy,是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针

3)非模态对话框不手动调用DestroyWindow(),这个的时候 窗口也会消失 但是没有销毁 也就是还存在内存中,直到主窗口被关闭 才会响应该对话框的WM_DESTROY消息处理函数OnDestroy(即退出调用过程是:对话框构造-OnCancel-界面消息,直到主窗口关闭,ondestroy,印象没不会调用析构[只有手动destroywindow的消息delete this才会调用析构])

4)在一个模态对话框中,想要再创建一个对话框的情况:

4.1)创建的是模态对话框,会阻塞父对话框的消息不响应

4.2)通过发消息创建一个对话框,消息处理函数要尽快立即退出,否则主模态对话框会卡死

4.3)创建一个线程,线程里面用模态和非模态创建对话框均无法正常显示出来,只能线程发消息给主模态,主模态消息立即创建非模态窗口

4.4)动态库创建对话框,状态记得切换