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

  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 }    

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

原文地址:https://www.cnblogs.com/WinonaJia/p/8511950.html

时间: 2024-09-29 21:00:10

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

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——Direct3D中的顶点缓存和索引缓存

第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物体模型的基本单元,而一个三角形有3个顶点,为了能够使用大量三角形组成三角形网格来描述物体,需要首先定义号三角形的顶点(Vertex),3个顶点确定一个三角形,顶点除了定义每个顶点的坐标位置外,还还含有颜色等其他属性. 在Direct3D中,顶点的具体表现形式是顶点缓存,顶点缓存保存了顶点数据的内存空

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D编程基础

第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥的就不说了,直接进入正题,先来个典型的Direct3D程序框架图: 主要分为5个部分: 创建一个Windows窗口 Direct3D的初始化 消息循环 渲染图形 结束应用程序,清除在初始化阶段锁创建的COM对象,退出程序 至于COM (Component Object Model, 组件对象模型)

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记10——三维天空的构建&amp;三维粒子的实现&amp;多游戏模型的载入

第23章 三维天空的构建 目前描述三维天空的技术主要包括三种类型,直接来介绍使用最广泛的模拟技术,详细的描述可以见作者的博文. 天空盒(Sky Box),即放到场景的是一个立方体.它是目前使用最广泛的三维天空模拟技术,网络上素材丰富,所以这次就用教大家用天空盒来模拟三维天空.天空盒经常是由24个顶点.六个面组成的立方体(或者直接从做好的X模型文件载入天空盒),并经常会随着视点的移动而移动,来刻画极远处玩家无法达到位置的天空 天空盒的设计 1.准备天空盒纹理素材 天空盒的纹理自然就是我们这个天空盒

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记7——四大变换

第13章 世界变换,取景变换,投影变换,视口变换 在Direct3D中,如果为进行任何空间坐标变换而直接绘图的话,图形将始终处于应用程序窗口的中心位置,默认这个位置就成为世界坐标系的原点(0,0,0).而且我们也不能改变观察图形的视角方向.默认情况下的观察方向是世界坐标系的z轴正向方向. 世界变换运算是为了能在世界空间中的指定位置来绘制图形 取景变换运算是为了以不同的视角观察图形 投影变换为了将相对较远的图形投影到同一个平面上并体现出"近大远小"的真实视觉效果 视口变换是为了控制显示图

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——载入三维模型&amp;Alpha混合技术&amp;深度测试与Z缓存

第17章 三维游戏模型的载入 主要是如何从3ds max中导出.X文件,以及如何从X文件加载三维模型到DirextX游戏程序里.因为复杂的3D物体,要用代码去实现,那太反人类了,所以我们需要一些建模软件. 对于3ds max,要到出.X文件,要装个Panda插件.然后就是作者推荐的一个3D模型资源网站:http://www.cgmodel.com/. 网格模型接口ID3DXMesh 这个接口表示网格,继承自ID3DXBaseMesh.ID3DXMesh接口中的D3DXCreateMesh()可用

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记7——DirectInput&amp;纹理映射

第15章 DirectInput接口 DirectInput作为DirectX的组件之一,依然是一些COM对象的集合.DirectInput由IDirectinput8.IDirectInputDevice8和IDirectInputEffect这3个接口组成.其中IDirectInput8作为DirectInput API中最主要的接口,用于初始化系统以及创建输入设备接口,DirectInput中其他所有接口都需要依赖于我们的IDirectInput8之上,都是通过这个接口进行查询的.而Dir

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——光照与材质

第14章 绘制出质感的世界--光照与材质 1. 光照与光源 在Direct3D中的光源类型和光照类型是不同的两个概念,光照模型描述的是光线的反射特征,而光源类型主要强调的是能够产生这些光照模型的方式以及光线的位置,方向,强度等特征. 四大光照类型 环境光:基于整个自然界环境的整体亮度,称为环境光或者背景光,没有位置或者方向上的特征,只有一个颜色亮度值,不会衰减,在所有方向和所有物体表面上投射的环境光的数量是恒定不变的(有点像我们白天的自然光).在Direc3D中设置环境光可以直接使用setRen

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记9——游戏摄像机&amp;三维地形的构建

第21章 游戏摄像机的构建 之前的程序示例,都是通过封装的DirectInput类来处理键盘和鼠标的输入,对应地改变我们人物模型的世界矩阵来达到移动物体,改变观察点的效果.其实我们的观察方向乃至观察点都是没有变的,变的只是我们3D人物的位置.说白了就是用D3DXMatrixLookAtLH在资源初始化时固定住视角,在程序运行过程中接收到消息并改变三维人物模型的世界矩阵而已.这章的主要内容就是创建出一个可以在三维空间中自由移动的摄像机类,我们准备给这个摄像机类取名为CameraClass. 设计摄

《逐梦旅程 WINDOWS游戏编程之从零开始》读书笔记1——创建窗口

步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的成员默认是共有的,所以可以直接通过 . 来调用. typedef struct tagWNDCLASSEX { UINT cbSize; //UINT类型的cbSize,表示该结构体的字节数大小 UINT style; //指定窗口的风格样式 WNDPROC lpfnWndProc; //指向窗口过程函数的函数指针 int cbClsExtra; //

《逐梦旅程 WINDOWS游戏编程之从零开始》源码分析2——GDI

GDI: 图形设备接口 1. 取得设备环境的句柄(如屏幕) 使用BeginPaint和EndPaint这两个函数,或者使用GetDC和ReleaseDC这两个函数.关于函数的具体说明可以参考mdsn文档. 一个GDI程序通用框架: 1 #include <windows.h> 2 3 #define WINDOW_WIDTH 800 //为窗口宽度定义的宏,以方便在此处修改窗口宽度 4 #define WINDOW_HEIGHT 600 //为窗口高度定义的宏,以方便在此处修改窗口高度 5 #