共通の処理 / 初期化とほぼ同じ処理をし、描画先のバックバッファのポインタを取得します。違いはD3DPRESENT_PARAMETERS構造体の「Flags」メンバに「D3DPRESENTFLAG_LOCKABLE_BACKBUFFER」を指定してデバイスコンテキストハンドルを取得可能な(ロック可能な)バックバッファを作成するところです。
D3DPRESENT_PARAMETERS param; ZeroMemory( ¶m, sizeof(param) ); param.BackBufferWidth = 320; param.BackBufferHeight = 240; param.BackBufferFormat = D3DFMT_X8R8G8B8; param.BackBufferCount = 1; param.SwapEffect = D3DSWAPEFFECT_DISCARD; param.Windowed = FALSE; param.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
LPDIRECT3DSURFACE9 g_lpBackBuffer = NULL; g_lpD3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &g_lpBackBuffer );
バックバッファへのデバイスコンテキストハンドルを取得し、描画します。テキストの描画が終了したら、デバイスコンテキストハンドルを解放します。
// デバイスコンテキストハンドルの取得 HDC hDC; g_lpBackBuffer->GetDC( &hDC ); // 文字列描画 char szStr[] = "Test"; int iLen = lstrlen( szStr ); ::TextOut( hDC, 0, 0, szStr, iLen ); // デバイスコンテキストハンドルの解放 g_lpBackBuffer->ReleaseDC( hDC );
バックバッファを表示します。
g_lpD3DDevice->Present( NULL, NULL, NULL, NULL );
作成した各オブジェクトを解放します。
// 解放 /* #define RELEASE(p) { if(p){(p)->Release();p=NULL;} } */ RELEASE( g_lpBackBuffer ); RELEASE( g_lpD3DDevice ); RELEASE( g_lpD3D );
ここまでの手順でテキストの描画を行えます。使用例のソースを置いておきます。