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 }    

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

  • 相关阅读:
    ubuntu 16.04 更新后搜狗输入法无法输入中文的问题
    转: 苹果APNS的说明
    转:svn 更新指定文件夹
    转: Java 应用一般架构
    【原创】关于bug反正出现的问题可能
    App开发者博客之: 包建强 (专注移动app开发)
    转: 阿里跨平台移动开发工具Weex
    【原创】存储层设计的一些方法论
    转:车牌的自动截取与识别方案
    转: java web demo的示例
  • 原文地址:https://www.cnblogs.com/WinonaJia/p/8511950.html
Copyright © 2011-2022 走看看