消息

huamiaomiao 2009-10-26 12:04:01
win32 消息机制的理解。

是不是每个主窗口都有一个接收消息循环?
就是 while(1)
{
GetMessage(...)
}
这个消息循环可以接收 操作系统发送给这个主窗口或者该主窗口的所有子窗口的消息? 也就是子窗口都没有自己的消息循环了,而是主窗口接收消息,然后如果是子窗口的消息,主窗口会再把这个消息发送给子窗口的消息处理函数。

也就是对不同主窗口的消息分配是OS完成?

...全文
99 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2009-10-26
  • 打赏
  • 举报
回复
消息循环和分配机制
wltg2001 2009-10-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 toperray 的回复:]
是的,每个窗口都有。

[/Quote]
消息循环和并不是写在窗口中的,一般的Win32程序只有一个消息循环,这个消息循环并不是写在主窗口中啊,而是写在WinMain中.至于消息具体发给哪个窗口,消息结构中有接收它的窗口句柄,分配函数会将消息分配给相应的窗口.
用通俗的例子说明就是:有好几个窗口,相当于是办事的人,等在那儿.有一个调度员,也是就消息循环,调度员拿到消息,看一下消息相关的结构,发现是给A窗口,它就将消息给A窗口,A窗口的处理函数就开始工作.
feilinhe 2009-10-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zpf82118 的回复:]
投递消息的时候决定消息去向,并不是所有窗口都能接收到的
[/Quote]
恩,TranslateMessage函数用来把虚键消息翻译成字符消息并放到响应的消息队列里面,最后DispatchMessage函数把消息分发到相关的窗口过程然后窗口过程根据消息的类型对不同的消息进行相关的处理。
zpf82118 2009-10-26
  • 打赏
  • 举报
回复
投递消息的时候决定消息去向,并不是所有窗口都能接收到的
ToperRay 2009-10-26
  • 打赏
  • 举报
回复
是的,每个窗口都有。
这不是鸭头 2009-10-26
  • 打赏
  • 举报
回复
每个程序有一个死循环
strwolf 2009-10-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 huamiaomiao 的回复:]
谢谢大家的回答! 收益了。 是不是模态对话框就需要新的消息循环!?
[/Quote]

这个问题我前不久在学习<WINDOWS程序设计>一书时
我在调试和测试一个程序的时候有过亲身经历啊
后来也请教过高人

模式对话框要产生一个新的消息循环,这个时候旧的那个消息循环就没用了,这个新的消息循环会阻塞大部分调用窗口的消息,但象WM_PAINT这种消息(前辈给我解释说是UI相关的消息),对话框的消息循环会把消息派遣到调用窗口的处理函数,模式对话框一销毁,旧的那个消息循环又开始正常工作了
dirdirdir3 2009-10-26
  • 打赏
  • 举报
回复
消息是基于线程的,每个线程都有一个消息队列,线程只要调用了UI相关的函数(要有窗口)就会自动建立消息队列,工作线程的话是没有消息队列的。

[Quote=引用 10 楼 huamiaomiao 的回复:]
谢谢大家的回答! 收益了。 是不是模态对话框就需要新的消息循环!?
[/Quote]
模态的对话框只是切断了原来的消息循环,而在自己内部搞了个自己的消息循环。
strwolf 2009-10-26
  • 打赏
  • 举报
回复
补充下自己的说法 消息队列只是基于线程 并不是 一个线程必然对应一个消息队列 一个消息循环 具体一个线程有没有消息循环 还要看线程有没有窗口或者相关函数
huamiaomiao 2009-10-26
  • 打赏
  • 举报
回复
谢谢大家的回答! 收益了。 是不是模态对话框就需要新的消息循环!?
strwolf 2009-10-26
  • 打赏
  • 举报
回复
消息循环不基于窗口
消息队列是基于线程的 一个线程 一个消息循环 一个消息队列 一个线程可以有多个窗口
你用SDK写程序
你的消息循环是在WINMAIN中的对吧?
你用GetMessage(&msg,NULL,0,0)取得消息
msg中有一个HWND成员(窗口句柄,就是这个标识了你程序中的各个窗口)
DispatchMessage就通过这个HWND把消息派遣给对应窗口的消息处理函数
huamiaomiao 2009-10-26
  • 打赏
  • 举报
回复
按照我的问题的思路来回答好吗
kelvinche 2009-10-26
  • 打赏
  • 举报
回复
分几点来说明这个问题吧。
1. 这个循环叫做消息循环,它不是属于某个窗口的,而是属于某个程序的。
2. 在消息循环面前,所有的窗口都是平等的。
3. 每个程序一般情况下只有一个消息循环。
4. 每个程序都有自己的一条消息队列,顾名思义,队列由许多消息构成。
5. 消息循环通过GetMessage函数从队列取一条消息。
6. 通过DispatchMessage将消息发送给相应窗口。至于这条消息是应该发送给哪个窗口的,则由消息结构中的hWnd字段决定。DispatchMessage函数会调用MSG.hWnd这个窗口的消息处理函数,并把MSG结构里的各字段作为调用消息处理函数的参数。处理完之后DispatchMessage也就返回了,那么消息循环就会开始取下一条消息。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