逐梦旅程 Windows游戏编程 第一篇:使用C++实现一个Windows窗体
今天起开始学习游戏编程,我看的是一本CSDN博主【浅墨】的书《逐梦旅程:Windows游戏编程之从零开始》
此博客记录自己在学习中所掌握的代码:
先看第一篇:启航·夯实游戏程序之根
本章讲的是C++的游戏编程基础
总篇最后是创建一个窗口的完整代码:
总的说明了创建一个窗体的具体步骤:创建一个窗体 WinMain函数->窗口创建四部曲->消息循环->窗口类的注销->窗口过程函数
经过下面的代码一个窗体几乎就创建好啦,每行都有清晰注释
Code:
- //-----------------------------【程序说明】----------------------------------------
- //程序名称:GameCore
- //2019年1月 Create by Lamica
- //描述:用代码勾勒出游戏开发所需程序框架
- //--------------------------------------------------------------------------------
- //-----------------------------【头部包含部分】-------------------------------------
- //描述:包含程序所依赖的头文件
- //----------------------------------------------------------------------------------
- #include <Windows.h>
- //------------------------------【宏定义部分】----------------------------------------
- //描述:定义一些辅助宏
- //-----------------------------------------------------------------------------------
- #define WINDOW_WIDTH 800 //为窗口宽度定义宏,以方便在此处修改窗口宽度
- #define WINDOW_HEIGHT 600 //为窗口高度定义宏,以方便在此处修改窗口高度
- #define WINDOW_TITLE L"【致我们永不熄灭的游戏开发梦想】程序核心框架" //为窗口标题定义的宏
- //------------------------------【全局函数声明】-----------------------------------------
- //描述:全局函数声明,防止“未声明的标识”系列错误
- //-------------------------------------------------------------------------------------
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
- //-------------------------------【WinMain()函数】---------------------------------------
- //描述:Windows应用程序入口函数,我们的程序从这里开始
- //------------------------------------------------------------------------------------
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
- //【1】窗口创建四步曲之一:开始设计一个完整的窗口类
- WNDCLASSEX wndClass = { 0 };//用WNDCLASSEX定义了一个窗口类
- wndClass.cbSize = sizeof(WNDCLASSEX);//设置结构体的字节数大小
- wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口样式
- wndClass.lpfnWndProc = WndProc; //设置指向窗口过程函数的指针
- wndClass.cbClsExtra = 0;//窗口类的附加内存,取0就可以了
- wndClass.cbWndExtra = 0;//窗口的附加内存,依然取0就可以了
- wndClass.hInstance = hInstance;//指定包含窗口过程的程序实例句柄
- wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加载自定义ico图标
- wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//指定窗口类的光标句柄
- wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground成员指定一个灰色画刷句柄
- wndClass.lpszMenuName = NULL;//用一个以空终止的字符串,指定菜单资源的名字。
- wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";//用一个以空终止的字符串,指定窗口的名字。
- //【2】窗口创建四步曲之二:注册窗口类
- if (!RegisterClassEx(&wndClass))//设计完窗口后,需要对窗口类进行注册,这样才能创建该类型窗口
- {
- return -1;
- }
- //【3】窗口创建四步曲之三:正式创建窗口
- HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE,//喜闻乐见的创建窗口函数CreateWindow
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
- //【4】窗口创建四步曲之四:窗口的移动,显示与更新
- MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//调整窗口显示时的位置,使窗口左上角位于(250,80)处
- ShowWindow(hwnd, nShowCmd);//调用ShowWindow函数来显示窗口
- UpdateWindow(hwnd);//对窗口进行更新,就像我们买了新房子要装修一样
- //【5】消息循环过程
- MSG msg = { 0 }; //定义并初始化msg
- while (msg.message != WM_QUIT) //使用while循环,如果消息不是WM_QUIT消息,就继续循环
- {
- if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) //查看应用程序消息队列,有消息时将队列中消息派发出去
- {
- TranslateMessage(&msg); //将虚拟键消息转换为字符消息
- DispatchMessage(&msg);//分发一个消息给窗口程序
- }
- }
- //【6】窗口类的注销
- UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序准备结束,注销窗口类
- return 0;
- }
- //------------------------------------------【WndProc()函数】-------------------------------------
- //描述:窗口过程函数WndProc(回调函数),对窗口消息进行处理
- //-----------------------------------------------------------------------------------------------
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
- switch (message) //switch 语句开始
- {
- case WM_PAINT://若是客户区重绘消息
- ValidateRect(hwnd, NULL);//更新客户区的显示
- break;//跳出该switch语句
- case WM_KEYDOWN://若是键盘按下消息
- if (wParam == VK_ESCAPE) //如果被按下的是ESC
- {
- DestroyWindow(hwnd); //销毁窗口,并发送一条WM_DESTROY消息
- }
- break;//跳出该switch语句
- case WM_DESTROY://若是窗口销毁消息
- PostQuitMessage(0);//向系统表明有个线程终止请求。用来响应WM_DESTROY消息
- break;//跳出该switch语句
- default://若上述case条件都不符合,则执行该default语句
- return DefWindowProc(hwnd, message, wParam, lParam);//调用默认窗口过程
- }
- return 0;//正常退出
- }
F5执行结果:
这样一个C++窗体就创建完成了
最后分享浅墨大大的一句话:
我们会觉得焦虑,无非是因为现在的我们跟想像中的自己很有差距。打败焦虑的最好方法,就是去做那些让你焦虑的事情,不要问,不要等,不要犹豫,不要回头,既然你认准了这条路,就不要去打听要走多久。
对自己的总结:之前自己是写C#,和VB.NET的,用他们创建一个窗体,只要会托控件就行了,但是在C++这里,感觉自己离底层更近了,windows的消息处理机制,以及窗口的销毁,创建整个生命周期在C#,与VB.NET中是完全感觉不到了。
为了游戏编程梦加油发。
本文作者:兰purvis
本文链接:https://www.cnblogs.com/purvis/articles/10204981.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步