MFC模态对话框的消息循环

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

MFC模态对话框的消息循环

单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作?

当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态,但实事上父窗口是可以正常响应能接收到的消息的,比如计时器传来的WM_TIMER 及系统托盘菜单传回来的WM_COMMAND。

之前的消息循环无法返回是正确的,但模态对话框并不意味着死循环,实事上,它在做另一个消息循环。

AfxInternalPumpMessage() 里面就是一个消息泵,包括消息的获取与分发:


只要有消息循环存在线程内的所有窗口就会活过来。不管弹出多少个模态对话框,线程内始终有一个消息循环为所以的窗口服务。

 

但这种形式带来的那一个问题就是,如何关闭所有模态对话框并退出程序?

如果简单地有EndDialog来关闭对话框,是无法让所有的消息循环返回的。有一种做法是使用PostQuitMessage,使当前的消息循环退出,消息循环收到WM_QUIT后,不当退出本次循环,还会给线程消息队列Post另一个QUIT 消息,这样消息循环就接二连三挨个退出了。

int CWnd::RunModalLoop(DWORD dwFlags)中的代码片段可以说明这点:


MFC模态与非模态对话框:从消息循环到实战避坑指南 对话框是Windows桌面应用开发中的基础UI组件,其核心在于消息处理机制。模态对话框通过启动独立的消息循环,阻塞父窗口交互,确保任务流的连续性;非模态对话框则共享主消息循环,支持并行操作。理解这两种模式的底层原理,对于构建健壮、符合用户预期的界面至关重要。在MFC框架中,这直接关系到资源管理、数据同步和线程安全。实际开发中,错误使用非模态对话框可能导致界面卡死、数据不同步等隐蔽问题。本文基于MFC开发实践,深入剖析模态与非模态对话框从创建、消息处理到销毁的全流程,并提供内存泄漏、数据交换等常见陷阱的解决方 阅读详情

相关推荐

MFC模态与非模态对话框:从消息循环到实战选择的完整指南

在Windows桌面应用开发中,对话框是用户交互的核心组件,其实现方式直接影响程序的流程控制与用户体验。从技术原理上讲,对话框的两种主要类型——模态与非模态——本质区别在于对Windows消息循环机制的不同运用。模态对话框通过创建独立的消息泵,暂时挂起主窗口的消息队列,实现同步阻塞式交互,适用于需要强制用户完成当前任务的场景,如登录认证或关键参数设置。非模态对话框则共享应用程序的主消息循环,允许与主窗口并行操作,支持异步协作,常用于需要持续参考的辅助界面,如工具箱或属性面板。理解这两种模式背后的消息循环机制

weixin_28839549的博客 218

DialogBoxParam函数测试例子

使用vs2008 工程创建一个对话框工程,点击按钮,会使用DialogBoxParam函数创建另一个对话框,如果在编辑框里输入的不是1111则这个对话框不退出,如果输入的是1111则这个对话框退出,

MFC模态对话框详解

