当前位置:首页 > 操作系统 > Windows

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

                <span>  1</span>
                <span>//</span>
                <span>===========================================【程序说明】===================================
</span>
                <span>  2</span>
                <span>//</span>
                <span>    2018_3_5
</span>
                <span>  3</span>
                <span>//</span>
                <span>    描述:实现GDI游戏开发所需要的核心程序
</span>
                <span>  4</span>
                <span>//</span>
                <span>==========================================================================================
</span>
                <span>  5</span>
                <span>  6</span>
                <span>//</span>
                <span>===========================================【头文件包含部分】=============================
</span>
                <span>  7</span>
                <span>//</span>
                <span>    描述:包含程序所依赖的头文件
</span>
                <span>  8</span>
                <span>//</span>
                <span>==========================================================================================</span>
                <span>  9</span>
                <span> 10</span> #include <Windows.h>
<span> 11</span><span> 12</span><span>//</span><span>==============================================【库文件包含部分】==========================
</span><span> 13</span><span>//</span><span>    描述:包含程序所依赖的库文件
</span><span> 14</span><span>//</span><span>==========================================================================================
</span><span> 15</span><span> 16</span><span> 17</span><span>//</span><span>=============================================【宏定义】====================================
</span><span> 18</span><span>//</span><span>    描述:定义一些辅助宏
</span><span> 19</span><span>//</span><span>===========================================================================================</span><span> 20</span><span> 21</span><span>#define</span> WINDOW_WIDTH 800    <span>//</span><span>为窗口宽度定义的宏,以方便在此处修改窗口宽度</span><span> 22</span><span>#define</span> WINDOW_HEIGHT 600    <span>//</span><span>为窗口高度定义的宏,以方便在此处修改窗口高度</span><span> 23</span><span>#define</span> WINDOW_TITLE L"【致我们永不磨灭的梦想】GDI程序框架"    <span>//</span><span>为窗口标题定义的宏,以方便在此处修改窗口标题</span><span> 24</span><span> 25</span><span>//</span><span>===========================================【全局变量声明】=====================================
</span><span> 26</span><span>//</span><span>    描述:全局变量声明
</span><span> 27</span><span>//</span><span>================================================================================================</span><span> 28</span><span> 29</span> HDC g_hdc = NULL;        <span>//</span><span>全局设备环境句柄
</span><span> 30</span><span> 31</span><span>//</span><span>================================================【全局函数声明】============================
</span><span> 32</span><span>//</span><span>    描述:全局函数声明,防止“未声明的标识”系列错误
</span><span> 33</span><span>//</span><span>============================================================================================</span><span> 34</span><span> 35</span> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);    <span>//</span><span>窗口过程函数</span><span> 36</span><span> 37</span> BOOL Game_Init(HWND hWnd);    <span>//</span><span>在此函数中进行资源的初始化</span><span> 38</span><span>void</span> Game_Paint(HWND hWnd);    <span>//</span><span>在此函数中进行绘图代码的书写</span><span> 39</span> BOOL Game_CleanUp(HWND hWnd);    <span>//</span><span>在此函数中进行资源的清理
</span><span> 40</span><span> 41</span><span>//</span><span>=================================================【WinMain()函数】==============================
</span><span> 42</span><span>//</span><span>    描述:WINDOW应用程序的入口函数,我们的程序从这里开始
</span><span> 43</span><span>//</span><span>=================================================================================================</span><span> 44</span><span> 45</span><span>int</span> WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, <span>int</span><span> nShowCmd )
</span><span> 46</span><span>{
</span><span> 47</span><span>//</span><span>【1】窗口创建四部曲之一:开始设计一个完整的窗口类</span><span> 48</span><span> 49</span>     WNDCLASSEX wndClass = { <span>0</span> };    <span>//</span><span>用WINDCLASSEX定义一个窗口类</span><span> 50</span>     wndClass.cbSize = <span>sizeof</span>( WNDCLASSEX );    <span>//</span><span>设置结构体的字节数大小</span><span> 51</span>     wndClass.style = CS_HREDRAW | CS_VREDRAW;    <span>//</span><span>设置窗口的样式</span><span> 52</span>     wndClass.lpfnWndProc = WndProc;        <span>//</span><span>设置只想窗口过程函数的指针</span><span> 53</span>     wndClass.cbClsExtra = <span>0</span>;    <span>//</span><span>窗口类的附加内存,取0即可</span><span> 54</span>     wndClass.cbWndExtra = <span>0</span>;    <span>//</span><span>窗口的附加内存,取0即可</span><span> 55</span>     wndClass.hInstance = hInstance;        <span>//</span><span>指定包含窗口过程的程序的实例句柄</span><span> 56</span>     wndClass.hIcon = (HICON)::LoadImage(NULL, L<span>"</span><span>icon.ico</span><span>"</span>, IMAGE_ICON, <span>0</span>, <span>0</span>, LR_DEFAULTSIZE | LR_LOADFROMFILE);    <span>//</span><span>本地加载自定义ico图标</span><span> 57</span>     wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);    <span>//</span><span>制定窗口类的光标句柄</span><span> 58</span>     wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);    <span>//</span><span>为hbrBackground成员指定一个灰色画刷句柄</span><span> 59</span>     wndClass.lpszMenuName = NULL;    <span>//</span><span>用一个以空终止的字符串,指定菜单资源的名字</span><span> 60</span>     wndClass.lpszClassName = L<span>"</span><span>ForTheDreamOfGameDevelop</span><span>"</span>;    <span>//</span><span>用一个以空终止的字符串,指定窗口类的名字
</span><span> 61</span><span> 62</span><span>//</span><span>HICON  hIconSm;
</span><span> 63</span><span> 64</span><span>//</span><span>【2】窗口常见四部曲之二:注册窗口类</span><span> 65</span><span> 66</span><span>if</span>(!RegisterClassEx(&wndClass))    <span>//</span><span>设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口</span><span> 67</span><span>    {
</span><span> 68</span><span>return</span> -<span>1</span><span>;
</span><span> 69</span><span>    }
</span><span> 70</span><span> 71</span><span>//</span><span>【3】窗口创建四部曲之三:正式创建窗口</span><span> 72</span><span> 73</span>     HWND hWnd = CreateWindow(L<span>"</span><span>ForTheDreamOfGameDevelop</span><span>"</span><span>,WINDOW_TITLE, 
</span><span> 74</span><span>        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
</span><span> 75</span><span>        WINDOW_HEIGHT, NULL, NULL, hInstance, NULL
</span><span> 76</span><span>        );
</span><span> 77</span><span> 78</span><span>//</span><span>【4】窗口创建四部曲之四:窗口的移动、显示与更新</span><span> 79</span><span> 80</span>     MoveWindow(hWnd, <span>250</span>, <span>80</span>, WINDOW_WIDTH, WINDOW_HEIGHT, <span>true</span>);    <span>//</span><span>调整窗口显示时的位置,使窗口左上角位于(250, 80)处</span><span> 81</span><span> 82</span>     ShowWindow(hWnd, nShowCmd);    <span>//</span><span>调用此函数显示窗口</span><span> 83</span><span> 84</span>     UpdateWindow(hWnd);    <span>//</span><span>对窗口进行更新,就像我们买了新房装修
</span><span> 85</span><span> 86</span><span>//</span><span>【5】消息循环过程</span><span> 87</span><span> 88</span>     MSG msg = {<span>0</span>};    <span>//</span><span>定义并初始化msg</span><span> 89</span><span>while</span> (msg.message != WM_QUIT)    <span>//</span><span>使用while循环,如果雄安喜不是WM_QUIT消息,就继续循环</span><span> 90</span><span>    {
</span><span> 91</span><span>if</span>(PeekMessage(&msg, <span>0</span>, <span>0</span>, <span>0</span>, PM_REMOVE))    <span>//</span><span>查看应用程序消息队列,有消息时从队列中的消息派发出去</span><span> 92</span><span>        {
</span><span> 93</span>             TranslateMessage(&msg);    <span>//</span><span>将虚拟键消息转换为字符消息</span><span> 94</span>             DispatchMessage(&msg);        <span>//</span><span>分发一个雄安喜给窗口程序</span><span> 95</span><span>        }
</span><span> 96</span><span>    }
</span><span> 97</span><span> 98</span><span>//</span><span>【6】窗口类的注销</span><span> 99</span><span>100</span>     UnregisterClass(L<span>"</span><span>ForTheDreamOfGameDevelop</span><span>"</span>, wndClass.hInstance);    <span>//</span><span>程序转杯结束,注销窗口类</span><span>101</span><span>102</span><span>return</span><span>0</span><span>;
</span><span>103</span><span>}
</span><span>104</span><span>105</span><span>//</span><span>=========================================【WndProc()函数】=====================================
</span><span>106</span><span>//</span><span>    描述:窗口过程函数wndproc对敞口消息进行处理
</span><span>107</span><span>//</span><span>===============================================================================================</span><span>108</span><span>109</span><span>LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
</span><span>110</span><span>{
</span><span>111</span>     PAINTSTRUCT paintStruct;    <span>//</span><span>定义一个PAINTSTRUCT结构体来记录一些绘制信息</span><span>112</span><span>113</span><span>switch</span>(message)    <span>//</span><span>seitch语句开始</span><span>114</span><span>    {
</span><span>115</span><span>case</span> WM_PAINT:    <span>//</span><span> 若是客户区重绘消息</span><span>116</span>         g_hdc = BeginPaint(hWnd, &paintStruct);    <span>//</span><span>指定窗口进行绘制工作的准备,并用将和绘图有关的信息填充到paintStruct结构体中</span><span>117</span><span>        Game_Paint(hWnd);
</span><span>118</span>         EndPaint(hWnd, &paintStruct);    <span>//</span><span>paintStruct函数标记制定窗口的绘画过程结束</span><span>119</span>         ValidateRect(hWnd, NULL);    <span>//</span><span> 更新客户区的显示</span><span>120</span><span>break</span><span>;
</span><span>121</span><span>122</span><span>case</span> WM_KEYDOWN:    <span>//</span><span> 若是键盘按下消息</span><span>123</span><span>if</span>(wParam == VK_ESCAPE)    <span>//</span><span> 如果被按下的键是ESC</span><span>124</span><span>        {
</span><span>125</span>             DestroyWindow(hWnd);    <span>//</span><span> 销毁窗口, 并发送一条WM_DESTROY消息</span><span>126</span><span>127</span><span>        }
</span><span>128</span><span>break</span><span>;
</span><span>129</span><span>130</span><span>case</span> WM_DESTROY:    <span>//</span><span>若是窗口销毁消息</span><span>131</span>         Game_CleanUp(hWnd);<span>//</span><span>调用自定义的资源清理函数Game_CleanUp()进行退出前的资源清理</span><span>132</span>         PostQuitMessage(<span>0</span>);    <span>//</span><span>向系统表明有个线程有终止请求。用来响应WM_DESTROY消息</span><span>133</span><span>break</span><span>;
</span><span>134</span><span>135</span><span>default</span>:    <span>//</span><span>若上述case条件都不符合,则执行该default语句</span><span>136</span><span>return</span> DefWindowProc(hWnd, message, wParam, lParam);    <span>//</span><span>调用缺省的窗口过程</span><span>137</span><span>    }
</span><span>138</span><span>139</span><span>return</span><span>0</span>;    <span>//</span><span>正常退出</span><span>140</span><span>}
</span><span>141</span><span>142</span><span>//</span><span>========================================【Game_Init()函数】=====================================
</span><span>143</span><span>//</span><span>    描述:初始化函数,进行一些简单的初始化
</span><span>144</span><span>//</span><span>================================================================================================</span><span>145</span><span>146</span> BOOL Game_Init(HWND hWnd)    <span>//</span><span>在此函数中进行资源的初始化</span><span>147</span><span>{
</span><span>148</span>     g_hdc = GetDC(hWnd);    <span>//</span><span>获取设设备环境句柄</span><span>149</span><span>    Game_Paint(hWnd);
</span><span>150</span>     ReleaseDC(hWnd, g_hdc);    <span>//</span><span>释放设备环境</span><span>151</span><span>return</span><span> TRUE;
</span><span>152</span><span>}
</span><span>153</span><span>154</span><span>//</span><span>========================================【Game_Paint()函数】====================================
</span><span>155</span><span>//</span><span>    描述:绘制函数,在此函数中进行绘制操作
</span><span>156</span><span>//</span><span>================================================================================================</span><span>157</span><span>158</span><span>void</span> Game_Paint(HWND hWnd)    <span>//</span><span>在此函数中进行绘图代码的书写</span><span>159</span><span>{
</span><span>160</span><span>161</span><span>}
</span><span>162</span><span>163</span><span>//</span><span>========================================【Game_CleanUp()函数】==================================
</span><span>164</span><span>//</span><span>    描述:资源清理函数,在此函数中进行退出前资源的清理工作
</span><span>165</span><span>//</span><span>================================================================================================</span><span>166</span><span>167</span><span>BOOL Game_CleanUp(HWND hWnd)
</span><span>168</span><span>{
</span><span>169</span><span>return</span><span> TRUE;
</span><span>170</span> }    

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

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


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