Windows程序设计(第五版) 一

  1 #include<tchar.h>
  2 #include"WindowProc.h"
  3 #include"Constants.h"
  4 #include"MenuBar.h"
  5 
  6 
  7 void MyOpenFile(HWND hWnd, HDC hDc);
  8 
  9 /*
 10 主窗口回调函数:接收Windows发过来的各种消息并处理这些消息
 11 用户对窗口的输入以消息的形式传递给窗口,而窗口也借助于消息来与其他窗口进行通信。
 12 
 13 例如用户调整窗口的尺寸时,Windows便向应用程序发送一条带新窗口尺寸相关信息的消息,
 14 接着应用程序对自身的内容进行调整以反映出窗口尺寸的变化。
 15 
 16 Windows是一个消息驱动的操作系统,它使用两种方式把各种事件通知给应用程序:
 17 1、把消息放到应用程序的消息队列里
 18 2、向窗口过程直接发送消息(Windows调用该窗口过程函数)
 19 
 20 应用程序有很多窗口,每一个窗口都有一个与之相关联的窗口过程函数,这个窗口过程可以是
 21 应用程序中的某一个函数,也可以位于一个动态链接库中。Windows是通过调用该窗口过程来向窗口传递
 22 消息,窗口过程根据这些消息作出相应的处理,然后将控制权返还给Windows。
 23 
 24 当应用程序开始执行时,Windows首先为该程序创建一个消息队列,该消息队列中存放着应用程序可能创建的所有
 25 窗口的消息。
 26 
 27 应用程序中一般都会包含一小段称为消息循环的代码,该代码用于从消息队列中检索消息,并将其分发给相应的
 28 窗口过程,不在消息队列的消息不经过消息队列直接发送给窗口过程。
 29 
 30 */
 31 
 32 
 33 
 34 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 35 {
 36     /*******************************************************************************************************
 37     设备环境(DC):
 38 
 39     在Windows中,一切能在显示器上看到的都是图形,不但包括点,线,矩形,圆等,也包括文字,字体。
 40     对用户来说文字和图片是不同的,但对计算机来说其本质都是图形,都需要在显示器上画出来。这就是
 41     Windows被称为图形操作系统的原因。
 42 
 43     Windows不允许我们直接访问硬件,如硬盘,显示器,打印机,键盘等,在使用这些硬件通信前要获得
 44     设备环境(Device Context,简称DC),间接访问硬件。
 45 
 46     所谓设备环境,就是与当前硬件设备有关的各种信息,他是硬件设备的抽象,也就是说,设备环境就代表
 47     当前的硬件。
 48 
 49     与文字输出,图形绘制有关的函数,在使用时大都需要传入一个参数,就是设备环境句柄。获取设备环境
 50     句柄有多种方式,常用的就是BeginPaint和EndPaint函数。
 51 
 52     比如:当产生WM_PAINT消息时,应用程序开始绘图。在绘图之前要先调用BeginPaint函数通知Windows,告诉他当
 53     前程序需要使用显示器,你安排一下吧。BeginPaint函数执行完毕就返回显示器设备句柄,接下来就可以
 54     使用GDI函数绘图了。
 55 
 56     绘图结束后,也需要调用EndPaint函数通知Windows,告诉它我绘图完成了,不需要再占用显示器了,你可以
 57     收回。
 58     ********************************************************************************************************/
 59 
 60 
 61     HDC hDC;
 62     PAINTSTRUCT ps;
 63 
 64     hDC = GetDC(hWnd);
 65 
 66     switch (message)
 67     {
 68 
 69     //////////////////////////////////////////////窗口创建时相关操作
 70     case WM_CREATE:
 71     {
 72         HMENU hMenu = CreateMenuBar();
 73         SetMenu(hWnd, hMenu);                                //以上只是创建了菜单,需要设置,给hWnd窗口设置hMenu
 74     }
 75         return 0;
 76 
 77     //////////////////////////////////////////////鼠标右键单击相关操作
 78     case WM_RBUTTONUP:
 79     {
 80         POINT point;
 81         point.x = LOWORD(lParam);
 82         point.y = HIWORD(lParam);
 83         ClientToScreen(hWnd, &point);                        //这里的坐标是相对于屏幕的,需要转换为客户坐标
 84         HMENU hSubMenu = GetSubMenu(GetMenu(hWnd), 0);        //获取菜单的第0个子菜单,用这个菜单来演示弹出菜单
 85         TrackPopupMenu(hSubMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hWnd, NULL);
 86     }
 87         return 0;
 88 
 89     //////////////////////////////////////////////窗口菜单相关操作
 90     case WM_COMMAND:
 91     {
 92 
 93          switch (LOWORD(wParam))
 94         {
 95             ////////////////////新建文件
 96          case IDM_FILE_NEW:
 97          {
 98                 MyOpenFile(hWnd, hDC);
 99                 break;
100          }
101     
102             ////////////////////保存文件
103          case IDM_FILE_SAVE:
104          {
105                 MessageBox(hWnd, TEXT("您点击了保存文件菜单"), TEXT("提示"), MB_OK);
106                 break;
107          }
108 
109             ///////////////////默认操作
110          default:
111          {
112                 break;
113                 return 0;
114          }
115 
116      }
117         
118 
119     }
120 
121     //////////////////////////////////////////////客户区重绘相关操作
122     case WM_PAINT:
123     {
124             hDC = BeginPaint(hWnd, &ps);
125 
126             EndPaint(hWnd, &ps);
127 
128             return 0;
129     }
130 
131     //////////////////////////////////////////////窗口销毁相关操作
132     case WM_DESTROY:
133     {
134             PostQuitMessage(0);
135             return 0;
136     }
137 
138     }
139 
140     //////////////////////////////////////////////返回默认窗口过程函数
141     return DefWindowProc(hWnd, message, wParam, lParam);
142 
143 
144 }
View Code

猜你喜欢

转载自www.cnblogs.com/mytcm/p/9493354.html