模态对话框 在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入 非模态对话框:各窗口之间不影响主要区别:非模态对话框与APP共用消息循环,不会独占用户。 模态对话框独占用户输入,其他界面无法响应在用户层的主要逻辑如下: TestDlg dlg;if (dlg.DoModal() == IDOK) {

KFPA的博客 5203

VC++ 消息循环 Run函数 PumpMessage函数 AfxInternalPumpMessage函数

至此,注册窗口类、创建窗口、显示和更新窗口的工作都已完成,就该进入消息循环了。CWinThread类的Run函数就是完成消息循环这一任务的,该函数是在AfxWinMain函数中调用的,调用形式如下(位于 AfxWinMain函数实现代码处)所示。 thrdcore.cpp: nResult = pThread->Run(); AfxWinMain函数(winmain.cpp): 连接:VC++MFC程序中的WinMain函数(四) AfxWinMain函数 AfxGetThread函数 .

当路danglu0010 1491

VC++ 窗口过程函数 MFC程序的整个运行机制

窗口过程函数 现在已经进入了消息循环,那么 MFC 程序是否也把消息路由给一个窗口过程函数去处理呢? 看看AfxEndDeferRegisterClass函数的源程序,其中有这样一句代码: 连接:VC++MFC框架窗口(一)AfxEndDeferRegisterClass AfxRegisterClass PreCreateWindow AfxDeferRegisterClass wndcls.lpfnWndProc = DefWindowProc; 这行代码的作用就是设置窗口过程函数,这

当路danglu0010 1469

模式对话框与非模式对话框的区别

模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持,弹出技术支持信息,现在再对系统属性窗口进行操作就操作不了,这种叫做模式对话框;关闭技术支持信息,在系统属性里选择硬件,点击设备管理器,弹出设备管理器窗口,现在再对系统属性窗口进行操作仍然可以操作,这种就叫做非模式对话框。 在

Sharing_Li的专栏 1586

谈非模态窗口的销毁过程

模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别 先看一下MSDN的原文:When   you   implement   a   modeless   dialog   box,   always   override   the   OnCancel   member   function   and   call   DestroyWindow   from   wi

面朝大海 春暖花开 984

MFC中的模态对话框与非模态对话框消息循环消息传递问题(都可以通过SendMessage传递消息)

C++

u011555996的博客 2771

MFC模态模式对话框,MessageBox消息循环原理,定时器TIMER消息响应处理函数重入

2020.10 一、MessageBox和定时器TIMER MessageBox是Win32 API全局函数,必须指定标题和样式。共有4个参数。没有父窗口就NULL。返回值是int,看选什么按钮。 比如:MessageBox( NULL, "选什么?", "标题", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2); ::表示全局函数。 在MFC中,可使用全局API函数::MessageBox(NULL,………),子程序会被暂时中断在这个Messag..

wxlfreewind的专栏 2030

MFC模态对话框与非模态对话框

对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。 一,模态与非模态对话框 1.模态对话框     一个模态对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框时指定WS_POPUP,WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME风格。即使没有指定WS_VISIBLE风格,模 式对话框也会被显示。创建对话框

hsqaihkl的专栏 2719

多线程3:MFC中用户界面线程的相关操作

多线程3:MFC中用户界面线程的相关操作。

qq_59940419的博客 1538

VC 模式对话框和非模式对话框的创建,销毁和区别

在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的。而非模式对话框则是利用CreateWindow来创建的。在MFC或是WTL中,模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。模式对话框创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作。而非模式对话框则无需这样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作。 Create的Dialog一般是modalless,如果你的程序本身就是只有一个Dialog,就无所谓了

mycaibo编程 6219

MFC对话框进阶:模态与非模态对话框的底层原理与最佳实践

本文深入探讨MFC框架中模态与非模态对话框的底层原理与最佳实践,详细解析了VS2019环境下对话框的创建、显示机制及性能优化策略。通过对比两种对话框消息循环、线程模型和生命周期管理,帮助开发者掌握高效实现用户交互的关键技术,提升Windows桌面应用开发水平。

weixin_27734811的博客 371

mfc关闭模态dialog的正确方式

模态对话框中: 正常的用户触发的OnOK 、OnCancel消息都是通过调用函数EndDialog去关闭模态对话框的,EndDialog函数并不立即清除对话框。而是设置一个标志,并且允许对话框应用程序把控制权返回系统。系统在试图从应用程序队列检索下一个消息之前检测标志。如果已经设置了标志则系统中止消息循环,清除对话框,所以当我们想在代码中去调用EndDialog函数去结束对话框,最后再释放对话

yangyihongyangjiying的专栏 1万+

分析:由 XToolTip类 联想到 WTL (MFC) 消息循环

这篇文章从一个问题出发:我想自己写一个XToolTip类。   XToolTip类的思路: 1,创建一个WS_POPUP样式的窗口; 2,加入需要显示tooltip的控件(XToolTip类采用map来保存这些控件句柄和提示字符串); 3,在PreTranslateMessage中调用XToolTip的RelayMsg函数; 4,在RelayMsg函数中过滤消息(WM_MOUSEMOV

周洁伦之谜_相信我 2174

[MFC]DlgDemo2程序:非模态对话框的基本应用

1. 非模态对话框的创建方法以及和模态对话框的不同之处:     1) 首先是创建非模态对话框使用的是CDialog::Create而不是CDialog::DoModal;     2) 那么最大的问题就来了,Create是从CWnd继承而来的用来创建普通窗口用的函数,这就导致了关闭对话框时和模态对话框的大不相同!!     3) 由于使用Create创建对话框窗口了,因此关闭它就也要和关闭

Lirx_Tech的专栏 1737

PreTranslateMessage中有调用模态对话框的解决方法

原文:https://blog.csdn.net/guoguojune/article/details/45332511 dlg.DoModal()截住了界面消息,所以返回时原来的pMsg的内容已经更改了,消息,窗口句柄都不在是if以前的值了, 而且窗口句柄应该是对话框里的子窗口的句柄,所以调用CFrameWnd::PreTranslateMessage(pMsg); 时...

weixin_30823001的博客 223

MFC DLL窗口自动化显示指南:从注入到消息循环处理的完整避坑方案

本文提供了一套完整的MFC DLL窗口自动化显示与管理的避坑方案。针对远程注入场景,详细解析了如何通过创建独立UI线程、正确处理消息循环、配置MFC DLL工程以及实现安全卸载流程,确保DLL窗口在被注入的宿主进程中稳定、可控地显示和运行,避免窗口闪退和进程崩溃等常见问题。

tgb3456789的博客 999
上一篇: 绘制透明背景位图
下一篇: Windbg 查看MFC类重载虚函数
键盘上的疯兔
博客等级 码龄18年 134粉丝 119原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值