逐梦旅程 Windows游戏编程 第一篇:使用C++实现一个Windows窗体


今天起开始学习游戏编程,我看的是一本CSDN博主【浅墨】的书《逐梦旅程:Windows游戏编程之从零开始》

此博客记录自己在学习中所掌握的代码:

先看第一篇:启航·夯实游戏程序之根

本章讲的是C++的游戏编程基础

总篇最后是创建一个窗口的完整代码:

 总的说明了创建一个窗体的具体步骤:创建一个窗体 WinMain函数->窗口创建四部曲->消息循环->窗口类的注销->窗口过程函数

经过下面的代码一个窗体几乎就创建好啦,每行都有清晰注释

Code:  

  1. //-----------------------------【程序说明】----------------------------------------  
  2. //程序名称:GameCore  
  3. //2019年1月 Create by Lamica  
  4. //描述:用代码勾勒出游戏开发所需程序框架  
  5. //--------------------------------------------------------------------------------  
  6.   
  7.   
  8. //-----------------------------【头部包含部分】-------------------------------------  
  9. //描述:包含程序所依赖的头文件  
  10. //----------------------------------------------------------------------------------  
  11. #include <Windows.h>  
  12.   
  13. //------------------------------【宏定义部分】----------------------------------------  
  14. //描述:定义一些辅助宏  
  15. //-----------------------------------------------------------------------------------  
  16. #define WINDOW_WIDTH 800  //为窗口宽度定义宏,以方便在此处修改窗口宽度  
  17. #define WINDOW_HEIGHT 600  //为窗口高度定义宏,以方便在此处修改窗口高度  
  18. #define WINDOW_TITLE L"【致我们永不熄灭的游戏开发梦想】程序核心框架" //为窗口标题定义的宏  
  19.   
  20. //------------------------------【全局函数声明】-----------------------------------------  
  21. //描述:全局函数声明,防止“未声明的标识”系列错误  
  22. //-------------------------------------------------------------------------------------  
  23. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);  
  24.   
  25. //-------------------------------【WinMain()函数】---------------------------------------  
  26. //描述:Windows应用程序入口函数,我们的程序从这里开始  
  27. //------------------------------------------------------------------------------------  
  28. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {  
  29.     //【1】窗口创建四步曲之一:开始设计一个完整的窗口类  
  30.     WNDCLASSEX wndClass = { 0 };//用WNDCLASSEX定义了一个窗口类  
  31.     wndClass.cbSize = sizeof(WNDCLASSEX);//设置结构体的字节数大小  
  32.     wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口样式  
  33.     wndClass.lpfnWndProc = WndProc; //设置指向窗口过程函数的指针  
  34.     wndClass.cbClsExtra = 0;//窗口类的附加内存,取0就可以了  
  35.     wndClass.cbWndExtra = 0;//窗口的附加内存,依然取0就可以了  
  36.     wndClass.hInstance = hInstance;//指定包含窗口过程的程序实例句柄  
  37.     wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加载自定义ico图标  
  38.     wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//指定窗口类的光标句柄  
  39.     wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground成员指定一个灰色画刷句柄  
  40.     wndClass.lpszMenuName = NULL;//用一个以空终止的字符串,指定菜单资源的名字。  
  41.     wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";//用一个以空终止的字符串,指定窗口的名字。  
  42.   
  43.     //【2】窗口创建四步曲之二:注册窗口类  
  44.     if (!RegisterClassEx(&wndClass))//设计完窗口后,需要对窗口类进行注册,这样才能创建该类型窗口  
  45.     {  
  46.         return -1;  
  47.     }  
  48.   
  49.     //【3】窗口创建四步曲之三:正式创建窗口  
  50.     HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE,//喜闻乐见的创建窗口函数CreateWindow  
  51.         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);  
  52.   
  53.     //【4】窗口创建四步曲之四:窗口的移动,显示与更新  
  54.     MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//调整窗口显示时的位置,使窗口左上角位于(250,80)处  
  55.     ShowWindow(hwnd, nShowCmd);//调用ShowWindow函数来显示窗口  
  56.     UpdateWindow(hwnd);//对窗口进行更新,就像我们买了新房子要装修一样  
  57.     //【5】消息循环过程  
  58.     MSG msg = { 0 };  //定义并初始化msg  
  59.     while (msg.message != WM_QUIT) //使用while循环,如果消息不是WM_QUIT消息,就继续循环  
  60.     {  
  61.         if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) //查看应用程序消息队列,有消息时将队列中消息派发出去  
  62.         {  
  63.             TranslateMessage(&msg); //将虚拟键消息转换为字符消息  
  64.             DispatchMessage(&msg);//分发一个消息给窗口程序  
  65.         }  
  66.     }  
  67.   
  68.     //【6】窗口类的注销  
  69.     UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序准备结束,注销窗口类  
  70.     return 0;  
  71. }  
  72.   
  73. //------------------------------------------【WndProc()函数】-------------------------------------  
  74. //描述:窗口过程函数WndProc(回调函数),对窗口消息进行处理  
  75. //-----------------------------------------------------------------------------------------------  
  76. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {  
  77.     switch (message)  //switch 语句开始  
  78.     {  
  79.     case WM_PAINT://若是客户区重绘消息  
  80.         ValidateRect(hwnd, NULL);//更新客户区的显示  
  81.         break;//跳出该switch语句  
  82.     case WM_KEYDOWN://若是键盘按下消息  
  83.         if (wParam == VK_ESCAPE) //如果被按下的是ESC  
  84.         {  
  85.             DestroyWindow(hwnd); //销毁窗口,并发送一条WM_DESTROY消息  
  86.         }  
  87.         break;//跳出该switch语句  
  88.     case WM_DESTROY://若是窗口销毁消息  
  89.         PostQuitMessage(0);//向系统表明有个线程终止请求。用来响应WM_DESTROY消息  
  90.         break;//跳出该switch语句  
  91.     default://若上述case条件都不符合,则执行该default语句  
  92.         return DefWindowProc(hwnd, message, wParam, lParam);//调用默认窗口过程  
  93.     }  
  94.     return 0;//正常退出  


F5执行结果:

Windows窗体执行结果

 

这样一个C++窗体就创建完成了

 

 最后分享浅墨大大的一句话:

我们会觉得焦虑,无非是因为现在的我们跟想像中的自己很有差距。打败焦虑的最好方法,就是去做那些让你焦虑的事情,不要问,不要等,不要犹豫,不要回头,既然你认准了这条路,就不要去打听要走多久。

 

 

 对自己的总结:之前自己是写C#,和VB.NET的,用他们创建一个窗体,只要会托控件就行了,但是在C++这里,感觉自己离底层更近了,windows的消息处理机制,以及窗口的销毁,创建整个生命周期在C#,与VB.NET中是完全感觉不到了。

 

 

为了游戏编程梦加油发。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM