消息循环

1. Windows(操作系统)为当前运行的每个Windows程序维护一个“消息队列”。在发生输入事件(用户用鼠标和键盘向窗口输入数据)之后,Windows(操作系统)将事件转换为一个“消息”,并将消息放入程序的消息队列中。

2. 程序通过执行一块被称为“消息循环”的代码从消息队列中取出消息:
while( GetMessage(&msg,NULL,0,0) )
{1. Windows(操作系统)为当前运行的每个Windows程序维护一个“消息队列”。在发生输入事件(用户用鼠标和键盘向窗口输入数据)之后,Windows(操作系统)将事件转换为一个“消息”,并将消息放入程序的消息队列中。


2. 程序通过执行一块被称为“消息循环”的代码从消息队列中取出消息:
while( GetMessage(&msg,NULL,0,0) )
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
msg变量是类型为MSG的结构,类型MSG在WINUSER.H中定义如下:
typedef struct tagMSG
{
  HWND     hwnd;
  UINT     message;
  WPARAM   wParam;
  LPARAM   lParam;
  DWORD    time;
  POINT    pt;
}MSG,*PMSG;
POINT数据类型也是一个结构,在WINDEF.H中定义如下:
typedef struct tagPOINT
{
  LONG x;
  LONG y;
}POINT,*PPOINT;


3. 消息循环以GetMessage调用开始,它从消息队列中取出一个消息:GetMessage(&msg,NULL,0,0);
这一调用传给Windows(操作系统)一个指向名为msg的MSG结构的指针。第二、第三和第四个参数设置为NULL或者0,表示程序接收它自己创建的所有窗口的所有消息。
Windows 用从消息队列中取出的下一个消息来填充消息结构的各个域,结构的各个域包括:
hwnd    消息发向的窗口的句柄。
message    消息标识符。这是一个数值,用以标识消息。
wParam    一个32位的"message parameter(消息参数)",其含义和数值根据消息的不同而不同。
lParam    一个32位的消息参数,其值与消息有关。
time    消息放入消息队列中的时间。
pt    消息放入消息队列时的鼠标坐标。
只要从消息队列中取出消息的message域不为WM_QUIT(其值为0x0012),GetMessage就返回一个非零值。WM_QUIT消息将导致GetMessage返回0。


4. 语句TranslateMessage(&msg);将msg结构传给Windows(操作系统),进行一些键盘转换。


5. 语句DispatchMessage(&msg);又将msg结构回传给Windows。然后,Windows 将该消息发送给适当的窗口过程,让它进行处理。这也就是说,Windows将调用窗口过程。
处理完消息后,窗口过程返回到Windows(操作系统)。此时Windows还停留在DispatchMessage调用中。在结束DispatchMessage调用的处理后,Windows回到程序,并且接着从下一个GetMessage调用开始消息循环。
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
msg变量是类型为MSG的结构,类型MSG在WINUSER.H中定义如下:
typedef struct tagMSG
{
  HWND     hwnd;
  UINT     message;
  WPARAM   wParam;
  LPARAM   lParam;
  DWORD    time;
  POINT    pt;
}MSG,*PMSG;
POINT数据类型也是一个结构,在WINDEF.H中定义如下:
typedef struct tagPOINT
{
  LONG x;
  LONG y;
}POINT,*PPOINT;

3. 消息循环以GetMessage调用开始,它从消息队列中取出一个消息:GetMessage(&msg,NULL,0,0);
这一调用传给Windows(操作系统)一个指向名为msg的MSG结构的指针。第二、第三和第四个参数设置为NULL或者0,表示程序接收它自己创建的所有窗口的所有消息。
Windows 用从消息队列中取出的下一个消息来填充消息结构的各个域,结构的各个域包括:
hwnd    消息发向的窗口的句柄。
message    消息标识符。这是一个数值,用以标识消息。
wParam    一个32位的"message parameter(消息参数)",其含义和数值根据消息的不同而不同。
lParam    一个32位的消息参数,其值与消息有关。
time    消息放入消息队列中的时间。
pt    消息放入消息队列时的鼠标坐标。

只要从消息队列中取出消息的message域不为WM_QUIT(其值为0x0012),GetMessage就返回一个非零值。WM_QUIT消息将导致GetMessage返回0。

4. 语句TranslateMessage(&msg);将msg结构传给Windows(操作系统),进行一些键盘转换。

5. 语 句DispatchMessage(&msg);又将msg结构回传给Windows 。然后,Windows 将该消 息发送给适当的窗口过程,让它进行处理。这也就是说, Windows将调用窗口过程。
处理完消息后,窗口过程返回到Windows(操作系统)。此时Windows还停留在DispatchMessage调用中。在结束DispatchMessage调用的处理后,Windows回到程序,并且接着从下一个GetMessage调用开始消息循环。

你可能感兴趣的:(MFC)