VC++ game(四) 通过Windows API 来创建一个空窗口
作者:孙广东
前面写的都是通过MFC来进行编程,讲到缓冲机制就结束了,由于要进行3D开发,老师又开始介绍不适用MFC,直接通过windows的api来编程。、 还是从最简单的开始,创建一个窗口。 基本步骤: 1:
实例化一个窗口结构体对象,设置参数值。
可通过WNDCLASSEX或者WNDCLASS来创建,WNDCLASSEX是WNDCLASS的超级,多了两个参数,一个是结构体的大小,一个是小图标。 WNDCLASSEX的结构如下: typedef struct {
UINT cbSize; //本结构大小
UINT style; //窗口样式,
WNDPROC lpfnWndProc; //回调函数
int cbClsExtra; //类附加信息
int cbWndExtra; //窗口附加信息
HANDLE hInstance; //应用
程序实例
HICON hICON; //主图标 HCUSOR hCursor; //窗口中的光标样式
HBRUSH hbrBackground; //窗口的背景填充样式
LPCTSTR lpszMenuName; //主菜单名
LPCTSTR lpszClassName; //本类类名
HICON hIconSm; //小图标 }WNDCLASSEX;
去除红色的两个属性就是WNDCLASS结构体的内容。
style 可选CS_HREDRAW:水平刷新 CS_VERDRAW:竖直刷新等等。
lpfnWndProc:指向事件句柄函数的指针,一般是回调函数,并且是自定义的。
cbClsExtra和cbWndExtra这两个参数一般不用,设置为0。
hInstance 用WinMain函数中的形参就可以 2:
注册该窗口
注册函数:RegisterClassEx(WNDCLASSEX *);
3:
创建定义的窗口CreateWindowEx CreateWindowEx()函数原型 HWND CreateWindowEx (
DWORD dwExStyle, //窗口的样式一般设为NULL LPCTSTR lpClassName, //前面定义的窗口类名 LPCTSTR lpWindowName, //窗口标题名 DWORD dwStyle, //外观行为的通用标志 intx,inty, //窗口左上角在屏幕中的位置 int nWidth, int nHeith, //窗口的大小
HWND hWndParent,//父窗口的句柄,如果没设为NULL
HMENU hMenu, //菜单的句柄,如果没有设为NULL HINSTANCE hInstance,//窗口实例,WinMain中的hinstance
LPVOID lpParam//高级特征 );
4:创建事件句柄
事件句柄就是当事件发生时Windows从主事件循环调用回调函数。 MyWinProc原型
LRESULT CALLBACK MyWinProc (
HWND hwnd,// UINT msg,// WPARAM wparam,// LPARAM lparam// );
5:构建主事件循环 MSG msg;
while(GetMessage(&;msg,NULL,0,0)) {
TranslateMessage(&;msg);
DispatchMessage(&;msg); }
通过上面五个步骤就可以创建一个空窗口了。 实例代码如下:
[cpp] view plaincopyprint?
1. #include
2. #include 3.
4. LRESULT CALLBACK MyWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM
lparam) 5. {/*
6. PAINTSTRUCT PS; 7. HDC hdc;*/ 8. switch(msg) 9. {
10. case WM_CREATE: 11. break; 12.
13. //case WM_PAINT: 14. // {
15. // hdc=BeginPaint(hwnd&;ps); 16. // EndPaint(hwnd&;ps); 17. // return 0; 18. // } 19. //break;
20. case WM_DESTROY:
21. PostQuitMessage(0); 22. break; 23. default: 24. break; 25. }
26. return ::DefWindowProc(hwnd,msg,wparam,lparam); 27. 28. } 29.
30. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR l
pCmdLine,int nCmdShow) 31.
32. {
33. //MessageBox(NULL,"THERE CAN BE ONLY ONE!!!","MY FIRST WINDOWS
PROGRAM.",MB_OK|MB_ICONEXCLAMATION); 34. //MessageBeep(MB_OK); 35.
36. WNDCLASSEX wcex= 37. {
38. sizeof(WNDCLASSEX),CS_HREDRAW|CS_VREDRAW, 39. MyWinProc, 40. 0, 41. 0,
42. hInstance,
43. LoadIcon(NULL,IDI_APPLICATION), 44. LoadCursor(NULL,IDC_ARROW),
45. (HBRUSH)GetStockObject(GRAY_BRUSH), 46. NULL,
47. "MyWndClass",
48. LoadIcon(NULL,IDI_APPLICATION) 49. 50. }; 51.
52. RegisterClassEx(&;wcex); 53.
54. HWND hwnd;
55. hwnd=CreateWindowEx 56. (
57. NULL,
58. "MyWndClass", 59. "My First Windo