• 《逐梦旅程:Windows游戏编程之从零开始》学习笔记之一:WIN32窗口框架


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

    第42行(HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加载自定义ico图标

    需向工程文件中添加ico图片

  • 相关阅读:
    Go语言并发编程
    Go语言package
    大数据实践(十) Spark多种开发语言、与Hive集成
    大数据实践(九)--sqoop安装及基本操作
    Go语言错误处理
    Go语言接口
    Go语言面向对象
    数据库基础了解
    PL/SQL语句快捷输入设置
    重载操作符介绍
  • 原文地址:https://www.cnblogs.com/WinonaJia/p/8075045.html
Copyright © 2020-2023  润新知