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

摘要:
//=============================================[过程描述]================================2/2018_3_53//描述:GDI游戏开发所需的核心程序4//============================================================================
  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 }    

 并添加相应资源图片到工程文件夹中。

免责声明:文章转载自《《逐梦旅程:Windows游戏编程之从零开始》学习笔记之二:GDI框架》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇offcputime 火焰图[转载]DSP2812 ECan总线中ECanaShadow的理解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在双系统( Win7 + Ubuntu )环境下正常删除Ubuntu

前言   首先切记一点:如果你和我一样使用ubuntu的目的是学习操作系统和Unix网络编程等,那么学习环境搭建好了以后切不要随意更新软件。否则系统崩溃,你又得重新配置各种环境,有多麻烦你懂的。   万一你像我之前一样手贱点了软件升级导致系统崩溃了,请不要花太多时间在网上搜索怎样挽回,直接重装吧。网上,尤其是百度知道上的解决方案大都不靠谱。   下面回到本...

windows系统中git下拉代码同名大小写文件系统冲突问题解决

关于git拉取gitee的代码到windows本地,执行测试报错,原因是windows下不能区分大小写两个相同的文件名 warning: the following paths have collided (e.g. case-sensitive pathson a case-insensitive filesystem) and only one fr...

qcow2镜像制作

windows 1、准备windows镜像、驱动镜像。 驱动下载地址: https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html 2、上传windows镜像到云平台 利用iso启动一个系...

lua 的io操作,非常详细

Lua 标准库 - 输入输出处理(input and output facilities) I/O库提供两种不同的方式进行文件处理 1、io表调用方式:使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述 io表同样提供三种预定义的文件描述io.stdin,io.stdout,io.stderr 2、文件句柄直接调用方式,即使用...

安装ubuntu双系统

今天在win7下安装ubuntu14.1双系统,别折磨了一个下午。主要是开机系统引导问题。 引导程序是位于硬盘最前面的一段程序,由于扇区大部分是引导程序,故也成引导扇区。此外包含有硬盘的分区信息,共64个字节,16个字节表示一个分区, 故最多只能有4个主分区。若要超过四个分区,需先建立扩展分区,在扩展分区上面划分逻辑分区。分区表中只需要保存扩展分区地址即可...

解决关闭窗口,C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

情况:在C#开发的过程中多线程委托是经常用的,今天在测试以前写的软件的时候发现有个问题,报 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。 这样的错误。 解决方法:加上 if (this.IsHandleCreated) 1、首先分析问题,句柄:是对象的引用名,存于栈区(可以理解为对象的指针),对象是存于堆区,通过操控栈区...