消息循环

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调用开始消息循环。

posted on 2011-12-15 16:06 梦五 阅读(261) 评论(0)  编辑 收藏 引用 所属分类: Windows相关


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