(转)PeekMessage 与 GetMessage 区别

 

转自 Maalvin 的一次论坛回帖

 

要想知道PeekMessage()和GetMessage()的区别,最简单的办法是在窗口函数拦截WM_PAINT的时候加一个永久循环,像 while(TRUE){},循环体中可以输出文本或图形。这时如果你使用GetMessage(),恐怕就会遇到麻烦,你的程序会什么都不做,如果鼠标 的光标恰好在窗口,你会发现它不是通常的箭头光标,而是沙漏--这意味着这个永久循环应占用了该程序的所有CPU资源,无法处理其他消息,比如,你无法结 束这个程序,也无法最小化。如果这个时候,你用PeekMessage()替换GetMessage(),将处理WM_PAINT的代码写成一个单独的函 数,这样,当消息队列中有消息要处理时让程序的TranslateMessage()和DispatchMessage()去处理消息,和 GetMessage()一样。当消息队列中没有消息时,调用你的函数,这样就完成了你想在WM_PAINT中想处理而无法处理的事情。而且从这个实验中 可以看到GetMessage()和PeekMessage()几个主要区别:
1。GetMessage()只有在接收到消息后才将控制权转给你的程序,而PeekMessage()无论有没有消息都会将控制权转给你的程序:如果有消息,返回真,没有消息返回假。
2。GetMessage()的主要功能是从消息队列中“取出”消息,消息被取出后,消息队列中就不再由该消息了;而PeekMessage()的主要功 能是“窥视(peek)”消息,如果有消息,返回真,没有返回假。但PeekMessage()允许你从消息队列中“取出”消息,这就是 PeekMessage()第四个函数的用途:如果选用PM_REMOVE,则消息从队列中取出,如选用PM_NOREMOVE,则 PeekMessage()则“文如其人”,只是“偷看”,而保留消息。
3。GetMessage()每次都“等待处理消息”而PeekMessage()只是“察看有无消息”。
和PeekMessage()相关的代码:
while   (TRUE)
{
          if   (PeekMessage   (&msg,   NULL,   0,   0,   PM_REMOVE))
          {
                    if   (msg.message   ==   WM_QUIT)
                              break   ;

                    TranslateMessage   (&msg)   ;
                    DispatchMessage   (&msg)   ;
          }
          else
          {
                    //other   program   lines   to   do   some   work
          }
}

你可能感兴趣的:(null,图形)