OWN”消息。
<2>第6行:以“switch”叙述判断“wParam”的值来得知哪个按键被按下,并运行对应“case”中的按键消息处理程序。
同样的,我们用一个实例来让大家熟悉和实践一下本节的知识。
这个范例会让玩家以【↑】【↓】【←】【→】键进行输入,控制画面中人物的移动,这里使用了人物在4个不同方向上走动的连续图案
废话也不多说了,直接上详细注释的代码:
[cpp] view plaincopyprint?
1. #include "stdafx.h" 2. #include
3.
4. //全局变量声明 5. HINSTANCE hInst; 6. HBITMAP girl[4],bg; 7. HDC hdc,mdc,bufdc; 8. HWND hWnd; 9. DWORD tPre,tNow;
10. int num,dir,x,y; //x,y变量为人物贴图坐标,dir为人物移动方向,这里
我们中以0,1,2,3代表人物上,下,左,右方向上的移动:num为连续贴图中的小图编号 11.
12. //全局函数声明
13. ATOM MyRegisterClass(HINSTANCE hInstance); 14. BOOL InitInstance(HINSTANCE, int);
15. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 16. void MyPaint(HDC hdc); 17.
18. //****WinMain函数,程序入口点函数*********************** 19. int APIENTRY WinMain(HINSTANCE hInstance, 20. HINSTANCE hPrevInstance, 21. LPSTR lpCmdLine, 22. int nCmdShow) 23. {
24. MSG msg; 25.
26. MyRegisterClass(hInstance); 27.
28. //初始化
29. if (!InitInstance (hInstance, nCmdShow)) 30. {
31. return FALSE; 32. } 33.
34. GetMessage(&;msg,NULL,NULL,NULL); //初始化msg 35. //消息循环
36. while( msg.message!=WM_QUIT ) 37. {
38. if( PeekMessage( &;msg, NULL, 0,0 ,PM_REMOVE) ) 39. {
40. TranslateMessage( &;msg ); 41. DispatchMessage( &;msg ); 42. } 43. else 44. {
45. tNow = GetTickCount();
46. if(tNow-tPre >= 40) 47. MyPaint(hdc); 48. } 49. } 50.
51. return msg.wParam; 52. } 53.
54. //****设计一个窗口类,类似填空题,使用窗口结构体******************* 55. ATOM MyRegisterClass(HINSTANCE hInstance) 56. {
57. WNDCLASSEX wcex; 58.
59. wcex.cbSize = sizeof(WNDCLASSEX);
60. wcex.style = CS_HREDRAW | CS_VREDRAW; 61. wcex.lpfnWndProc = (WNDPROC)WndProc; 62. wcex.cbClsExtra = 0; 63. wcex.cbWndExtra = 0;
64. wcex.hInstance = hInstance; 65. wcex.hIcon = NULL; 66. wcex.hCursor = NULL;
67. wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 68. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 69. wcex.lpszMenuName = NULL; 70. wcex.lpszClassName = "canvas"; 71. wcex.hIconSm = NULL; 72.
73. return RegisterClassEx(&;wcex); 74. } 75.
76. //****初始化函数************************************* 77. // 加载位图并设定各种初始值
78. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 79. {
80. HBITMAP bmp; 81. hInst = hInstance; 82.
83. hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW, 84. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NUL
L); 85.
86. if (!hWnd) 87. {
88. return FALSE;
89. } 90.
91. MoveWindow(hWnd,10,10,640,480,true); 92. ShowWindow(hWnd, nCmdShow); 93. UpdateWindow(hWnd); 94.
95. hdc = GetDC(hWnd);
96. mdc = CreateCompatibleDC(hdc); 97. bufdc = CreateCompatibleDC(hdc); 98. 99.
100. //建立空的位图并置入mdc中
101. bmp = CreateCompatibleBitmap(hdc,640,480); 102. SelectObject(mdc,bmp); 103. 104.
105. //设定人物贴图初始位置和移动方向 106. x = 300; 107. y = 250; 108. dir = 0; 109. num = 0; 110.
111. //载入各连续移动位图及背景图
112. girl[0] = (HBITMAP)LoadImage(NULL,"girl0.bmp",IMAGE_BITMAP,440,14
8,LR_LOADFROMFILE);
113. girl[1] = (HBITMAP)LoadImage(NULL,"girl1.bmp",IMAGE_BITMAP,424,15
4,LR_LOADFROM