|
ws呼叫视窗时直接送给视窗讯息处理程式。也就是说,伫列化的讯息被「发送」给讯息伫列,而非伫列化的讯息则「发送」给视窗讯息处理程式。任何情况下,视窗讯息处理程式都将获得视窗所有的讯息--包括伫列化的和非伫列化的。视窗讯息处理程式是视窗的「讯息中心」。
伫列化讯息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP讯息)、击键产生的字元(WM_CHAR)、滑鼠移动(WM_MOUSEMOVE)和滑鼠按钮(WM_LBUTTONDOWN)的形式给出。伫列化讯息还包含时钟讯息(WM_TIMER)、更新讯息(WM_PAINT)和退出讯息(WM_QUIT)。
非伫列化讯息则是其他讯息。在许多情况下,非伫列化讯息来自呼叫特定的Windows函式。例如,当WinMain呼叫CreateWindow时,Windows将建立视窗并在处理中给视窗讯息处理程式发送一个WM_CREATE讯息。当WinMain呼叫ShowWindow时,Windows将给视窗讯息处理程式发送WM_SIZE和WM_SHOWWINDOW讯息。当WinMain呼叫UpdateWindow时,Windows将给视窗讯息处理程式发送WM_PAINT讯息。键盘或滑鼠输入时发出的伫列化讯息信号,也能在非伫列化讯息中出现。例如,用键盘或滑鼠选择了一个功能表项时,键盘或滑鼠讯息就是伫列化的,而说明功能表项已选中的WM_COMMAND讯息则可能就是非伫列化的。
这一过程显然很复杂,但幸运的是,其中的大部分是由Windows解决的,不关我们的程式的事。从视窗讯息处理程式的角度来看,这些讯息是以一种有序的、同步的方式进出的。视窗讯息处理程式可以处理它们,也可以不处理。
当我说讯息是以一种有序的同步的方式进出时,我是说首先讯息与硬体的中断不同。在一个视窗讯息处理程式中处理讯息时,程式不会被其他讯息突然中断。
虽然Windows程式可以多执行绪执行,但每个执行绪的讯息伫列只为视窗讯息处理程式在该执行绪中执行的视窗处理讯息。换句话说,讯息回圈和视窗讯息处理程式不是并发执行的。当一个讯息回圈从其讯息伫列中接收一个讯息,然後呼叫DispatchMessage将讯息发送给视窗讯息处理程式时,直到视窗讯息处理程式将控制传回给Windows,DispatchMessage才能结束执行。
当然,视窗讯息处理程式能呼叫给视 |