文档章节

【Direct3D11】(一)创建windows窗口

大鲸鱼锅锅
 大鲸鱼锅锅
发布于 2017/04/15 21:16
字数 822
阅读 12
收藏 0

Windows窗口的创建过程#

  • 填充窗口类
    WNDCLASS wc;                                            //窗口类
	wc.style = CS_HREDRAW | CS_VREDRAW;              //CS_HREDRAW:当水平长度改变或移动窗口时,重画整个窗口  
                                                     //CS_VREDRAW: 当垂直长度改变或移动窗口时,重画整个窗口
                                                     //其他选项查阅文档
	wc.cbClsExtra = 0;                               //窗口类无扩展
	wc.cbWndExtra = 0;                               //窗口实例无扩展
	wc.lpszClassName = L"D3DAppWindow";             //窗口类名称为D3DAppWindow
	wc.lpszMenuName = nullptr;                            //窗口菜单名称
	wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(NULL_BRUSH));    //窗口背景色
	wc.hCursor = LoadCursor(0, IDC_ARROW);        //窗口鼠标为箭头光标
	wc.hIcon = LoadIcon(0, IDI_APPLICATION);        //窗口最小化图标为缺省图标
	wc.hInstance = m_hAppInstance;                    //这个为应用程序的实例句柄
	wc.lpfnWndProc = MainWndProc;                    //回调函数指针
  • 注册窗口类
    if (FAILED(RegisterClass(&wc)))                    //将填充好的窗口类注册
	{
		MessageBox(nullptr, L"Failed Register Window!", 0, 0);
		return FALSE;
	}
  • 创建窗口实例
    HWND hWnd = CreateWindow(
		L"D3DAppWindow",                    //之前注册的窗口类名称
		L"D3DApp",                          //窗口标题名称,会显示在窗口左上角
		WS_OVERLAPPEDWINDOW,                //窗口的风格
		CW_USEDEFAULT, CW_USEDEFAULT,       //默认窗口左上角坐标
		m_width, m_height,                  //窗口大小
		nullptr,                              //窗口无父窗口
		nullptr,                              //窗口无子菜单
		m_hAppInstance,                     //应用程序的实例句柄
		nullptr                               
	);
  • 显示和更新窗口
    ShowWindow(hWnd, SW_SHOW);                //指定窗口的显示状态(最小化最大化等),SW_SHOW在原位置以原尺寸显示
	UpdateWindow(hWnd);                        //UpdateWindow函数发送一个WM_PAINT消息来更新指定窗口的客户区
                                               //函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程
  • 游戏主循环
	MSG msg;                                    //消息对象
	ZeroMemory(&msg, sizeof(MSG));                //零初始化消息对象

	while (msg.message != WM_QUIT)                //主循环,没有收到退出消息时循环执行
	{
		if (PeekMessage(&msg, m_hAppWnd, 0, 0, PM_REMOVE))      //以查看的方式从系统中获取消息,处理后,消息从队列里除掉
		{
			TranslateMessage(&msg);                            //该函数将虚拟键消息转换为字符消息,发送至消息队列
			DispatchMessage(&msg);                             //该函数分发一个消息给窗口程序,消息被分发到回调函数
		}
		else
		{
			UpdateScene(0.1f);                        //没有消息时执行游戏场景逻辑
			DrawScene();                             //由D3D绘制场景
		}
	}
  • 一个简单的回调函数
LRESULT WindowBase::MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{ 
    //收到窗口销毁消息时,发送退出信息
	case WM_DESTROY:                       
		PostQuitMessage(0);
		return 0;
	default:
		break;
	}
	return DefWindowProc(hWnd, msg, wParam, lParam);                //调用默认消息处理函数处理大多数消息
}
  • 封装一个游戏的基类
