将文本绘制到 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.