欢迎来到 Purvisの部落格.|

兰purvis

园龄:7年10个月粉丝:12关注:42

逐梦旅程 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中是完全感觉不到了。

 

 

为了游戏编程梦加油发。

 

本文作者:兰purvis

本文链接:https://www.cnblogs.com/purvis/articles/10204981.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   兰purvis  阅读(3418)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作曲 : Reol

作词 : Reol

fade away...do over again...

fade away...do over again...

歌い始めの一文字目 いつも迷ってる

歌い始めの一文字目 いつも迷ってる

どうせとりとめのないことだけど

伝わらなきゃもっと意味がない

どうしたってこんなに複雑なのに

どうしたってこんなに複雑なのに

噛み砕いてやらなきゃ伝わらない

ほら結局歌詞なんかどうだっていい

僕の音楽なんかこの世になくたっていいんだよ

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.

目の前 広がる現実世界がまた歪んだ

目の前 広がる現実世界がまた歪んだ

何度リセットしても

僕は僕以外の誰かには生まれ変われない

「そんなの知ってるよ」

気になるあの子の噂話も

シニカル標的は次の速報

麻痺しちゃってるこっからエスケープ

麻痺しちゃってるこっからエスケープ

遠く遠くまで行けるよ

安定なんてない 不安定な世界

安定なんてない 不安定な世界

安定なんてない きっと明日には忘れるよ

fade away...do over again...

fade away...do over again...

そうだ世界はどこかがいつも嘘くさい

そうだ世界はどこかがいつも嘘くさい

綺麗事だけじゃ大事な人たちすら守れない

くだらない 僕らみんなどこか狂ってるみたい

本当のことなんか全部神様も知らない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.