设为首页 加入收藏

TOP

11.2.2 消息处理函数(3)
2013-10-07 16:11:48 来源: 作者: 【 】 浏览:65
Tags:11.2.2 消息 处理 函数

11.2.2  消息处理函数(3)

3. 结束程序

有人可能认为,关闭窗口就会关闭应用程序;但为了获得这样的特性,实际上必须添加一些代码。关闭窗口时应用程序不会自动关闭的原因在于可能需要做一些清理工作,应用程序也可能有多个窗口。当用户通过双击标题栏图标或单击关闭按钮关闭窗口时,系统将生成一条WM_DESTROY消息。因此,为了关闭应用程序,需要在WindowProc()函数中处理WM_DESTROY消息。可以使用下面这条语句生成一条WM_QUIT消息进行处理:

  1. PostQuitMessage(0); 

这里的实参是一个退出代码。顾名思义,该Windows API函数在应用程序的消息队列中添加一条WM_QUIT消息。该消息导致WinMain()中的GetMessage()函数返回FALSE,并结束消息循环,从而终止程序。

4. 完整的WindowProc()函数

我们已经讨论了构成本示例中完整的WindowProc()函数所需的所有元素。该函数的代码如下所示:

  1. // Listing OFWIN_2  
  2. LRESULT CALLBACK WindowProc(HWND hWnd, UINT message,  
  3. WPARAM wParam, LPARAM lParam)  
  4. {  
  5. switch(message)                                                     // Process selected messages  
  6. {  
  7. case WM_PAINT:                                                                              // Message is to redraw the window  
  8. HDC hDC;                                                                                                // Display context handle  
  9. PAINTSTRUCT PaintSt;                                                    // Structure defining area to be drawn  
  10. RECT aRect; // A working rectangle  
  11. hDC = BeginPaint(hWnd, &PaintSt);       // Prepare to draw the window  
  12. // Get upper left and lower right of client area  
  13. GetClientRect(hWnd, &aRect);  
  14. SetBkMode(hDC, TRANSPARENT);                        // Set text background mode  
  15. // Now draw the text in the window client area  
  16. DrawText(  
  17. hDC,                                                                                    // Device context handle  
  18. _T("But, soft! What light through yonder window breaks "),  
  19. -1,                                                                                     // Indicate null terminated string  
  20. &aRect,                                                                     // Rectangle in which text is to be drawn  
  21. DT_SINGLELINE|                                              // Text format - single line  
  22. DT_CENTER|                                                              // - centered in the line  
  23. DT_VCENTER);                                                        // - line centered in aRect  
  24. EndPaint(hWnd, &PaintSt);                                   // Terminate window redraw operation  
  25. return 0;  
  26. case WM_DESTROY:                                                                            // Window is being destroyed  
  27. PostQuitMessage(0);  
  28. return 0;  
  29. }  
  30. return DefWindowProc(hWnd, message, wParam, lParam);  
  31. }  

示例说明

除了最后一条语句外,整个函数体只是一条switch语句而已。特定的case是基于message参数传递给该函数的消息ID而选择的。由于本示例相当简单,只需要处理两种不同的消息:WM_PAINT和WM_DESTROY。在switch语句的后面,通过调用DefWindowProc()函数,将所有其他消息回传给Windows。DefWindowProc()函数的实参就是传递给本函数的实参,因此只需要按照原样将它们传回去即可。注意每种消息类型处理代码最后的return语句。就处理的这两种消息而言,返回值是0。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇11.2.2 消息处理函数(2) 下一篇11.2.2 消息处理函数(4)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)