将文本绘制到 IDirect3DSurface9
Draw a Text into a IDirect3DSurface9
我正在寻找一种将文本绘制到实现 class 的 IDirect3DSurface9 的方法。我的目标是在截图中写一些文字,比如截图的时间。
制作我的游戏截图的原始(工作)代码:
void CreateScreenShot(IDirect3DDevice9* device, int screenX, int screenY)
{
IDirect3DSurface9* frontbuf; //this is our pointer to the memory location containing our copy of the front buffer
// Creation of the surface where the screen shot will be copied to
device->CreateOffscreenPlainSurface(screenX, screenY, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &frontbuf, NULL);
// Copying of the Back Buffer to our surface
HRESULT hr = device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &frontbuf);
if (hr != D3D_OK)
{
frontbuf->Release();
return;
}
// Aquiring of the Device Context of the surface to be able to draw into it
HDC surfaceDC;
if (frontbuf->GetDC(&surfaceDC) == D3D_OK)
{
drawInformationToSurface(surfaceDC, screenX);
frontbuf->ReleaseDC(surfaceDC);
}
// Saving the surface to a file. Creating the screenshot file
D3DXSaveSurfaceToFile("ScreenShot.bmp", D3DXIFF_BMP, frontbuf, NULL, NULL);
}
现在如您所见,我创建了一个名为 drawInformationToSurface(HDC surfaceDC, int screenX)
的辅助方法,它应该在将当前时间保存到 HDD 之前将其写入 Surface。
void drawInformationToSurface(HDC surfaceDC, int screenX)
{
// Creation of a new DC for drawing operations
HDC memDC = CreateCompatibleDC(surfaceDC);
// Aquiring of the current time String with my global Helper Method
const char* currentTimeStr = GetCurrentTimeStr();
// Preparing of the HDC
SetBkColor(memDC, 0xff000000);
SetBkMode(memDC, TRANSPARENT);
SetTextAlign(memDC, TA_TOP | TA_LEFT);
SetTextColor(memDC, GUI_FONT_COLOR_Y);
// Draw a the time to the surface
ExtTextOut(memDC, 0, 0, ETO_CLIPPED, NULL, currentTimeStr, strlen(currentTimeStr), NULL);
// Free resources for the mem DC
DeleteDC(memDC);
}
遗憾的是,拍摄的 ScreenShot.bmp 仅包含游戏截图,但其中没有其他文本。
我哪里错了?
CreateCompatibleDC
为您提供一个新的 DC,它与现有的兼容,但实际上并不是同一个 DC。当创建一个新的 DC 时,它有一个默认的 1x1 位图 select 进入它 - 你需要 select 你自己的位图在它的位置,然后你可以渲染到你的内存位图(然后恢复旧的位图之后)。
目前您的绘图全部发生在这个默认的 1x1 位图上,然后在您删除 DC 时被简单地丢弃。
为什么要在 drawInformationToSurface
函数中创建一个新的 DC?在我看来,您应该直接绘制传入的 surfaceDC
.
我正在寻找一种将文本绘制到实现 class 的 IDirect3DSurface9 的方法。我的目标是在截图中写一些文字,比如截图的时间。
制作我的游戏截图的原始(工作)代码:
void CreateScreenShot(IDirect3DDevice9* device, int screenX, int screenY)
{
IDirect3DSurface9* frontbuf; //this is our pointer to the memory location containing our copy of the front buffer
// Creation of the surface where the screen shot will be copied to
device->CreateOffscreenPlainSurface(screenX, screenY, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &frontbuf, NULL);
// Copying of the Back Buffer to our surface
HRESULT hr = device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &frontbuf);
if (hr != D3D_OK)
{
frontbuf->Release();
return;
}
// Aquiring of the Device Context of the surface to be able to draw into it
HDC surfaceDC;
if (frontbuf->GetDC(&surfaceDC) == D3D_OK)
{
drawInformationToSurface(surfaceDC, screenX);
frontbuf->ReleaseDC(surfaceDC);
}
// Saving the surface to a file. Creating the screenshot file
D3DXSaveSurfaceToFile("ScreenShot.bmp", D3DXIFF_BMP, frontbuf, NULL, NULL);
}
现在如您所见,我创建了一个名为 drawInformationToSurface(HDC surfaceDC, int screenX)
的辅助方法,它应该在将当前时间保存到 HDD 之前将其写入 Surface。
void drawInformationToSurface(HDC surfaceDC, int screenX)
{
// Creation of a new DC for drawing operations
HDC memDC = CreateCompatibleDC(surfaceDC);
// Aquiring of the current time String with my global Helper Method
const char* currentTimeStr = GetCurrentTimeStr();
// Preparing of the HDC
SetBkColor(memDC, 0xff000000);
SetBkMode(memDC, TRANSPARENT);
SetTextAlign(memDC, TA_TOP | TA_LEFT);
SetTextColor(memDC, GUI_FONT_COLOR_Y);
// Draw a the time to the surface
ExtTextOut(memDC, 0, 0, ETO_CLIPPED, NULL, currentTimeStr, strlen(currentTimeStr), NULL);
// Free resources for the mem DC
DeleteDC(memDC);
}
遗憾的是,拍摄的 ScreenShot.bmp 仅包含游戏截图,但其中没有其他文本。
我哪里错了?
CreateCompatibleDC
为您提供一个新的 DC,它与现有的兼容,但实际上并不是同一个 DC。当创建一个新的 DC 时,它有一个默认的 1x1 位图 select 进入它 - 你需要 select 你自己的位图在它的位置,然后你可以渲染到你的内存位图(然后恢复旧的位图之后)。
目前您的绘图全部发生在这个默认的 1x1 位图上,然后在您删除 DC 时被简单地丢弃。
为什么要在 drawInformationToSurface
函数中创建一个新的 DC?在我看来,您应该直接绘制传入的 surfaceDC
.