《逐梦旅程:Windows游戏编程之从零开始》学习条记之二:GDI框架

时间:2021-08-12 04:01:53

1 //===========================================【措施说明】=================================== 2 // 2018_3_5 3 // 描述:实现GDI游戏开发所需要的核心措施 4 //========================================================================================== 5 6 //===========================================【头文件包罗部分】============================= 7 // 描述:包罗措施所依赖的头文件 8 //========================================================================================== 9 10 #include <Windows.h> 11 12 //==============================================【库文件包罗部分】========================== 13 // 描述:包罗措施所依赖的库文件 14 //========================================================================================== 15 16 17 //=============================================【宏界说】==================================== 18 // 描述:界说一些帮助宏 19 //=========================================================================================== 20 21 #define WINDOW_WIDTH 800 //为窗口宽度界说的宏,以便利在此处改削窗口宽度 22 #define WINDOW_HEIGHT 600 //为窗口高度界说的宏,以便利在此处改削窗口高度 23 #define WINDOW_TITLE L"【致我们永不磨灭的梦想】GDI措施框架" //为窗口标题界说的宏,以便利在此处改削窗口标题 24 25 //===========================================【全局变量声明】===================================== 26 // 描述:全局变量声明 27 //================================================================================================ 28 29 HDC g_hdc = NULL; //全局设备环境句柄 30 31 //================================================【全局函数声明】============================ 32 // 描述:全局函数声明,防备“未声明的标识”系列错误 33 //============================================================================================ 34 35 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); //窗口过程函数 36 37 BOOL Game_Init(HWND hWnd); //在此函数中进行资源的初始化 38 void Game_Paint(HWND hWnd); //在此函数中进行绘图代码的书写 39 BOOL Game_CleanUp(HWND hWnd); //在此函数中进行资源的清理 40 41 //=================================================【WinMain()函数】============================== 42 // 描述:WINDOW应用措施的入口函数,我们的措施从这里开始 43 //================================================================================================= 44 45 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) 46 { 47 //【1】窗口创建四部曲之一:开始设计一个完整的窗口类 48 49 WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX界说一个窗口类 50 wndClass.cbSize = sizeof( WNDCLASSEX ); //设置布局体的字节数巨细 51 wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口的样式 52 wndClass.lpfnWndProc = WndProc; //设置只想窗口过程函数的指针 53 wndClass.cbClsExtra = 0; //窗口类的附加内存,取0即可 54 wndClass.cbWndExtra = 0; //窗口的附加内存,取0即可 55 wndClass.hInstance = hInstance; //指定包罗窗口过程的措施的实例句柄 56 wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加载自界说ico图标 57 wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //制定窗口类的光标句柄 58 wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //为hbrBackground成员指定一个灰色画刷句柄 59 wndClass.lpszMenuName = NULL; //用一个以空终止的字符串,指定菜单资源的名字 60 wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //用一个以空终止的字符串,指定窗口类的名字 61 62 //HICON hIconSm; 63 64 //【2】窗口常见四部曲之二:注册窗口类 65 66 if(!RegisterClassEx(&wndClass)) //设计完窗口后,需要对窗口类进行注册,这样才华创建该类型的窗口 67 { 68 return -1; 69 } 70 71 //【3】窗口创建四部曲之三:正式创建窗口 72 73 HWND hWnd = CreateWindow(L"ForTheDreamOfGameDevelop",WINDOW_TITLE, 74 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, 75 WINDOW_HEIGHT, NULL, NULL, hInstance, NULL 76 ); 77 78 //【4】窗口创建四部曲之四:窗口的移动、显示与更新 79 80 MoveWindow(hWnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true); //调解窗口显示时的位置,使窗口左上角位于(250, 80)处 81 82 ShowWindow(hWnd, nShowCmd); //挪用此函数显示窗口 83 84 UpdateWindow(hWnd); //对窗口进行更新,就像我们买了新房装修 85 86 //【5】动静循环过程 87 88 MSG msg = {0}; //界说并初始化msg 89 while (msg.message != WM_QUIT) //使用while循环,如果雄安喜不是WM_QUIT动静,就继续循环 90 { 91 if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) //检察应用措施动静行列队伍,有动静时从行列队伍中的动静派发出去 92 { 93 TranslateMessage(&msg); //将虚拟键动静转换为字符动静 94 DispatchMessage(&msg); //分发一个雄安喜给窗口措施 95 } 96 } 97 98 //【6】窗口类的注销 99 100 UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //措施转杯结束,注销窗口类 101 102 return 0; 103 } 104 105 //=========================================【WndProc()函数】===================================== 106 // 描述:窗口过程函数wndproc对敞口动静进行措置惩罚惩罚 107 //=============================================================================================== 108 109 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 110 { 111 PAINTSTRUCT paintStruct; //界说一个PAINTSTRUCT布局体来记录一些绘制信息 112 113 switch(message) //seitch语句开始 114 { 115 case WM_PAINT: // 若是客户区重绘动静 116 g_hdc = BeginPaint(hWnd, &paintStruct); //指定窗口进行绘制事情的筹备,并用将和绘图有关的信息填充到paintStruct布局体中 117 Game_Paint(hWnd); 118 EndPaint(hWnd, &paintStruct); //paintStruct函数符号制定窗口的绘画过程结束 119 ValidateRect(hWnd, NULL); // 更新客户区的显示 120 break; 121 122 case WM_KEYDOWN: // 若是键盘按下动静 123 if(wParam == VK_ESCAPE) // 如果被按下的键是ESC 124 { 125 DestroyWindow(hWnd); // 销毁窗口, 并发送一条WM_DESTROY动静 126 127 } 128 break; 129 130 case WM_DESTROY: //若是窗口销毁动静 131 Game_CleanUp(hWnd);//挪用自界说的资源清理函数Game_CleanUp()进行退出前的资源清理 132 PostQuitMessage(0); //向系统表白有个线程有终止请求。用来响应WM_DESTROY动静 133 break; 134 135 default: //若上述case条件都不切合,,则执行该default语句 136 return DefWindowProc(hWnd, message, wParam, lParam); //挪用缺省的窗口过程 137 } 138 139 return 0; //正常退出 140 } 141 142 //========================================【Game_Init()函数】===================================== 143 // 描述:初始化函数,进行一些简单的初始化 144 //================================================================================================ 145 146 BOOL Game_Init(HWND hWnd) //在此函数中进行资源的初始化 147 { 148 g_hdc = GetDC(hWnd); //获取设设备环境句柄 149 Game_Paint(hWnd); 150 ReleaseDC(hWnd, g_hdc); //释放设备环境 151 return TRUE; 152 } 153 154 //========================================【Game_Paint()函数】==================================== 155 // 描述:绘制函数,在此函数中进行绘制操纵 156 //================================================================================================ 157 158 void Game_Paint(HWND hWnd) //在此函数中进行绘图代码的书写 159 { 160 161 } 162 163 //========================================【Game_CleanUp()函数】================================== 164 // 描述:资源清理函数,在此函数中进行退出前资源的清理事情 165 //================================================================================================ 166 167 BOOL Game_CleanUp(HWND hWnd) 168 { 169 return TRUE; 170 }