MFC 消息处理 PeekMessage TranslateMessage DispatchMessage

MFC 消息处理 PeekMessage TranslateMessage DispatchMessagehttp blog csdn net linlingzhao article details 由 arain 于星期二 11 02 2010 10 44 发表 MSGmessage nbsp nbsp if PeekMessage amp message NULL 0 0 PM REMOVE nbsp nbsp nbsp nbsp nbsp nbsp TranslateMes amp m

http://blog.csdn.net/linlingzhao/article/details/

MSG message ;  

if (::PeekMessage(&message ,NULL , 0, 0 ,PM_REMOVE))

{

       ::TranslateMessage(&message);  //把键盘消息翻译成字符消息

      ::DispatchMessage(&message);  //通过窗口类把控制交给MFC消息处理器

}

PeekMessage (&msg, NULL, 0, 0, PM_REMOVE) ;

前面的四个参数(一个指向MSG结构的指针、一个窗口句柄、两个值指示消息范围)与GetMessage的参数相同。将第二、三、四个参数设定为NULL或0时,表明我们想让PeekMessage传回程序中所有窗口的所有消息。如果要将消息从消息队列中删除,则将PeekMessage的最后一个参数设定为PM_REMOVE。如果您不希望删除消息,那么您可以将这个参数设定为PM_NOREMOVE。它使得程序可以检查程序的队列中的下一个消息,而不实际删除它。

GetMessage不将控制传回给程序,直到从程序的消息队列中取得消息,但是PeekMessage总是立刻传回,而不论一个消息是否出现。当消息队列中有一个消息时,PeekMessage的传回值为TRUE(非0),并且将按通常方式处理消息。当队列中没有消息时,PeekMessage传回FALSE(0)。

这使得我们可以改写普通的消息循环。我们可以将如下所示的循环:

while (GetMessage (&msg, NULL, 0, 0))       

{       

    TranslateMessage (&msg) ;       

    DispatchMessage (&msg) ;       

}       

return msg.wParam ;

替换为下面的循环:

while (TRUE)       

{       

    if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))       

    {       

            if (msg.message == WM_QUIT)       

                   break ;       

            TranslateMessage (&msg) ;        

            DispatchMessage (&msg) ;       

    }       

    else       

    {       

            // 完成某些工作的其它行程序       

    }       

}       

return msg.wParam ;

注意,WM_QUIT消息被另外挑出来检查。在普通的消息循环中您不必这么作,因为如果GetMessage接收到一个WM_QUIT消息,它将传回0,但是PeekMessage用它的传回值来指示是否得到一个消息,所以需要对WM_QUIT进行检查。

如果PeekMessage的传回值为TRUE,则消息按通常方式进行处理。如果传回值为FALSE,则在将控制传回给Windows之前,还可以作一点工作(如显示另一个随机矩形)。

(尽管Windows文件上说,您不能用PeekMessage从消息队列中删除WM_PAINT消息,但是这并不是什么大不了的问题。毕竟,GetMessage并不从消息队列中删除WM_PAINT消息。从队列中删除WM_PAINT消息的唯一方法是令窗口显示区域的失效区域变得有效,这可以用ValidateRect和ValidateRgn或者BeginPaint和EndPaint对来完成。如果您在使用PeekMessage从队列中取出WM_PAINT消息后,同平常一样处理它,那么就不会有问题了。所不能作的是使用如下所示的程序代码来清除消息队列中的所有消息:

while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ;

这行叙述从消息队列中删除WM_PAINT之外的所有消息。如果队列中有一个WM_PAINT消息,程序就会永远地陷在while循环中。)

另外补充:

peekMessage:

参数:

 

TranslateMessage函数

DispatchMessage函数

前面已经介绍从系统队列里获取一条消息,然后经过快捷键的函数检查,又通过字符消息函数的转换,最后要做的事情就是调用DispatchMessage函数,它的意思就是说要把这条消息发送到窗口里的消息处理函数WindowProc。

lpMsg是指向想向消息处理函数WindowProc发送的消息。

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN));

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232111.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • STM32驱动LCD1602程序(调试已成功)「建议收藏」

    STM32驱动LCD1602程序(调试已成功)「建议收藏」IO接线:RSPA8RWPB6EPB7LCD1602_IOPB8-PB15所有的口都配置成开漏输出,并且所有的口都通过10k电阻上拉至5V,部分电路图如下:程序代码LCD1602.C#include”lcd1602.h”voidLCD1602_GPIO_Init_Out()//LCD1602端口初始化,配置为输出{ GPIO_InitTypeDefGPIO_InitStructrue; RCC_APB2PeriphClockCmd(LCD1602_Timer_GPI

    2022年7月16日
    22
  • vuejs中执行npm run dev出现页面cannot GET/问题

    vuejs中执行npm run dev出现页面cannot GET/问题

    2021年10月11日
    52
  • 没有备案的网站域名能解析吗

    没有备案的网站域名能解析吗

    2021年9月25日
    69
  • 数据库ER图基础概念整理

    数据库ER图基础概念整理什么是ER图?ER图即是实体关系图!ER图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。ER图中关联关系有三种:1对1(1:1):1对1关系是指对于实体集A与实体集B,A中的每一个实体至多与B中一个实体有关系;反之,在实体集B中的每个实体至多与实体集A中一个实体有关系。1对多(1:N):1对多关系是指实体集A与实体集B中至

    2022年6月21日
    25
  • DIV ID用途_纸的用途

    DIV ID用途_纸的用途我是超级链接这个例子是一个很简单的超级链接。用到了DIV,实际上DIV就相当于一个肉眼看不到盒子,盒子里边可以放入很多的文字、图片、flash等等。而盒子里边内容的样式,就全部靠DIV的id所对应的

    2022年8月1日
    7
  • Java值传递与引用传递的区别

    Java值传递与引用传递的区别Java 值传递与引用传递文章目录 Java 值传递与引用传递前景实参与形参值传递与引用传递 Java 中的值传递总结前景关于这个问题 引发过很多广泛的讨论 看来很多程序员对于这个问题的理解都不尽相同 甚至很多人理解的是错误的 还有的人可能知道 Java 中的参数传递是值传递 但是说不出来为什么 在开始深入讲解之前 有必要纠正一下大家以前的那些错误看法了 如果你有以下想法 那么你有必要好好阅读本文 错误理解一 值传递和引用传递 区分的条件是传递的内容 如果是个值 就是值传递 如果是个引用 就是引用传递 错误

    2025年9月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号