pFlop RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ;
EndPaint (hwnd, &ps) ; DeleteObject (hBrush) ; return 0 ; case WM_DESTROY : KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
因为BEEPER1每次收到WM_TIMER讯息时,都用颜色的变换显示出来,所以您可以通过呼叫BEEPER1来查看WM_TIMER讯息的性质,并完成Windows内部的一些其他操作。
例如,首先呼叫 控制台 的 显示器 程式,选择 效果 ,确定 拖曳时显示视窗内容 核取方块没有被选中。现在,试著移动或者缩放BEEPER1视窗,这将导致程式进入「模态讯息回圈」。Windows通过在内部讯息而非您程式的讯息回圈中拦截所有讯息,来禁止对移动或者缩放操作的任何干扰。通过此回圈到达程式视窗的大多数讯息都被丢弃,这就是BEEPER1停止蜂鸣的原因。当完成了移动与缩放之後,您将会注意到BEEPER1不能取得它所丢弃的所有WM_TIMER讯息,尽管前两个讯息的间隔可能少於1秒。
在「拖曳时显示视窗内容」核取方块被选中时,Windows中,的模态讯息回圈会试图给您的视窗讯息处理程式传递一些丢失的讯息。这样做有时工作得很好,有时却不行。
方法二
设定计时器的第一种方法是把WM_TIMER讯息发送到通常的视窗讯息处理程式,而第二种方法是让Windows直接将计时器讯息发送给您程式的另一个函式。
接收这些计时器讯息的函式被称为「callback」函式,这是一个在您的程式之中但是由Windows呼叫的函式。您先告诉Windows此函式的位址,然後Windows呼叫此函式。这看起来也很熟悉,因为程式的视窗讯息处理程式实际上也是一种callback函式。当注册视窗类别时,要将函式的位址告诉Windows,当发送讯息给程式时,Windows会呼叫此函式。
SetTimer并非是唯一使用callback函式的Windo |