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]
}
相关文章推荐
- SDK消息循环机制
- SDK消息循环机制
- SDK消息循环机制
- SDK消息循环机制
- Android消息循环机制源码深入理解
- Android的消息循环机制 Looper Handler类分析
- Toast和Looper。Handler消息循环机制。
- 【从源码看Android】03Android MessageQueue消息循环处理机制(epoll实现)
- 深入剖析WTL—WTL消息循环机制详解
- 深入剖析WTL—WTL消息循环机制详解
- Toast和Looper。Handler消息循环机制。
- 【Android 开发】: Android 消息处理机制之四: Android 消息循环 Looper 及其源码解析
- 9.VC(custom)-windows消息机制(消息循环)
- Android消息处理机制(三):进入循环
- Android消息循环机制
- 【Windows编程】Step.2 消息循环机制
- Dart与消息循环机制
- Android消息循环机制
- Android HandlerThread 消息循环机制之源代码解析
- Toast和Looper。Handler消息循环机制。