窗口产生及消息循环

来源:互联网 发布:网络放大器的使用方法 编辑:程序博客网 时间:2024/06/01 08:55
 不得不承认使用MFC编程很方便,但是熟练掌握、运用MFC需要,并且了解MFC的实现原理并不是一件容易的事,了解其实现机制将会给我们编程过程带来更大的自由度,现在我们就来窥其究竟,以解知其然而不知其所以然的疑惑。

简单的讲,MFC就是在windows编程的基础上,对Windows函数进行了重新组织、封装,以便程序员们使用更方便,所以我们就需要windows程序的实现机制。

每一个windows程序都有一个入口函数WinMain(),windows程序基本遵循以下几个步骤:

1.定义窗口类。

2.注册窗口类。

3.利用注册的窗口类产生窗口。

4.显示窗口。

5.进入消息循环。

以上四个过程都是在WinMain()函数内进行的,尤其需要注意一点的是,每一个窗口类都和一个窗口过程函数相关联,而窗口过程函数恰恰负责对各种消息的响应。

下面给出代码,代码对关键点进行了注释,与各位分享。

[cpp] view plaincopyprint?
  1. #include <windows.h>
  2. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//声明窗口过程函数
  3. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreinstance,
  4. PSTR szCmdLine, int iCmdShow)
  5. {
  6. static TCHAR szAppName[] = TEXT("HelloWin");
  7. HWND hwnd;
  8. MSG msg;
  9. WNDCLASS wndclass; //窗口类结构体变量
  10. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  11. wndclass.lpfnWndProc = WndProc; //用窗口过程函数名初始化窗口类的成员变量,由此窗口类和窗口过程函数联系了起来
  12. wndclass.cbClsExtra = 0;
  13. wndclass.cbWndExtra = 0;
  14. wndclass.hInstance = hInstance;
  15. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  16. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  17. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  18. wndclass.lpszMenuName = NULL;
  19. wndclass.lpszClassName = szAppName; //窗口类的名字
  20. RegisterClass(&wndclass); //注册窗口类
  21. hwnd = CreateWindow(szAppName, //利用窗口类的名字作为CreatWindow的参数来创建窗口,从而窗口和窗口类联系了起来
  22. TEXT("The hello program"),
  23. WS_OVERLAPPEDWINDOW,
  24. CW_USEDEFAULT,
  25. CW_USEDEFAULT,
  26. CW_USEDEFAULT,
  27. CW_USEDEFAULT,
  28. NULL,
  29. NULL,
  30. hInstance,
  31. NULL);
  32. ShowWindow(hwnd, iCmdShow); //显示窗口
  33. UpdateWindow(hwnd);
  34. while(GetMessage(&msg, NULL, 0, 0)) //从消息循环队列中不断的取消息并交由窗口过程函数进行处理
  35. {
  36. TranslateMessage(&msg);
  37. DispatchMessage(&msg);
  38. }
  39. return msg.wParam;
  40. }
  41. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口过程函数的实现
  42. {
  43. HDC hdc;
  44. PAINTSTRUCT ps;
  45. RECT rect;
  46. switch(message)
  47. {
  48. case WM_CREATE:
  49. PlaySound( TEXT("HELLOWIN>WAV"), NULL, SND_FILENAME | SND_ASYNC );
  50. return 0;
  51. case WM_PAINT:
  52. hdc = BeginPaint(hwnd, &ps);
  53. GetClientRect(hwnd, &rect);
  54. DrawText(hdc, TEXT("Hello,Windows98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  55. EndPaint(hwnd, &ps);
  56. return 0;
  57. case WM_DESTROY:
  58. PostQuitMessage(0);
  59. return 0;
  60. }
  61. return DefWindowProc(hwnd, message, wParam, lParam);//窗口过程函数没有处理的消息交给默认窗口函数
  62. }

大家不必为弄清楚每个变量的具体含义,只需看明白关键变量的传递,以及整个窗口产生、消息处理的机制就可以了。

总而言之,就是以窗口类为中间桥梁,将产生的窗口和窗口过程函数关联了起来,而由操作系统负责提取消息,并调用窗口过程函数来完成消息响应。

原创粉丝点击