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

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

MyWindow.h文件

 /************************************************************************
Directx11学习笔记【2】 将HelloWin封装成类
2016.01 by zhangbaochong
/************************************************************************/
#pragma once
#include <windows.h> static bool isPushEsc = false;//是否按下Esc键 class MyWindow
{
public:
MyWindow();
~MyWindow();
public:
HWND GetHandle();//返回窗口句柄
bool Create(int &width, int &height);//创建窗口
void Run();//处理消息循环
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//消息处理
private:
HWND m_hwnd;
HINSTANCE m_hinstance;
LPCWSTR m_name;
};

MyWindow.cpp

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

 /************************************************************************
Directx11学习笔记【2】 将HelloWin封装成类
2016.01 by zhangbaochong
/************************************************************************/ #include "MyWindow.h" static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//静态回调函数
static MyWindow *applicationHandle;//类的一个静态实例 MyWindow::MyWindow()
{
isPushEsc = false;
m_hwnd = NULL;
m_name = L"HelloWin";
} MyWindow::~MyWindow()
{
} HWND MyWindow::GetHandle()
{
return m_hwnd;
} bool MyWindow::Create(int &width, int &height)
{
WNDCLASSEX wnd;
applicationHandle = this;
m_hinstance = GetModuleHandle(NULL);
wnd.cbClsExtra = ;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wnd.hIconSm = wnd.hIcon;
wnd.hInstance = m_hinstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = m_name;
wnd.lpszMenuName = m_name;
wnd.style = CS_VREDRAW | CS_HREDRAW; //注册窗口
if ( !RegisterClassEx(&wnd) )
{
MessageBox(NULL, L"注册窗口失败", L"error", );
return false;
}
m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_name, m_name, WS_OVERLAPPEDWINDOW, , , width, height,
NULL, NULL, m_hinstance, NULL);
//显示窗口设置其为焦点
ShowWindow(m_hwnd, SW_SHOW);
UpdateWindow(m_hwnd);
return true;
} static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage();
return ;
//其他消息发送MessageHandler处理
default:
return applicationHandle->MessageHandler(hwnd, message, wparam, lparam);
}
} LRESULT CALLBACK MyWindow::MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch (message)
{
//检测按键消息
case WM_KEYDOWN:
if (wparam == VK_ESCAPE)//用户按下退出键
isPushEsc = true;
return ; //其他消息发送windows缺省处理
default:
return DefWindowProc(hwnd, message, wparam, lparam);
}
} void MyWindow::Run()
{
MSG msg;
ZeroMemory(&msg, sizeof(MSG));
bool isRuning = true;//控制是否退出消息循环
while (isRuning)
{
//处理windows消息
if (PeekMessage(&msg, NULL, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (msg.message == WM_QUIT)
{
isRuning = false;
}
else//按下esc键也退出
{
isRuning = !isPushEsc; //渲染等处理可以放在这儿
} }
}

main.cpp

 /************************************************************************
Directx11学习笔记【2】 将HelloWin封装成类
2016.01 by zhangbaochong
/************************************************************************/
#include "MyWindow.h" int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
int width = , height = ;
MyWindow *window = new MyWindow;
if (window->Create(width, height))
{
window->Run();
}
return ;
}

运行结果和上次一样:

Directx11学习笔记【二】 将HelloWin封装成类的更多相关文章

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

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

  2. mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现

    项目结构  基础入门可参考:mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程) 开始体验 1.新建项目,新建类MybatisUtil.java,路径:src/util/Mybatis ...

  3. Directx11学习笔记【四】 封装一个简单的Dx11DemoBase

    根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...

  4. Directx11学习笔记【二十一】 封装键盘鼠标响应类

    原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...

  5. Directx11学习笔记【一】 最简单的windows程序HelloWin

    声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明 首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面.然后创建一个win ...

  6. Directx11学习笔记【二十二】 用高度图实现地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...

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

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

  8. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  9. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

随机推荐

  1. WPF案例 (四) 模拟Windows7桌面任务栏

    原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...

  2. hdu2955(变形01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 分析:被抓概率可以转换成安全概率,Roy的安全概率大于1-P时都是安全的. 抢劫的金额为0时,肯 ...

  3. Notifications(通知)

    通知 通知是能在应用的普通用户界面外显示给用户的一种消息. 当你告诉系统公布一条通知时,它首先在通知栏中表现为一枚图标. 用户打开通知抽屉后就能查看通知的细节了. 通知栏和通知抽屉都是由系统控制的区域 ...

  4. Python的TkinterButton做为父窗口

    #-*-coding:utf--*- import Tkinter,time,tkMessageBox,sys,BeBigModule class MainFrame: def __init__(se ...

  5. 使用异步HTTP提升客户端性能(HttpAsyncClient)

    使用异步HTTP提升客户端性能(HttpAsyncClient) 大家都知道,应用层的网络模型有同步.异步之分. 同步,意为着线程阻塞,只有等本次请求全部都完成了,才能进行下一次请求. 异步,好处是不 ...

  6. zend studio 10 实现代码自动换行

    在一篇zend framework 的PHP编码标准的文章中看到了这么一段: 一行 80 字符以内是比较合适,就是说,ZF 的开发者应当努力在可能的情况下保持每行代码少于 80 个字符,在有些情况下, ...

  7. SDL2源码分析5:更新纹理(SDL_UpdateTexture())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  8. IAR FOR ARM 各版本号,须要的大家能够收藏了

    首先感谢大家的支持与关注,如今应该又一次编辑这篇文章了,这篇文章是非常久曾经不知在什么地方Copy过来的, 非常多问题不知怎么解决,如今我用的是KEIL for arm. 用过Keil和IAR,个人感 ...

  9. linux下Ftp环境的搭建

      Ftp环境的搭建 1.ftp软件的安装 使用ssh远程连接linux系统,上传和下载一些文件,Ftp是不可少的 Ftp的安装很简单,远程登录系统后使用命令 yum list vsftpd 通过提示 ...

  10. Preference如何增加在activity生命周期监听器

    转载请注明出处:http://blog.csdn.net/droyon/article/details/41313115 本文主要介绍Preference凭什么Activit一些逻辑的生命周期,使. ...