Directx11学习笔记 将HelloWin封装成类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Directx11学习笔记 将HelloWin封装成类相关的知识,希望对你有一定的参考价值。

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

首先新建一个空工程叫做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 = LoadCursor(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封装成类的主要内容,如果未能解决你的问题,请参考以下文章

DirectX11 学习笔记1 - 第一个程序

DirectX11 学习笔记7 - 支持自由移动的摄像机

Directx11学习笔记 基本的数学知识----矩阵篇

DirectX 11游戏编程学习笔记之1: 开场白

Directx11学习笔记二十二 用高度图实现地形

Directx11学习笔记 第一个D3D11程序