DirectX3D 11 总结 —— 1 绘制 win32 窗口

DirectX3D是Windows平台上的一种API,用于提升游戏和多媒体程序的性能和图形效果。本文介绍了如何在Win32环境下创建窗口、注册窗口类、显示窗口以及消息分发的过程,通过示例代码展示了如何使用DirectX3D初始化窗口,并处理窗口消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

directX 3D 是什么

DirectX 3D是一种应用程序的接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音的效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。
简单理解就是 windows 为了方便开发者驱动显卡运行,定义了一套 API标志,封装了硬件之间的差异,提供开发者的开发效率。

绘制窗口

directX 3D 主要用于图像的显示,因此首先需要创建一个窗口用于显示。

环境配置

win32 窗口显示程序,visual studio 连接器 -> 系统 -> 子系统 要改为 /SUBSYSTEM:WINDOWS 。然后程序入口函数变为 WinMain WinMain 函数介绍
在这里插入图片描述

代码整体结构

代码整体结构如下所示。

#include <windows.h>
// 回调函数  处理获取的消息

int WINAPI WinMain(
	HINSTANCE hInstance,		// 应用程序句柄
	HINSTANCE hPrevInstance,	// 上一个应用程序的句柄,目前已弃用 一直为 NULL
	LPSTR     lpCmdLine,		// 传入的命令行
	int       nShowCmd			// 设置窗口的显示方式
)
{
	// 0. 设置窗口属性
	
	// 1. 注册窗口

	// 2. 创建窗口

	// 3. 显示窗口

	// 4. 消息分发

	return 0;
}

首先设置窗口属性,里面会设置回调函数、窗口类名和光标等参数;之后注册该窗口属性;接着创建该类型的窗口,通过指定窗口类名,选择对应的窗口属性;由于窗口默认是不显示的,所以需要主动调用显示窗口的函数;然后是一个死循环,不断获取 windows 系统的消息,然后将消息分发给创建的窗口;最终窗口的回调函数会收到该消息,并对消息进行相应的处理。

具体代码

#include <windows.h>

// 回调函数  处理获取的消息
LRESULT CALLBACK MyWinProc(HWND hwnd, // 窗口句柄
	UINT msg, // 消息类型
	WPARAM wparam,  // 辅助消息 键盘消息中,该参数代表哪个键按下
	LPARAM lparam)  // 辅助消息 鼠标信息中,该参数的低字节代表 x 坐标,高字节代表 y 坐标
{
	switch (msg)
	{
	case WM_CLOSE:
		PostQuitMessage(0);
		return 0;
	default:
		break;
	}
	return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(
	HINSTANCE hInstance,		// 应用程序句柄
	HINSTANCE hPrevInstance,	// 上一个应用程序的句柄,目前已弃用 一直为 NULL
	LPSTR     lpCmdLine,		// 传入的命令行
	int       nShowCmd			// 设置窗口的显示方式
)
{
	auto className = TEXT("FirstWindowClass");
	// 0. 设置窗口属性
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(wc));
	wc.style = 0;  // 窗口类型?
	wc.lpfnWndProc = MyWinProc; // 回调函数
	wc.cbClsExtra = 0; // 类分配的额外字节数
	wc.cbWndExtra = 0; // 窗口分配的额外字节数
	wc.hInstance = hInstance; // 包含类的窗口过程的实例的句柄 ?
	wc.hIcon = LoadIcon(NULL, IDI_INFORMATION); // 窗口图标
	wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标形状
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 设置背景颜色
	wc.lpszMenuName = TEXT("窗口 menu"); // 菜单名字
	wc.lpszClassName = className; // 窗口类名 创建窗口时设置该名字,来引用该属性

	// 1. 注册窗口
	RegisterClass(&wc);

	// 2. 创建窗口
	HWND hWnd = CreateWindow(className,			// 创建的窗口类名
		TEXT("First Window"),		// 窗口名称
		WS_OVERLAPPEDWINDOW,		// 窗口类型
		200, 200,					// 窗口起始位置
		400, 300,					// 窗口宽高
		NULL,						// 父窗口句柄
		NULL,						// 菜单句柄
		hInstance,					// 要与该窗口关联的模块实例的句柄
		NULL						// 更 WM_CREATE 消息,通过 lparam 传入回调函数的数据
	);

	// 3. 显示窗口
	ShowWindow(hWnd, nShowCmd);
	UpdateWindow(hWnd);

	// 4. 消息分发
	MSG msg;
	BOOL ret;
	while ((ret = GetMessage(&msg, NULL, NULL, NULL)) != 0)
	{
		// 将类似组合键转换成可识别的
		TranslateMessage(&msg);
		// 分配消息
		DispatchMessage(&msg);
	}

	return 0;
}

参考文献

https://www.bilibili.com/video/BV1St41127CV?spm_id_from=333.337.search-card.all.click

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值