Dispatchmessage()函数是干什么?

eyetiger 2002-04-23 10:14:02
书上说Dispatchmessage()函数将消息传送到指定窗口函数,它是调用wndproc函数,还是向windows发消息,由windows来调用wndprog呢?

当一个窗口有消息时,windows把消息发给这个窗口?也就是说调用wndproc函数,那为什么还要消息循环?
...全文
4793 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
eyetiger 2002-04-28
  • 打赏
  • 举报
回复
谢谢大家!

现在明白多了
DaNiao 2002-04-27
  • 打赏
  • 举报
回复
windows在进程的消息队列中有消息的时候会提高进程的优先级(不是你设置的那个,而是windows在调度的时候优先考虑你),在无消息的时候会降低你进程的优先级(前面说不会分配时间片,说得太绝对了点)
当然,在GetMessage()的时候来判断也是一种选择,但MS认为放在DispatchMessage里效率会更高一些
DaNiao 2002-04-27
  • 打赏
  • 举报
回复
DispatchMessage到底干了些什么,现在主要还是以道听途说为主
更详细的东西还是不太清楚,也许要等MS公开windows源码以后才能搞明白
DaNiao 2002-04-27
  • 打赏
  • 举报
回复
其实问题的关键在于DispatchMessage到底干了什么
如果只是去调用相应的窗口,那自己写个switch不就可以了
DispatchMessage与switch不同之处在于DispatchMessage会
先调用windows,进入管态(大概是range 0),然后再由windows调用
窗口的函数。
为什么这么麻烦?
因为这样windows就可以知道你的程序运行到什么情况了,
windows来调用你的窗口,这样你的窗口返回的时候windows就知道
你已经处理过一个消息了,如果没有新的消息进入消息队列
windows就不再会给你的进程分配时间片
如果是你自己写switch的话,windows就不可能这样灵活的分配时间
资源利用率就会降低
那么还要消息循环干什么,windows直接把消息发给窗口不就可以了吗?
因为你要在消息循环里把KEY_DOWN和KEY_UP组合成WM_CHAR,
还可以直接屏蔽掉许多对你来说无用的消息,加快速度

DispatchMessage这一套机制大概是windows里最难理解的部分了(除了COM以外)
blactte 2002-04-27
  • 打赏
  • 举报
回复
windows消息处理机制是这样的:
首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息
放到一个系统消息队列中去.
而应用程序需要有自己的消息队列,也就是线程消息队列,没一个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列.
winsows消息队列把得到的消息发送到线程消息队列,
线程消息队列每次取出一条消息发送到指定窗口,不断循环直到程序退出.这个循环就是靠消息环(while(GetMessage()) TranslateMessage();DispatchMessage(); 实现的.GetMessage()只是从线程消息中取出一条消息,而DispatchMessage
则把取出的消息发送到目的窗口.如果收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗口!
明白了吗?
freelybird 2002-04-27
  • 打赏
  • 举报
回复
简单一句话: DispatchMessage(&Msg)作用就是根据msg的内容调用WndProc
mldnking 2002-04-26
  • 打赏
  • 举报
回复
DispatchMessage(&Msg)
将消息传给在Msg结构中为窗口所制定的消息处理器
delphihero 2002-04-26
  • 打赏
  • 举报
回复
你用 DispatchMessage()把消息交给消息的窗体,而wndproc这个消息函数是由系统调用来处理你的窗体消息的,并不是你主动调用的。当然你也可以在GetMessage()循环里处理来,但这样很不规范,应为windows是多任务处理系统,所以你的函数应该由操作系统统一调用
HardLoveC 2002-04-23
  • 打赏
  • 举报
回复
callback是因为不仅是用户操作需要用到WndProc()函数,系统有时候也会调用你写的WndProc()函数。
cBeginner 2002-04-23
  • 打赏
  • 举报
回复
我喜欢这种关于API的讨论,尤其可以帮助一些win32 programming初学者,可惜这里关于讨论API的太少了,我正在看<<Windows 程序设计>>。
cBeginner 2002-04-23
  • 打赏
  • 举报
回复
max_welcome(愤怒的小马) 说道没错,我也是那么理解的。

callback函数的具体定义在<<Windows 程序设计>>里的第3章里好象有说,可以翻翻看。
max_welcome 2002-04-23
  • 打赏
  • 举报
回复
windows首先将消息存入系统堆栈,然后再放入应用程序的堆栈。
而应用程序一般有很多窗口,有不同的窗口过程,dispatch()函数就是将消息发送给不同的窗口过程函数
eyetiger 2002-04-23
  • 打赏
  • 举报
回复
我好像在哪看到过只有windows调用的函数才是callback呀?
eyetiger 2002-04-23
  • 打赏
  • 举报
回复
cBeginner(),neptunez();
windows是不是只把消息放在应用程序的message queue里面,没有发给具体的窗口
窗口利用自己的消息循环,来得到消息,然后调用wndproc处理
这样的话,wndproc不是可以用一个普通的成员函数替代,为什么要是
callback呢?
cBeginner 2002-04-23
  • 打赏
  • 举报
回复
帖主问的是DispatchMessage()。
neptunez 2002-04-23
  • 打赏
  • 举报
回复
你用鼠标点击窗口,鼠标移动等等等message,windows放到message queue里面。你的message loop是从queue上一个一个地把message取出来,用的事GetMessage()这个函数。DispatchMessage(&msg)把你的message传给wndproc这个函数并且运行这个函数。
cBeginner 2002-04-23
  • 打赏
  • 举报
回复
先向应用程序发消息,当应用程序接到消息后,然后它会把消息通过DispatchMessage(&msg)传递给窗口函数wndproc,窗口函数就会对照事先由程序编写好的消息对照表调用对应的方法来处理消息。

那为什么还要消息循环?是因为当用户在应用一个程序的时候会有不同的(多次)操作,比如按一个按钮,移动窗口,改变窗口大小,等等。如果没有消息循环的话,就只能接收一条(一次)消息,这是错误的。
eyetiger 2002-04-23
  • 打赏
  • 举报
回复
为什么没人帮我呀?

70,036

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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