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

推荐订阅源

博客园_首页
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
博客园 - 【当耐特】
博客园 - 叶小钗
量子位
博客园 - 聂微东
S
SegmentFault 最新的问题
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
宝玉的分享
宝玉的分享
小众软件
小众软件
罗磊的独立博客
有赞技术团队
有赞技术团队
Stack Overflow Blog
Stack Overflow Blog

博客园 - 晨光静默

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)动态库创建对话框,状态记得切换