文档章节

【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
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
FFmpeg 2.7.2 发布,多媒体处理工具

FFmpeg 2.7.2 发布,下载: http://ffmpeg.org/releases/ffmpeg-2.7.2.tar.bz2。 FFmpeg 2.7 改进内容如下: - FFT video filter - TDSC decoder - DTS lossless extension (XLL) decoding ......

oschina
2015/07/21
2.3K
6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Minifilter的动态安装、加载及卸载

MINIFILTER框架的文件系统过滤驱动,无法使用的CreateService和OpenService进行动态加载。 看了一下,使用Inf文件安装Minifilter驱动的方式是在注册表驱动服务项下比传统驱动多创建了Instanc...

simpower
28分钟前
3
0
idea新建springCloud项目(6)- Config Server使用

1.在IDEA新建springCloud项目-Config Server 修改版本,和之前建的eureka项目版本一致,修改完记得刷新: 删除掉不需要的文件: 2.把Config S 服务注册到eureka上去,配置git地址,启动项目 ...

monroeCode
34分钟前
4
0
大数据可视化项目开发总纲

第1章 开发文档总纲 1.1 开发工具清单 名称 版本 备注 Pentaho-bi server pentaho-server-ce-7.1 Pentaho Cde为其内置工具 Pentaho-prd pentaho-prd-ce-7.1 Pentaho Report Designer报表工具...

ZhangLG
34分钟前
4
0
pip安装超时问题

pip3 install --default-timeout=100 tensorflow 设置为100秒 参考: User Guide How to solve ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443) with pip?......

亚林瓜子
36分钟前
2
0
fragment 旋转时保持当前实例

设备旋转时保存Fragment的交互状态: setRetainInstance(true);

zdglf
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部