消息循环

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调用开始消息循环。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值