IT) 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讯息後,同平常一样处理它,那么就不会有问题了。所不能作的是使用如下所示的程式码来清除讯息伫列中的所有讯息:
这行叙述从讯息伫列中删除WM_PAINT之外的所有讯息。如果伫列中有一个WM_PAINT讯息,程式就会永远地陷在while回圈中。)
PeekMessage在Windows的早期版本中比在Windows
98中要重要得多。这是因为Windows的16位元版本使用的是非优先权式的多工(我将在第二十章中讨论这一点)。Windows的Terminal程式在从通讯埠接收输入後,使用一个PeekMessage回圈。列印管理器程式使用这个技术来进行列印,其他的Windows列印应用程式通常都会使用一个PeekMessage回圈。在Windows
98优先权式的多工环境下,程式可以建立多个执行绪,我们将第二十章看到这一点。
不管怎样,有了PeekMessage函式,我们就可以编写一个不停地 |