DirectX中设备创建,以及表面缓冲区的使用

本次学习了如何在DirectX中创建一个表面并在窗口中显示出来。

用到了下面的4个函数:

//游戏窗口主要用到的函数
//初始化函数
void InitDdraw(HWND hwnd);
//销毁窗口前释放函数
void FreeDdraw();
//更新函数
void Update();
//重绘函数
void Render();

用到的全局变量

//游戏窗口用到的变量
//DirectDraw对象
LPDIRECTDRAW7 g_Lpdd;
//DirectX主表面
LPDIRECTDRAWSURFACE7 g_MainSurface;
//DirectX后背表面
LPDIRECTDRAWSURFACE7 g_BackSurface;
//全局窗口句柄
HWND g_MainHwnd;
//是否刷新窗口
bool IsFlash;

下面是几个函数的具体实现:


void InitDdraw(HWND hwnd)
{
	//创建一个D3D对象
	if (FAILED(DirectDrawCreateEx(NULL, (void**)&g_Lpdd, IID_IDirectDraw7, NULL))){
		return;
	}
	//设置窗口协作等级
	if (FAILED(g_Lpdd->SetCooperativeLevel(hwnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE)))
	{
		return;
	}
	//表面数据结构
	DDSURFACEDESC2 ddsd;
	ZeroMemory(&ddsd, sizeof(ddsd));
	ddsd.dwSize = sizeof(ddsd);

	ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |DDSCAPS_FLIP | DDSCAPS_COMPLEX;
	ddsd.dwBackBufferCount = 1;
	//创建主表面
	if (FAILED(g_Lpdd->CreateSurface(&ddsd, &g_MainSurface, NULL))){
		return;
	}
	//创建后背表面
	ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
	if (FAILED(g_MainSurface->GetAttachedSurface(&ddsd.ddsCaps, &g_BackSurface))){
		return;
	}

}

void FreeDdraw()
{
	//窗口析构函数

	if (g_BackSurface != NULL)
	{
		g_BackSurface->Release();
	}

	if (g_MainSurface != NULL)
	{
		g_MainSurface->Release();
	}

	if (g_Lpdd != NULL)
	{
		g_Lpdd->Release();
	}

}

void Render()
{
	//颜色数据结构
	DDBLTFX ddb;
	ZeroMemory(&ddb, sizeof(ddb));
	ddb.dwSize = sizeof(ddb);
	if (IsFlash)
	{
		ddb.dwFillColor = RGB(255, 0, 0);
	}
	else
	{
		ddb.dwFillColor = RGB(0, 255, 0);
	}
	
	//后背表面填充
	g_BackSurface->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddb);
	//主表面翻转
	g_MainSurface->Flip(g_BackSurface, NULL);
}

void Update()
{
	IsFlash = !IsFlash;
}



那么怎么实现在windows下面显示Directx指定的窗口呢?

首先在主程序初始化函数中调用初始化函数void InitDdraw(HWND hwnd),并在其中设置一个定时器,然后在WM_TIMMER函数中添加void Update();
和函数void Render();实现窗口的更新和重绘,就可以正常在窗口中显示了,最后窗口运行完成需要在主函数退出前调用销毁窗口的函数void FreeDdraw();


以上就完成了一个简单的DirectX窗口的创建和显示等,并且熟悉了主后背表面的协作使用,来实现窗口的更新。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值