zoukankan      html  css  js  c++  java
  • 《逐梦旅程: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 }    

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

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/WinonaJia/p/8511950.html
Copyright © 2011-2022 走看看