本次学习了如何在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窗口的创建和显示等,并且熟悉了主后背表面的协作使用,来实现窗口的更新。