7_10.cpp
上传用户:szlongfu
上传日期:2017-12-13
资源大小:145k
文件大小:8k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "7_10.h"
  5. #include <math.h>
  6. LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
  7. BOOL InitWindowsClass(HINSTANCE hInstance); //初始化窗口类声明
  8. BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);//初始化窗口声明
  9. HWND hWndMain; //定义全局窗口句柄
  10. HINSTANCE hInst; //定义实例句柄
  11. RECT rect1={100,100,100,100}; //定义矩形结构体.记录了图形的信息
  12. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
  13.    LPSTR lpCmdLine,int nCmdShow)
  14. {
  15. MSG Message;
  16. HACCEL hAccel;
  17. hInst = hInstance;
  18. if(!InitWindowsClass(hInstance)) //初始化窗口类
  19. return FALSE;
  20. if(!InitWindows(hInstance,nCmdShow)) //初始化窗口
  21. return FALSE;
  22. hAccel = LoadAccelerators(hInstance,"Menu"); //加载加速键资源
  23. while(GetMessage(&Message,0,0,0))
  24. {
  25. if(!TranslateAccelerator(hWndMain,hAccel,&Message))//截获加速键消息
  26. {
  27. TranslateMessage(&Message); //消息循环
  28. DispatchMessage(&Message);
  29. }
  30. }
  31. return Message.wParam;
  32. }
  33. LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,
  34. UINT wParam,LONG lParam)
  35. {
  36. HMENU hMenu1,hMenu2; //定义菜单句柄
  37. HDC hDC; //定义设备环境句柄
  38. static BOOL bCircle = FALSE,bRect = FALSE; //设置绘制圆和矩形的标志变量
  39. static BOOL bMove = FALSE; //设置移动标志
  40. PAINTSTRUCT ps; //定义绘图结构体变量
  41. switch(iMessage)
  42. {
  43. case WM_COMMAND:
  44. switch(LOWORD(wParam))
  45. {
  46. case IDM_CIRCLE: //单击圆形菜单
  47. hMenu1 = GetMenu(hWnd); //得到菜单句柄
  48. CheckMenuItem(hMenu1,IDM_CIRCLE,MF_CHECKED); //设置选中标志
  49. CheckMenuItem(hMenu1,IDM_RECTANGLE,MF_UNCHECKED);//删除标志
  50. DeleteMenu(hMenu1,1,MF_BYPOSITION); //删除“矩形”弹出菜单
  51. hMenu2 = CreateMenu(); //动态创建菜单
  52. //添加菜单项
  53. AppendMenu(hMenu2,MF_ENABLED,IDM_DRAWCIRCLE,"绘制圆形(&d)");
  54. AppendMenu(hMenu2,MF_ENABLED,IDM_MOVECIRCLE,"移动圆形(&m)");
  55. AppendMenu(hMenu2,MF_ENABLED,IDM_ZOOMIN,"放大(&i)");
  56. AppendMenu(hMenu2,MF_ENABLED,IDM_ZOOMOUT,"缩小(&o)");
  57. AppendMenu(hMenu2,MF_ENABLED,IDM_REDRAW,"重绘(&r)");
  58. //插入菜单。
  59. InsertMenu(hMenu1,1,MF_POPUP|MF_BYPOSITION,(UINT)hMenu2,"圆形(&c)");
  60. DrawMenuBar(hWndMain); //刷新菜单
  61. bCircle = FALSE; //绘圆标志为假
  62. bRect = FALSE; //绘矩形标志为假
  63. bMove = FALSE; //移动标志为假
  64. rect1.left = 100; //恢复矩形的初始状态
  65. rect1.right = 100;
  66. rect1.bottom = 100;
  67. rect1.top = 100;
  68. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  69. break;
  70. case IDM_RECTANGLE: //单击矩形菜单
  71. hMenu1 = GetMenu(hWnd); //得到菜单句柄
  72. CheckMenuItem(hMenu1,IDM_CIRCLE,MF_UNCHECKED); //删除选中标志
  73. CheckMenuItem(hMenu1,IDM_RECTANGLE,MF_CHECKED); //设置选中标志
  74. DeleteMenu(hMenu1,1,MF_BYPOSITION); //删除“圆形”弹出菜单
  75. hMenu2 = LoadMenu(hInst,"menuRect"); //得到菜单句柄
  76. //插入菜单
  77. InsertMenu(hMenu1,1,MF_POPUP|MF_BYPOSITION,(UINT)hMenu2,"矩形(&r)");
  78. DrawMenuBar(hWndMain); //刷新菜单
  79. bCircle = FALSE; //绘圆标志为假
  80. bRect = FALSE; //绘矩形标志为假
  81. bMove = FALSE; //移动标志为假
  82. rect1.left = 100; //恢复矩形的初始状态
  83. rect1.right = 100;
  84. rect1.bottom = 100;
  85. rect1.top = 100;
  86. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  87. break;
  88. case IDM_EXIT:
  89. SendMessage(hWnd,WM_DESTROY,0,0); //发出关闭窗口信息
  90. break;
  91. case IDM_DRAWCIRCLE: //绘制圆形
  92. bCircle = TRUE; //绘圆标志为真
  93. bRect = FALSE; //绘矩形标志为假
  94. bMove = FALSE; //移动标志为假
  95. break;
  96. case IDM_DRAWRECT: //绘制矩形
  97. bCircle = FALSE; //绘圆标志为假
  98. bRect = TRUE; //绘矩形标志为真
  99. bMove = FALSE; //移动标志为假
  100. break;
  101. case IDM_MOVECIRCLE: //移动圆形
  102. bMove = TRUE; //移动标志为真
  103. break;
  104. case IDM_MOVERECT: //移动矩形
  105. bMove = TRUE; //移动标志为真
  106. break;
  107. case IDM_ZOOMIN: //放大
  108. if(bCircle ==TRUE || bRect ==TRUE)
  109. {
  110. int nLength,nWidth;
  111. nLength = abs(rect1.right-rect1.left); //计算长度
  112. nWidth = abs(rect1.top-rect1.bottom); //计算宽度
  113. rect1.right = (int)(rect1.left+nLength*1.2); //放大
  114. rect1.bottom = (int)(rect1.top+nWidth*1.2);
  115. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  116. }
  117. break;
  118. case IDM_ZOOMOUT: //缩小
  119. if(bCircle ==TRUE || bRect ==TRUE)
  120. {
  121. int nLength,nWidth;
  122. nLength = abs(rect1.right-rect1.left); //计算长度
  123. nWidth = abs(rect1.top-rect1.bottom); //计算宽度
  124. rect1.right = (int)(rect1.left+nLength/1.2); //缩小
  125. rect1.bottom = (int)(rect1.top+nWidth/1.2);
  126. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  127. }
  128. break;
  129. case IDM_REDRAW: //重新绘图
  130. bMove = FALSE; //移动标志为假
  131. rect1.left = 100; //恢复矩形的初始状态
  132. rect1.right = 100;
  133. rect1.top = 100;
  134. rect1.bottom = 100;
  135. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  136. break;
  137. }
  138. break;
  139. case WM_KEYDOWN:
  140. if(bMove ==TRUE)
  141. {
  142. if(wParam == VK_LEFT)
  143. { //按left键,向左移动
  144. rect1.left -=10;
  145. rect1.right -=10;
  146. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  147. }
  148. else if(wParam == VK_RIGHT)
  149. { //按right键,向右移动
  150. rect1.left +=10;
  151. rect1.right +=10;
  152. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  153. }
  154. else if(wParam == VK_UP)
  155. { //按up键时,向上移动
  156. rect1.top -=10;
  157. rect1.bottom -=10;
  158. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  159. }
  160. else if(wParam == VK_DOWN)
  161. { //按down键,向下移动
  162. rect1.top +=10;
  163. rect1.bottom +=10;
  164. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  165. }
  166. }
  167. else if(bCircle == TRUE || bRect ==TRUE)
  168. {
  169. if(wParam == VK_RIGHT)
  170. {
  171. rect1.right +=10; //按下右箭头时矩形框长度加10
  172. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  173. }
  174. else if(wParam == VK_DOWN)
  175. {
  176. rect1.bottom +=10; //按下下箭头矩形框高度加10
  177. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  178. }
  179. else if(wParam == VK_UP)
  180. {
  181. rect1.bottom -=10; //按下上箭头矩形框高度-10
  182. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  183. }
  184. else if(wParam == VK_LEFT)
  185. {
  186. rect1.right -=10; //按下左箭头矩形框高度-10
  187. InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
  188. }
  189. }
  190. break;
  191. case WM_PAINT:
  192. hDC = BeginPaint(hWnd,&ps);
  193. if(bCircle == TRUE)
  194. { //绘制圆形
  195. Ellipse(hDC,rect1.left,rect1.top,rect1.right,rect1.bottom);
  196. }
  197. if(bRect == TRUE)
  198. { //绘制矩形
  199. Rectangle(hDC,rect1.left,rect1.top,rect1.right,rect1.bottom);
  200. }
  201. EndPaint(hWnd,&ps);
  202. break;
  203. case WM_DESTROY: //处理退出窗口信息
  204. PostQuitMessage(0);
  205. return 0;
  206. default:
  207. return(DefWindowProc(hWnd,iMessage,wParam,lParam));
  208. }
  209. return 0;
  210. }
  211. BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
  212. {
  213. HWND hWnd;
  214. HMENU hMenu;
  215. hMenu = LoadMenu(hInstance,"Menu");
  216. hWnd=CreateWindow("7_10", //窗口类名称
  217. "菜单显示实例程序",  //标题栏名称
  218. WS_OVERLAPPEDWINDOW, //窗口样式
  219. CW_USEDEFAULT, //窗口左上角坐标
  220. 0,
  221. CW_USEDEFAULT, //采用缺省的高度和宽度
  222. 0,
  223. NULL, //无父窗口
  224. hMenu, //菜单
  225. hInstance, //当前应用实例句柄
  226. NULL); //指向传递给窗口的参数的指针
  227. if(!hWnd) //创建失败
  228. return FALSE;
  229. hWndMain=hWnd; //给全局窗口句柄付值
  230. ShowWindow(hWnd,nCmdShow); //显示窗口
  231. UpdateWindow(hWnd); //刷新用户区
  232. return TRUE;
  233. }
  234. BOOL InitWindowsClass(HINSTANCE hInstance)
  235. {
  236. WNDCLASS WndClass;
  237. WndClass.cbClsExtra=0; //无窗口类扩展
  238. WndClass.cbWndExtra=0; //无窗口实例扩展
  239. WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//背景为白色
  240. WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //光标为为箭头
  241. WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //采用缺省图标
  242. WndClass.hInstance=hInstance; //当前实例
  243. WndClass.lpfnWndProc=WndProc; //消息处理函数
  244. WndClass.lpszClassName="7_10"; //窗口类名称
  245. WndClass.lpszMenuName=NULL; //无菜单
  246. WndClass.style=0; //缺省窗口风格
  247. return RegisterClass(&WndClass); //返回窗口注册值
  248. }