您的位置:首页 > 理论基础 > 数据结构算法

SDK消息循环机制

2007-07-18 14:16 302 查看
 
[align=center][/align]
         Windows下,每个线程都可以拥有一个消息队列,通常UI线程默认就拥有自己的消息队列,Work Thread需要自己调用PeekMessage来创建自己的消息队列。
         消息是一个数据结构,下面是它的定义:
[align=left]typedef struct tagMSG {[/align]
[align=left]    HWND        hwnd;[/align]
[align=left]    UINT        message;[/align]
[align=left]    WPARAM      wParam;[/align]
[align=left]    LPARAM      lParam;[/align]
[align=left]    DWORD       time;[/align]
[align=left]    POINT       pt;[/align]
[align=left]#ifdef _MAC[/align]
[align=left]    DWORD       lPrivate;[/align]
[align=left]#endif[/align]
} MSG
         每个消息都包含了要接收消息的窗口的句柄,消息ID,两个参数,还有其他信息。SDK下的消息循环通常这样写:
[align=left]while (GetMessage(&msg, NULL, 0, 0))[/align]
[align=left]     {[/align]
[align=left]         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))[/align]
[align=left]         {[/align]
[align=left]              TranslateMessage(&msg);[/align]
[align=left]              DispatchMessage(&msg);[/align]
[align=left]         }[/align]
[align=left]     }[/align]
         除非GetMessage函数从消息队列中获取到了WM_QUIT消息,否则这个循环将永远进行下去。循环内部先对加速键和键盘消息进行处理,然后发送该消息到指定窗口,因为消息本身包含了窗口的句柄,所以目的地不用再明确指定。
         当目标窗口接收到消息后,窗口过程函数就会被执行,根据不同的消息进行相应的处理。
因为窗口过程函数和窗口类名在注册窗口的时候建立了对应关系。创建窗口时,我们又使用了窗口类名,所以可以推测创建成功后获得的窗口句柄和窗口过程函建立了映射。
         下面是一个典型的窗口过程函数:
[align=left]LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)[/align]
[align=left]{[/align]
[align=left]     int wmId, wmEvent;[/align]
[align=left]     PAINTSTRUCT ps;[/align]
[align=left]     HDC hdc;[/align]
[align=left] [/align]
[align=left]     switch (message)[/align]
[align=left]     {[/align]
[align=left]     case WM_COMMAND:[/align]
[align=left]         wmId    = LOWORD(wParam);[/align]
[align=left]         wmEvent = HIWORD(wParam);[/align]
[align=left]         // Parse the menu selections:[/align]
[align=left]         switch (wmId)[/align]
[align=left]         {[/align]
[align=left]         case IDM_ABOUT:[/align]
[align=left]              DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);[/align]
[align=left]              break;[/align]
[align=left]         case IDM_EXIT:[/align]
[align=left]              DestroyWindow(hWnd);[/align]
[align=left]              break;[/align]
[align=left]         default:[/align]
[align=left]              return DefWindowProc(hWnd, message, wParam, lParam);[/align]
[align=left]         }[/align]
[align=left]         break;[/align]
[align=left]     case WM_PAINT:[/align]
[align=left]         hdc = BeginPaint(hWnd, &ps);[/align]
[align=left]         // TODO: Add any drawing code here...[/align]
[align=left]         EndPaint(hWnd, &ps);[/align]
[align=left]         break;[/align]
[align=left]     case WM_DESTROY:[/align]
[align=left]         PostQuitMessage(0);[/align]
[align=left]         break;[/align]
[align=left]     default:[/align]
[align=left]         return DefWindowProc(hWnd, message, wParam, lParam);[/align]
[align=left]     }[/align]
[align=left]     return 0;[/align]
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息