CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

[API]提问

楼主xujungood(flyboy)2004-07-02 01:46:03 在 VC/MFC / 基础类 提问

我的消息循环是这么写的:  
  while(true)  
  {  
  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  
  {  
  if(msg.message==WM_QUIT)  
  break;  
  if(msg.message!=WM_PAINT)  
  {  
  TranslateMessage(&msg);  
  DispatchMessage(&msg);  
  }  
  else  
  {  
  MessageBox(NULL,"ok","ok",0);  
  }  
  }  
  }  
  我的用意是截获WM_PAINT的消息,并显示一个弹出框,但是事实是,弹出框确实出来了,但是窗口中的图形他也画了,也就是WINDOWS   调用了回掉函数,这是怎么回事?  
   
  还有,《WINDOWS程序设计》中有这么一段话:  
  “。。。。GetMessage并不从消息队列中删除WM_PAINT消息。。。。。”  
  按照我的理解,这个函数从消息队列里面得到一个消息,并处理完后,就应该把这个消息删除的,这里面到底是怎么回事啊,哪位请详细回答一下,谢谢,:) 问题点数:20、回复次数:14Top

1 楼xujungood(flyboy)回复于 2004-07-02 11:44:48 得分 0

自己顶上去Top

2 楼runall(龙行天下)回复于 2004-07-02 12:54:31 得分 0

我来帮你顶Top

3 楼lianglp(寻找黄金分割点)回复于 2004-07-02 13:48:52 得分 0

不会从线程消息队列中删除,它需要用BeginPaint()函数进行删除WM_PAINT消息。  
  Top

4 楼yeyuboy(海绵)回复于 2004-07-02 14:01:57 得分 0

WINDOWS收到某些消息时会去直接调用窗口函数。Top

5 楼xujungood(flyboy)回复于 2004-07-02 15:12:13 得分 0

是不是windows执行MessageBox的时候,直接调用了窗口函数,而没有把消息放到消息队列里面去?  
   
  还有,如果GETMESSAGE函数没有删除处理过的消息的话,消息队列不是越来越长了?  
  Top

6 楼needways(天涯浪子)回复于 2004-07-02 15:23:04 得分 0

MessageBox   是一个模式对话框,它在里面处理了消息循环。大概像这样:  
   
  HWND   hWndMsgBox   =   X;  
   
  MSG   msg;  
  while   (GetMessage(&msg,   NULL,   0,   0))  
  {  
        if   (!IsDialogMessage(hWndMsgBox,   &msg))  
        {  
              TranslateMessage(&msg);  
              DispatchMessage(&msg);  
        }  
  }Top

7 楼xujungood(flyboy)回复于 2004-07-02 19:57:59 得分 0

这个对话矿的消息循环和我的窗口消息有什么联系呢?  
  怎么会调用我的窗口函数呢?Top

8 楼needways(天涯浪子)回复于 2004-07-02 20:02:06 得分 0

GetMessage   从消息队列中取出消息,然后通过   DispatchMessage   调用窗口的处理程序。Top

9 楼xujungood(flyboy)回复于 2004-07-02 23:47:28 得分 0

我的理解是:  
                      WINDOWS把消息发送给我的那个弹出对话矿窗口,然后,这个对话矿发现消息不是他的,就马上发还给了WINDOWS,WINDOWS再调用了我的窗口函数   ,而没有经过我的主窗口的消息队列,是吗?  
  Top

10 楼xujungood(flyboy)回复于 2004-07-02 23:52:02 得分 0

但是WINDOWS为什么要把这个消息直接发送给那个子对话矿呢?也就是那个弹出窗口,  
  我是菜鸟,想搞清楚些,麻烦大虾了^_^Top

11 楼needways(天涯浪子)回复于 2004-07-02 23:53:12 得分 15

消息是发送到了消息队列的。只是在   MessageBox   中调用   GetMessage   读出来了,然后再用  
  IsDialogMessage   来判断是否是   MessageBox   对话框的消息,如果不是的话就用   TranslateMessage   进行消息转换,然后用   DispatchMessage   分发。Top

12 楼jronald(深白色)回复于 2004-07-03 00:14:40 得分 5

在进入while循环之前,windows已经通过窗口过程处理了许多消息,准确地说,对CreateWindowEx,ShowWindow,UpdateWindow三个函数的调用会产生一堆消息让窗口过程处理(如WM_GETMINMAXINFO,WM_NCCREATE,WM_NCCALCSIZE,WM_CREATE,....),其中,WM_PAINT是UpdateWindow产生出来的,windows在进入while(true)循环前已经通过窗口函数处理了这些消息,而不是把这些消息依次放到消息队列中,然后等待while中的PeekMessage之类的函数来取消息再用DispatchMessage分派消息Top

13 楼xujungood(flyboy)回复于 2004-07-03 12:56:18 得分 0

哦,明白了,是因为我的程序阻塞在了MESSAGEBOX这个函数,也就是主窗口的循环没有进行,程序控制权在那个弹出窗口中,这个弹出窗口负责从消息队列中取出消息,他发现消息不是他的,就调用DISPATCHMSG这个函数重新发送,而没有经过我的主窗口的消息循环,  
  是这样的吧,呵呵  
  该怎么结分?谢谢大虾了,^_^Top

14 楼xujungood(flyboy)回复于 2004-07-09 13:57:04 得分 0

是不是跳出模式对话矿后,主程序的消息循环就阻塞在MESSAGEBOX这点,而消息由模式对话矿的消息循环进行处理?  
  而跳出非模式对话矿的时候,消息仍然由主程序的消息循环处理?Top

相关问题

  • 提问提问...
  • 菜鸟提问送分,关于OpenFile的API
  • 提问:调用什么api注册打开文件的程序?
  • 初学者关于用API修改游戏的提问
  • 三次提问:关于winsock api 分数共已累计300分!!!
  • 提问
  • 提问!!
  • 提问!
  • 提问,^_^&
  • 提问 :

关键词

  • 消息
  • 函数
  • 循环
  • 模式
  • null
  • 队列
  • 调用
  • 弹出
  • 对话矿
  • dispatchmessage

得分解答快速导航

  • 帖主:xujungood
  • needways
  • jronald

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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