Directx11学习笔记【二】 将HelloWin封装成类
我们把上一个教程的代码封装到一个类中来方便以后的使用。
首先新建一个空工程叫做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封装成类的更多相关文章
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...
- mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现
项目结构 基础入门可参考:mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程) 开始体验 1.新建项目,新建类MybatisUtil.java,路径:src/util/Mybatis ...
- Directx11学习笔记【四】 封装一个简单的Dx11DemoBase
根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...
- Directx11学习笔记【二十一】 封装键盘鼠标响应类
原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...
- Directx11学习笔记【一】 最简单的windows程序HelloWin
声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明 首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面.然后创建一个win ...
- Directx11学习笔记【二十二】 用高度图实现地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- Directx11学习笔记【九】 3D渲染管线
原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...
随机推荐
- Datatables 在asp.net mvc
Datatables 在asp.net mvc中的使用 前言 最近使用ABP(ASP.NET Boilerplate)做新项目,以前都是自己扩展一个HtmlHelper来完成同步/异步分页,但是有个地 ...
- Amazon S3数据一致性模型
左右Amazon S3有两种类型的数据的一致性模型的: 最后,一致性和读一致性. 有下面几种行为: 1 写一个新的object,然后開始读它.直到全部的变化都传播完(副本),你才干读到它,否则就是ke ...
- 具体解释java定时任务
在我们编程过程中假设须要运行一些简单的定时任务,无须做复杂的控制.我们能够考虑使用JDK中的Timer定时任务来实现. 以下LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器 ...
- xcode target
A target specifies a product to build and contains the instructions for building the product from a ...
- BGP协议学习总结
BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...
- ASP.NET 联想控件(Autocomplete)测试可用 ascx
效果图 前台 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Auto ...
- SSM框架整合( Spring 、 SpringMVC 和 Mybatis )
1.基本概念 1.1.Spring Spring 是一个开源框架, Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作 Expert O ...
- ajax基本概念,方法
ajax Asynchronous javascript and xml异步的 javascript and XMLajax 是一门在不刷新网页的情况下,与服务器进行交互更新部分网页的技术: 传 ...
- c#开发微信公众平台
之前帮公司开发过微信公众账号,今天特别将过程再回顾记录下来. 1.URL配置 启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个,进入微信公众平台-开发模式,如下: 从上面可以看出,点击 ...
- OCA读书笔记(18) - 使用Support工具
调查和解决问题 问题:数据库中的任一严重的错误定义为一个问题,一般来说,这些错误包括大家熟悉的ORA-600错误和ORA-04031(共享池超出)错误,涉及数据库问题的所有元数据都存储在ADR中,每个 ...