我们把上一个教程的代码封装到一个类中来方便以后的使用。

首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面

MyWindow.h文件

 1 /************************************************************************
 2 Directx11学习笔记【2】 将HelloWin封装成类
 3 2016.01 by zhangbaochong
 4 /************************************************************************/
 5 #pragma once
 6 #include <windows.h>
 7
 8 static bool isPushEsc = false;//是否按下Esc键
 9
10 class MyWindow
11 {
12 public:
13     MyWindow();
14     ~MyWindow();
15 public:
16     HWND GetHandle();//返回窗口句柄
17     bool Create(int &width, int &height);//创建窗口
18     void Run();//处理消息循环
19     LRESULT CALLBACK MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//消息处理
20 private:
21     HWND m_hwnd;
22     HINSTANCE m_hinstance;
23     LPCWSTR m_name;
24 };

MyWindow.cpp

因为定义窗口的时候必须指定一个回调函数,所以我们定义一个静态的WndProc,因为在WndProc中需要调用其他消息的处理函数MessageHandler,所以我们又定义一个类的实例句柄applicationHandle。

  1 /************************************************************************
  2 Directx11学习笔记【2】 将HelloWin封装成类
  3 2016.01 by zhangbaochong
  4 /************************************************************************/
  5
  6 #include "MyWindow.h"
  7
  8 static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//静态回调函数
  9 static MyWindow *applicationHandle;//类的一个静态实例
 10
 11 MyWindow::MyWindow()
 12 {
 13     isPushEsc = false;
 14     m_hwnd = NULL;
 15     m_name = L"HelloWin";
 16 }
 17
 18
 19 MyWindow::~MyWindow()
 20 {
 21 }
 22
 23
 24 HWND MyWindow::GetHandle()
 25 {
 26     return m_hwnd;
 27 }
 28
 29 bool MyWindow::Create(int &width, int &height)
 30 {
 31     WNDCLASSEX wnd;
 32     applicationHandle = this;
 33     m_hinstance = GetModuleHandle(NULL);
 34     wnd.cbClsExtra = 0;
 35     wnd.cbSize = sizeof(WNDCLASSEX);
 36     wnd.cbWndExtra = 0;
 37     wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
 38     wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
 39     wnd.hIcon = LoadIcon(NULL, IDI_WINLOGO);
 40     wnd.hIconSm = wnd.hIcon;
 41     wnd.hInstance = m_hinstance;
 42     wnd.lpfnWndProc = WndProc;
 43     wnd.lpszClassName = m_name;
 44     wnd.lpszMenuName = m_name;
 45     wnd.style = CS_VREDRAW | CS_HREDRAW;
 46
 47     //注册窗口
 48     if ( !RegisterClassEx(&wnd) )
 49     {
 50         MessageBox(NULL, L"注册窗口失败", L"error", 0);
 51         return false;
 52     }
 53     m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_name, m_name, WS_OVERLAPPEDWINDOW, 0, 0, width, height,
 54         NULL, NULL, m_hinstance, NULL);
 55     //显示窗口设置其为焦点
 56     ShowWindow(m_hwnd, SW_SHOW);
 57     UpdateWindow(m_hwnd);
 58     return true;
 59 }
 60
 61 static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 62 {
 63     switch (message)
 64     {
 65     case WM_DESTROY:
 66         PostQuitMessage(0);
 67         return 0;
 68         //其他消息发送MessageHandler处理
 69     default:
 70         return applicationHandle->MessageHandler(hwnd, message, wparam, lparam);
 71     }
 72 }
 73
 74 LRESULT CALLBACK MyWindow::MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 75 {
 76     switch (message)
 77     {
 78         //检测按键消息
 79     case WM_KEYDOWN:
 80         if (wparam == VK_ESCAPE)//用户按下退出键
 81             isPushEsc = true;
 82         return 0;
 83
 84         //其他消息发送windows缺省处理
 85     default:
 86         return DefWindowProc(hwnd, message, wparam, lparam);
 87     }
 88 }
 89
 90 void MyWindow::Run()
 91 {
 92     MSG msg;
 93     ZeroMemory(&msg, sizeof(MSG));
 94     bool isRuning = true;//控制是否退出消息循环
 95     while (isRuning)
 96     {
 97         //处理windows消息
 98         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 99         {
100             TranslateMessage(&msg);
101             DispatchMessage(&msg);
102         }
103         if (msg.message == WM_QUIT)
104         {
105             isRuning = false;
106         }
107         else//按下esc键也退出
108         {
109             isRuning = !isPushEsc;
110
111             //渲染等处理可以放在这儿
112         }
113
114     }
115 }

