newTest.cpp
上传用户:mugkiss
上传日期:2022-08-05
资源大小:1360k
文件大小:7k
源码类别:

其他小程序

开发平台:

Visual C++

  1. // newTest.cpp : 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "newTest.h"
  5. #define MAX_LOADSTRING 100
  6. #include <math.h>
  7. // 全局变量:
  8. HINSTANCE hInst; // 当前实例
  9. TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  10. TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  11. // 此代码模块中包含的函数的前向声明:
  12. ATOM MyRegisterClass(HINSTANCE hInstance);
  13. BOOL InitInstance(HINSTANCE, int);
  14. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  15. LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  16. int APIENTRY _tWinMain(HINSTANCE hInstance,
  17.                      HINSTANCE hPrevInstance,
  18.                      LPTSTR    lpCmdLine,
  19.                      int       nCmdShow)
  20. {
  21.   // TODO: 在此放置代码。
  22. MSG msg;
  23. HACCEL hAccelTable;
  24. // 初始化全局字符串
  25. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  26. LoadString(hInstance, IDC_NEWTEST, szWindowClass, MAX_LOADSTRING);
  27. MyRegisterClass(hInstance);
  28. // 执行应用程序初始化:
  29. if (!InitInstance (hInstance, nCmdShow)) 
  30. {
  31. return FALSE;
  32. }
  33. hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NEWTEST);
  34. // 主消息循环:
  35. while (GetMessage(&msg, NULL, 0, 0)) 
  36. {
  37. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
  38. {
  39. TranslateMessage(&msg);
  40. DispatchMessage(&msg);
  41. }
  42. }
  43. return (int) msg.wParam;
  44. }
  45. //
  46. //  函数: MyRegisterClass()
  47. //
  48. //  目的: 注册窗口类。
  49. //
  50. //  注释: 
  51. //
  52. //    仅当希望在已添加到 Windows 95 的
  53. //    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
  54. //    才需要此函数及其用法。调用此函数
  55. //    十分重要,这样应用程序就可以获得关联的
  56. //   “格式正确的”小图标。
  57. //
  58. ATOM MyRegisterClass(HINSTANCE hInstance)
  59. {
  60. WNDCLASSEX wcex;
  61. wcex.cbSize = sizeof(WNDCLASSEX); 
  62. wcex.style = CS_HREDRAW | CS_VREDRAW;
  63. wcex.lpfnWndProc = (WNDPROC)WndProc;
  64. wcex.cbClsExtra = 0;
  65. wcex.cbWndExtra = 0;
  66. wcex.hInstance = hInstance;
  67. wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_NEWTEST);
  68. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  69. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  70. wcex.lpszMenuName = (LPCTSTR)IDC_NEWTEST;
  71. wcex.lpszClassName = szWindowClass;
  72. wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
  73. return RegisterClassEx(&wcex);
  74. }
  75. //
  76. //   函数: InitInstance(HANDLE, int)
  77. //
  78. //   目的: 保存实例句柄并创建主窗口
  79. //
  80. //   注释: 
  81. //
  82. //        在此函数中,我们在全局变量中保存实例句柄并
  83. //        创建和显示主程序窗口。
  84. //
  85. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  86. {
  87.    HWND hWnd;
  88.    hInst = hInstance; // 将实例句柄存储在全局变量中
  89.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  90.       CW_USEDEFAULT, 0, 640, 480, NULL, NULL, hInstance, NULL);
  91.    if (!hWnd)
  92.    {
  93.       return FALSE;
  94.    }
  95.    ShowWindow(hWnd, nCmdShow);
  96.    UpdateWindow(hWnd);
  97.    return TRUE;
  98. }
  99. //
  100. //  函数: WndProc(HWND, unsigned, WORD, LONG)
  101. //
  102. //  目的: 处理主窗口的消息。
  103. //
  104. //  WM_COMMAND - 处理应用程序菜单
  105. //  WM_PAINT - 绘制主窗口
  106. //  WM_DESTROY - 发送退出消息并返回
  107. //
  108. //
  109. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  110. {
  111. int wmId, wmEvent;
  112. PAINTSTRUCT ps;
  113. HDC hdc;
  114. static HBITMAP bgmap;
  115. static HBITMAP NpcMap;
  116. static HDC memBgDc;
  117. static BITMAP bmpinfo;
  118. static int action;
  119. static HDC npcmemDc;
  120. static POINT npcPoint;
  121. static int speed;
  122. static POINT targetPoint;//使用鼠标控制时人物要移动到的目标位置
  123. static double distance;
  124. static HDC memDc;
  125. static HBITMAP membit;
  126. static RECT clientRect;
  127. switch (message) 
  128. {
  129. case WM_CREATE:
  130. bgmap=(HBITMAP)LoadImage(hInst,"city.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  131. NpcMap=(HBITMAP)LoadImage(hInst,"npc00.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  132. memDc=::CreateCompatibleDC(GetDC(hWnd));
  133. memBgDc=CreateCompatibleDC(GetDC(hWnd));
  134. npcmemDc=CreateCompatibleDC(GetDC(hWnd));
  135. SetTimer(hWnd,1,90,NULL);
  136. npcPoint.x = 10;
  137. npcPoint.y =10;
  138. speed=5;
  139. GetClientRect(hWnd,&clientRect);
  140. membit=CreateCompatibleBitmap(GetDC(hWnd),clientRect.right-clientRect.left,clientRect.bottom-clientRect.top);
  141. break;
  142. case WM_TIMER:
  143. {
  144. action=((action+1)>1)?0:action+1;
  145. //人物状态刷新
  146. double xdistance = targetPoint.x - npcPoint.x;
  147. double ydistance = targetPoint.y - npcPoint.y;
  148. distance= _hypot(xdistance,ydistance);
  149. /*npcPoint.x = targetPoint.x;
  150. npcPoint.y = targetPoint.y;*/
  151. if (distance > 5)
  152. {
  153. npcPoint.x += speed*xdistance/distance;
  154. npcPoint.y += speed*ydistance/distance;
  155. }
  156. InvalidateRect(hWnd,NULL,FALSE);//flase 擦除前次绘画
  157. }
  158. break;
  159. case WM_LBUTTONDOWN:
  160. targetPoint.x=LOWORD(lParam);
  161. targetPoint.y=HIWORD(lParam);
  162. case WM_KEYDOWN:
  163. switch (wParam)
  164. {
  165. case VK_DOWN:
  166. if (GetKeyState((VK_SHIFT))&0x80)
  167. {
  168. npcPoint.y+=speed*2;
  169. }
  170. npcPoint.y+=speed;
  171. break;
  172. case VK_UP:
  173. if (GetKeyState((VK_SHIFT))&0x80)
  174. {
  175. npcPoint.y-=speed*2;
  176. }
  177. npcPoint.y-=speed;
  178. break;
  179. case VK_LEFT:
  180. if (GetKeyState((VK_SHIFT))&0x80)
  181. {
  182. npcPoint.x-=speed*2;
  183. }
  184. npcPoint.x-=speed;
  185. break;
  186. case VK_RIGHT:
  187. if (GetKeyState((VK_SHIFT))&0x80)
  188. {
  189. npcPoint.x+=speed*2;
  190. }
  191. npcPoint.x+=speed;
  192. break;
  193. }
  194. break;
  195. case WM_COMMAND:
  196. wmId    = LOWORD(wParam); 
  197. wmEvent = HIWORD(wParam); 
  198. // 分析菜单选择:
  199. switch (wmId)
  200. {
  201. case IDM_ABOUT:
  202. DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  203. break;
  204. case IDM_EXIT:
  205. DestroyWindow(hWnd);
  206. break;
  207. default:
  208. return DefWindowProc(hWnd, message, wParam, lParam);
  209. }
  210. break;
  211. case WM_PAINT:
  212. hdc = BeginPaint(hWnd, &ps);
  213. SelectObject(memDc,membit);
  214. GetObject(bgmap,sizeof(BITMAP),&bmpinfo);
  215. SelectObject(memBgDc,bgmap);
  216. BitBlt(memDc,0,0,clientRect.right,clientRect.bottom,memBgDc,0,0,SRCCOPY);
  217. //人物资源
  218. GetObject(NpcMap,sizeof(BITMAP),&bmpinfo);
  219. SelectObject(npcmemDc,NpcMap);
  220. TransparentBlt(memDc,
  221. npcPoint.x,npcPoint.y //npc初始位置
  222. ,bmpinfo.bmWidth/2,bmpinfo.bmHeight/4,//绘制到设备环境时的人物尺寸
  223. npcmemDc,
  224. action*bmpinfo.bmWidth/2,0//兼容设备环境上的截取位置
  225. ,bmpinfo.bmWidth/2,bmpinfo.bmHeight/4,//截取尺寸
  226. RGB(0,255,0));
  227. BitBlt(hdc,0,0,640,480,memDc,0,0,SRCCOPY);
  228. // TODO: 在此添加任意绘图代码...
  229. EndPaint(hWnd, &ps);
  230. break;
  231. case WM_DESTROY:
  232. PostQuitMessage(0);
  233. break;
  234. default:
  235. return DefWindowProc(hWnd, message, wParam, lParam);
  236. }
  237. return 0;
  238. }
  239. // “关于”框的消息处理程序。
  240. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  241. {
  242. switch (message)
  243. {
  244. case WM_INITDIALOG:
  245. return TRUE;
  246. case WM_COMMAND:
  247. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  248. {
  249. EndDialog(hDlg, LOWORD(wParam));
  250. return TRUE;
  251. }
  252. break;
  253. }
  254. return FALSE;
  255. }