元の DirectDraw インターフェイスを使用して、単一のバッファ付きウィンドウ アプリケーションを作成しようとしています。
これは純粋に教育目的であり、正当な理由による態度です。インターフェイスをいじっていIDirectDraw
ます (DirectX 1.0 のように、これがオリジナル バージョンであることを強調します)。
現在、ドキュメンテーションには、バック バッファの作成と、プライマリ サーフェスとバック バッファ サーフェス間の反転に関する一連のチュートリアルが含まれています。
ただし、ウィンドウ化された単一バッファ アプリケーションの記述については説明していません。実際、私はそのアイデアへの言及をほとんど見つけることができません。それが不可能であることを示すものは何もありません。
アプリケーションとの連携レベルを設定することDDSCL_NORMAL
で、ウィンドウ内で動作します。
hr = IDirectDraw_SetCooperativeLevel(lpDirectDraw, hWnd_, DDSCL_NORMAL);
if (hr != DD_OK)
return -1;
続いて、成功後にプライマリ サーフェスを作成します。
ZeroMemory(&ddSurfaceDesc, sizeof ddSurfaceDesc);
ddSurfaceDesc.dwSize = sizeof ddSurfaceDesc;
ddSurfaceDesc.dwFlags = DDSD_CAPS;
ddSurfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = IDirectDraw_CreateSurface(lpDirectDraw, &ddSurfaceDesc, &lpDirectDrawPrimarySurface, (IUnknown *) NULL);
if (hr != DD_OK)
return -1;
この関数も成功します。バックバッファを作成しないことに注意してください。
ただし、私のメインループでは:
while (fIterateLoop)
{
for (ZeroMemory(&msg, sizeof msg); PeekMessage(&msg, (HWND) NULL, 0, 0, PM_REMOVE); DispatchMessage(&msg))
fIterateLoop = msg.message == WM_QUIT ? FALSE : TRUE;
if (fDraw && lpDirectDrawPrimarySurface != (LPDIRECTDRAWSURFACE) NULL)
{
HDC hdc;
hr = IDirectDrawSurface_GetDC(lpDirectDrawPrimarySurface, &hdc);
if (hr == DD_OK)
{
SetBkColor(hdc, RGB(0, 0, 0));
SetTextColor(hdc, RGB(255, 255, 255));
TextOut(hdc, 15, 15, "hello, world!", sizeof "hello, world!" - 1);
hr = IDirectDrawSurface_ReleaseDC(lpDirectDrawPrimarySurface, hdc);
}
}
}
ウィンドウには何も描画されません。私の元のコード (フルスクリーンのバッファリングされたアプリケーション) は、「hello, world!」を正しく表示します。画面の左上にあり、唯一の変更は、バックバッファーの作成を停止し、プライマリ サーフェスに直接書き込むための小さな編集です。
で呼び出しCreateSurface
た後にバックバッファのオプションで呼び出すSetCooperativeLevel
とDDSCL_NORMAL
、エラーが返されます。ドキュメントに次のように記載されているため、これは理解できます。
IDirectDraw::SetCooperativeLevel を使用してモードを DDSCL_NORMAL に設定していた場合、サーフェス間でブリットするサーフェスしか作成できませんでした。
私は何かを逃しましたか?DirectDraw を根本的に誤解していませんか? バッファを使用することは次の目的であるという印象を受けました。
- パフォーマンス上の利点、および
- 画面割れ防止に。
私はこれらのどちらも気にしません。私に何ができる?