class WindowBase 
{
public:
    WindowBase(HINSTANCE hInstance):m_hAppInstance(hInstance) {}
	~WindowBase() {}
	//获取App的Instance句柄
	HINSTANCE AppInst() const;
	//获取窗口句柄
	HWND AppWindow() const;
	//设置窗口的大小,应在调用Init()初始化窗口之前设置
	void SetHeightAndWidth(int width, int height);

	//主循环
	int Run();

	//回掉函数
	LRESULT MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
	//初始化,在这里调用 InitGameWindow() 和 InitDirect3D()
	virtual bool Init();
	//游戏逻辑更新 必须重写
	virtual void UpdateScene(float dt) = 0;
	//游戏绘制 可以不重写 即不绘制任何东西 只处理游戏逻辑
	virtual void DrawScene();
protected:
    HRESULT InitGameWindow();        //所有注册、创建窗口实例的过程在这里写
	HRESULT InitDirect3D();            //所有初始化Direct3D的过程在这里写
protected:
	HINSTANCE m_hAppInstance = nullptr;
	HWND m_hAppWnd = nullptr;
	int m_height = 800;
	int m_width = 600;
};

© 著作权归作者所有

共有 人打赏支持
大鲸鱼锅锅
粉丝 5
博文 14
码字总数 15885
作品 0
武汉
程序员
关于Direct3D11里汉字显示的一些思考

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/8147234 作者:毛星云 邮箱: happylifemxy@163.com 这篇文章里,浅墨希望与大家一起...

长平狐
2012/11/12
690
0
Diligent Engine: A Modern Cross-Platform Graphics API

Disclaimer: this article uses material published on Diligent Engine web site. Download latest source (github) Background This post talks about graphics APIs, so some knowledge o......

EgorYusov
2017/12/25
0
0
Direct3D 11 Tutorial 1: Basics_Direct3D 11 教程1:基础

Github-LearnDirectX-DX3D11 tutorial01 概述 在这第一篇教程中,我们将通过介绍创建最小Direct3D应用程序所必需的元素。每一个Direct3D应用程序必需拥有这些元素才能正常地工作。这些元素包...

Zoctopus·Lian
09/30
0
0
SharpDX 3.0.0 (alpha01)发布,DirectX 封装库

SharpDX 3.0.0 (alpha01)发布,这是SharpDX 3.0.0 的第一个 alpha 版本。新增特性: 新增支持 Direct3D12 功能,以获得更优质的图片(只与 Windows 10 10041 兼容) 所有的算法都放在一个工具...

oschina
2015/04/02
1K
3
[ogre] ogre遇到一些小问题

在下载 OgreSDKV1.9生成解决方案后运行sampleBrowser.exe报错 猜测应该是电脑没装DirectX 驱动,解决方法: 安装DirectX11 9 这个程序 打开这个程序所在目录的plugins.cfg中删除以下字样保存...

阳666
2015/10/11
47
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache Bench学习笔记

使用apache bench测试并发请求 ab -H "X-IMATRIX-ACCESS-TOKEN:1234567" -c 1000 -n 1000 http://localhost:8080/portfolioes/1/performance...

OSC_fly
27分钟前
2
0
Oracle推出轻量级Java微服务框架Helidon

近日,Oracle 推出 了一个新的开源框架 Helidon ,该项目是一个用于创建基于微服务的应用程序的Java库集合。和 Payara Micro 、 Thorntail (之前的 WildFly Swarm )、 OpenLiberty 、TomEE...

小刀爱编程
28分钟前
5
0
mysql 按周统计

方法一 : 使用 DATE_FORMAT 格式化时间,格式化参数参考 -- 参考地址 SELECTDATE_FORMAT( create_time, '%Y%u' ) weeks,DATE_FORMAT( date_sub( create_time, INTERVAL WEEKDAY( cre...

小鸟00
32分钟前
3
0
深入理解JAVA锁的机制

1. synchronized实现原理 在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景: 如图,synchronized可以用在方法上也可以使用在代码块中,...

laigous
33分钟前
2
0
Mysql几种索引类型的区别及适用情况

如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以...

ZhangLG
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部