没有合适的资源?快使用搜索试试~ 我知道了~
首页消息循环与消息泵(mfc消息循环机制详解)
消息循环与消息泵(mfc消息循环机制详解)
需积分: 49 30 下载量 62 浏览量
更新于2023-03-03
评论
收藏 74KB DOC 举报
消息循环与消息泵(mfc消息循环机制详解),详细介绍mfc消息循环机理,个人觉得的很经典(有本人评点及注释),非常值得一下!
资源详情
资源评论
资源推荐
深入探讨 消息循环和消息泵(转载)
2009-03-03 20:52
作者:周焱
首先,应该清楚 MFC 的消息循环(::GetMessage,::PeekMessage),消
息泵(CWinThread::PumpMessage)和 MFC 的消息在窗口之间的路由
是两件不同的事情。在 MFC 的应用程序中(应用程序类基于 CWinThread
继承),必须要有一个消息循环,他的作用是从应用程序的消息队列中读取消
息,并把它派送出去(::DispatchMessage)。而消息路由是指消息派送出
去之后,系统(USER32.DLL)把消息投递到哪个窗口,以及以后消息在窗口
之间的传递是怎样的。
消息分为队列消息进入线程的消息队列和非队列消息不进入线程的消息队
列。对于队列消息,最常见的是鼠标和键盘触发的消息,例如
等消息;还有例如:
、 和 。当鼠标、键盘事件被触发后,相应
的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消
息队列,由 系统负责把消息加入到相应线程的消息队列中,于是就
有了消息循环从消息队列中读取并派送消息。还有一种是非队列消息,他绕
过系统队列和消息队列,直接将消息发送到窗口过程。例如当用户激活一个窗
口系统发送 。创
建窗口时发送 消息。在后面你将看到, 这么设计是很有道理
的,以及他的整套实现机制。
这里讲述 的消息循环,消息泵。先看看程序启动时,怎么进入消息循环
的:
_tWinMain ->AfxWinMainAfxWinInit -
>CWinThread::InitApplication ->CWinThread::InitInstance
CWinThread::Run (有模对话框不会运行 run)
非对话框程序的消息循环的事情都从这 !" 的一 # 开始$$$
那非对话框消息循环呢??
第一部分:非对话框程序的消息循环机制。
%%& !'!"$'((
%%)!#*!#&"#&+& !"",&
& !"--#
.
/0& 1
%%2!&!'3*& "+"&)"&&"
4/5+"61
/7++"#&681
%%'9#!"(&' )"*"#&+)"*"
!"'":"$
2!11
.
%%( ";-' "'3&""2"'+"!3
+"5+"<<=::PeekMessage<))*#!//////
.
>>%%'+++" +"5+"&&"
>>2=+"++"#&??
>>>5+"6/1%%#)"@+"@&&"%%如果不为空闲了…
A
%%( "B-(#)()"*" +":+5+"
.
>>%%(#)()"*"5#&9#&
>>2=#)("*"%%执行 (#)()"*"()并由其返回值确定是否
有消息
>>>!"&#!,&&'"1
>>%%!""&@+"@&&"2&"!(#)(*@!)+@)"*"
>>2+""*"<))*#!
>>.
>>>5+"61
>>>++"#&681
>>A
A +"--""3"*"<))*#!//////
1
A>>>%%无限循环,退出条件是收到 消息(""3"*" 实际上只
是起到监视作用,并不取消息?)。
/1%%&!"' 5+"
A
这是一个无限循环,他的退出条件是收到 消息:
2=#)("*"
>>>!"&#!,&&'"1
在 PumpMessage 中,如果收到 WM_QUIT 消息,那么返回 FALSE,所以
ExitInstance()函数执行,跳出循环,返回程序的退出代码。所以,一个程
序要退出,只用在代码中调用函数
0PostQuitMessage&,&"。指定退出代码 ,&" 就
可以退出程序。
下面讨论一下这个函数 # 的流程,分两步:
;第一个内循环 ( ";。bIdle 代表程序是否空闲。他的意思就是,如果程
序是空闲并且消息队列中没有要处理的消息,那么调用虚函数 OnIdle 进行空
闲处理。在这个处理中将更新 界面比如工具栏按钮的 "5+" 和 5+"
状态,删除临时对象比如用 FromHandle 得到的对象指针。由于这个原
因,在函数之间传递由 FromHandle 得到的对象指针是不安全的,因为他没
有持久性。+" 是可以重载的,你可以重载他并返回 使消息循环继
续处于空闲状态。
: 用临时对象是出于效率上的考虑,使内存有效利用,并能够在空闲
时自动撤销资源。关于由句柄转换成对象,可以有若干种方法。一般是先申明
一个对象 5C然后使用 5C$&&&' 来和一个句柄绑定。这样产生的对象是永
久的,你必须用 obj.Detach 来释放对象。
B,第二个内循环 ( "B。在这个循环内先启动消息泵#)("*"如
果不是 消息,消息泵将消息发送出去--0(&' "*"。消息
的目的地是消息结构中的 hwnd 字段所对应的窗口。
%%& !'!"$'((
4/ !"--#)("*"
.
/0& 1
%%如果是 就退出函数!"&#!/,这将导致程序结束$
2=--GetMessage<))*#!//////.
D2"2047
>>22,!'"+*<&!'"((*
>>>8@ !"--#)("*""'":"$E@1
>>)05+"#)(#&??1%%((+'&)#&"
>>>%%&"-(!":"&'++*)"*"+(& *F,&&'"F
>>>%%++":"!5""'!")"&"
D"2
>>!"&#!/1
剩余14页未读,继续阅读
y005091515
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0