main.cpp

 1 /************************************************************************
 2 Directx11学习笔记【2】 将HelloWin封装成类
 3 2016.01 by zhangbaochong
 4 /************************************************************************/
 5 #include "MyWindow.h"
 6
 7 int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
 8 {
 9     int width = 800, height = 600;
10     MyWindow *window = new MyWindow;
11     if (window->Create(width, height))
12     {
13         window->Run();
14     }
15     return 0;
16 }

运行结果和上次一样:

Directx11学习笔记【二】 将HelloWin封装成类相关推荐

  1. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  2. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  3. jquery学习笔记及常用函数封装

    二.JQuery 学习笔记及常用函数封装 https://download.csdn.net/download/weixin_42530002/13087988 1.JQuery入门 (1).css选 ...

  4. Java学习笔记二:数据类型

    Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...

  5. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  6. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  7. MATLAB学习笔记——二维和三维绘图

    MATLAB学习笔记--二维和三维绘图 近期练习matlab的二维和三维绘图,整理一下,以防忘记. 文章目录 MATLAB学习笔记--二维和三维绘图 一.二维绘图 1.plot命令 2.fplot 命 ...

  8. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  9. 二维码学习笔记(二) | 数据分析与数据编码

    唠唠闲话 二维码笔记系列(原文地址): 『二维码学习笔记(一) | 二维码概述』 『二维码学习笔记(二) | 数据分析与数据编码』 『二维码学习笔记(三) | 纠错编码』 『二维码学习笔记(四) | ...

最新文章

  1. Error:Unsupported method: BaseConfig.getApplicationIdSuffix(). The version o
  2. 一个用于录制用户输入操作并实时回放的小工具
  3. 三星emcp型号详解_嵌入式存储产品发展趋势:uMCP取代eMCP序幕拉开
  4. “sudo: go:找不到命令”完美解决方案
  5. Leaflet快速入门与加载OSM显示地图
  6. 【数据结构与算法】之深入解析“路径交叉”的求解思路与算法示例
  7. python函数type的用意_python中type()是什么意思
  8. 返回一个1到54之间的随机数
  9. c#之 quartz的学习
  10. apache log分析
  11. OpenCV-图像处理(03、Mat对象)
  12. 数据库执行update语句,一直执行不完【已解决】
  13. linux pid t 头文件_Linux中 pid_t 类型的定义.
  14. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法
  15. matlab 密集,matlab – 全局和parfor
  16. HTML5入门 之下拉菜单
  17. 性能测试基础知识-华为云学院
  18. Processing 入门教程(二十一) 利用数组产生雪花坠落效果
  19. 安装ruby1.9.3-p0及redmon来监控redis
  20. 【观察】新华三:云智原生,重塑未来

热门文章

  1. 清除掉AD的相关属性!
  2. 安装Oracle数据库操作步骤
  3. HFileOutputFormat与TotalOrderPartitioner
  4. WebServices 基础知识
  5. 《高级软件架构师讲义》学习笔记5
  6. Source Insight 4.0安装教程(PS:附安装包及卸载重新安装等注意事项)
  7. 全国计算机等级考试题库二级C操作题100套(第20套)
  8. python输出可执行文件_重定向-禁止在Python调用中输出可执行文件
  9. 最新处理器排名_安兔兔Android处理器天梯榜发布:最强的还是它
  10. java swing事件_第四节 Java Swing事件处理