CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

Dispatchmessage()函数是干什么?

楼主eyetiger(完了,完了,这次真的完了)2002-04-23 10:14:02 在 C/C++ / C语言 提问

书上说Dispatchmessage()函数将消息传送到指定窗口函数,它是调用wndproc函数,还是向windows发消息,由windows来调用wndprog呢?  
   
  当一个窗口有消息时,windows把消息发给这个窗口?也就是说调用wndproc函数,那为什么还要消息循环? 问题点数:100、回复次数:18Top

1 楼eyetiger(完了,完了,这次真的完了)回复于 2002-04-23 10:35:10 得分 0

为什么没人帮我呀?Top

2 楼cBeginner()回复于 2002-04-23 10:40:34 得分 20

先向应用程序发消息,当应用程序接到消息后,然后它会把消息通过DispatchMessage(&msg)传递给窗口函数wndproc,窗口函数就会对照事先由程序编写好的消息对照表调用对应的方法来处理消息。  
   
  那为什么还要消息循环?是因为当用户在应用一个程序的时候会有不同的(多次)操作,比如按一个按钮,移动窗口,改变窗口大小,等等。如果没有消息循环的话,就只能接收一条(一次)消息,这是错误的。Top

3 楼neptunez()回复于 2002-04-23 10:46:14 得分 10

你用鼠标点击窗口,鼠标移动等等等message,windows放到message   queue里面。你的message   loop是从queue上一个一个地把message取出来,用的事GetMessage()这个函数。DispatchMessage(&msg)把你的message传给wndproc这个函数并且运行这个函数。Top

4 楼cBeginner()回复于 2002-04-23 10:52:39 得分 0

帖主问的是DispatchMessage()。Top

5 楼eyetiger(完了,完了,这次真的完了)回复于 2002-04-23 10:59:57 得分 0

cBeginner(),neptunez();  
  windows是不是只把消息放在应用程序的message   queue里面,没有发给具体的窗口  
  窗口利用自己的消息循环,来得到消息,然后调用wndproc处理  
  这样的话,wndproc不是可以用一个普通的成员函数替代,为什么要是  
  callback呢?  
  Top

6 楼eyetiger(完了,完了,这次真的完了)回复于 2002-04-23 11:01:35 得分 0

我好像在哪看到过只有windows调用的函数才是callback呀?Top

7 楼max_welcome(?????)回复于 2002-04-23 11:10:15 得分 10

windows首先将消息存入系统堆栈,然后再放入应用程序的堆栈。  
  而应用程序一般有很多窗口,有不同的窗口过程,dispatch()函数就是将消息发送给不同的窗口过程函数Top

8 楼cBeginner()回复于 2002-04-23 11:14:27 得分 0

max_welcome(愤怒的小马)   说道没错,我也是那么理解的。  
   
  callback函数的具体定义在<<Windows   程序设计>>里的第3章里好象有说,可以翻翻看。Top

9 楼cBeginner()回复于 2002-04-23 11:17:37 得分 0

我喜欢这种关于API的讨论,尤其可以帮助一些win32   programming初学者,可惜这里关于讨论API的太少了,我正在看<<Windows   程序设计>>。Top

10 楼HardLoveC(爱你在心口难开)回复于 2002-04-23 11:21:34 得分 5

callback是因为不仅是用户操作需要用到WndProc()函数,系统有时候也会调用你写的WndProc()函数。Top

11 楼delphihero(何去何从)回复于 2002-04-26 08:38:56 得分 5

你用   DispatchMessage()把消息交给消息的窗体,而wndproc这个消息函数是由系统调用来处理你的窗体消息的,并不是你主动调用的。当然你也可以在GetMessage()循环里处理来,但这样很不规范,应为windows是多任务处理系统,所以你的函数应该由操作系统统一调用Top

12 楼mldnking(迭戈)回复于 2002-04-26 08:53:48 得分 5

DispatchMessage(&Msg)  
  将消息传给在Msg结构中为窗口所制定的消息处理器Top

13 楼freelybird(阿愚)回复于 2002-04-27 10:59:50 得分 5

简单一句话:   DispatchMessage(&Msg)作用就是根据msg的内容调用WndProcTop

14 楼blactte(想认识我吗?在靠近一点!)回复于 2002-04-27 11:11:25 得分 20

windows消息处理机制是这样的:  
  首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息  
  放到一个系统消息队列中去.  
  而应用程序需要有自己的消息队列,也就是线程消息队列,没一个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列.  
  winsows消息队列把得到的消息发送到线程消息队列,  
  线程消息队列每次取出一条消息发送到指定窗口,不断循环直到程序退出.这个循环就是靠消息环(while(GetMessage())   TranslateMessage();DispatchMessage();   实现的.GetMessage()只是从线程消息中取出一条消息,而DispatchMessage  
  则把取出的消息发送到目的窗口.如果收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗口!  
  明白了吗?Top

15 楼DaNiao(鸿雁)回复于 2002-04-27 11:29:30 得分 20

其实问题的关键在于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以外)Top

16 楼DaNiao(鸿雁)回复于 2002-04-27 11:31:51 得分 0

DispatchMessage到底干了些什么,现在主要还是以道听途说为主  
  更详细的东西还是不太清楚,也许要等MS公开windows源码以后才能搞明白Top

17 楼DaNiao(鸿雁)回复于 2002-04-27 11:48:22 得分 0

windows在进程的消息队列中有消息的时候会提高进程的优先级(不是你设置的那个,而是windows在调度的时候优先考虑你),在无消息的时候会降低你进程的优先级(前面说不会分配时间片,说得太绝对了点)  
  当然,在GetMessage()的时候来判断也是一种选择,但MS认为放在DispatchMessage里效率会更高一些Top

18 楼eyetiger(完了,完了,这次真的完了)回复于 2002-04-28 13:17:21 得分 0

谢谢大家!  
   
  现在明白多了Top

相关问题

  • presubclasswindow()函数是干什么的?
  • CBool是什么函数,干什么的?
  • 这个函数是干什么的?
  • OnNotify虚函数是干什么的?
  • getchild()函数是用来干什么的?
  • outportb(),inportb()是干什么的函数.
  • cshu函数是干什么用的阿?
  • 请问strtol函数是干什么的?
  • 什么是Callback函数?它是用来干什么的啊?
  • Form自动创建的那个函数是干什么的?

关键词

  • 函数
  • 消息
  • 应用程序
  • 线程
  • 循环
  • 系统
  • 鼠标
  • dispatchmessage
  • 调用
  • 队列

得分解答快速导航

  • 帖主:eyetiger
  • cBeginner
  • neptunez
  • max_welcome
  • HardLoveC
  • delphihero
  • mldnking
  • freelybird
  • blactte
  • DaNiao

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo