Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。
プライマリ サーフェスとバック バッファが作成されると、DDEx1 の例では、標準の Windows GDI 関数を使用してバック バッファ サーフェス上に何らかのテキストを書き込む。次に例を示す。
if (g_pDDSBack->GetDC(&hdc) == DD_OK) { SetBkColor(hdc, RGB(0, 0, 255)); SetTextColor(hdc, RGB(255, 255, 0)); if (phase) { GetClientRect(hWnd, &rc); GetTextExtentPoint(hdc, szMsg, lstrlen(szMsg), &size); TextOut(hdc, (rc.right - size.cx) / 2, (rc.bottom - size.cy) / 2, szMsg, sizeof(szMsg) - 1); TextOut(hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg)); phase = 0; } else { TextOut(hdc, 0, 0, szBackMsg, lstrlen(szBackMsg)); phase = 1; } g_pDDSBack->ReleaseDC(hdc); }
この例では、IDirectDrawSurface7::GetDC メソッドを使ってデバイス コンテキストのハンドルを取得し、内部的にバック バッファをロックする。デバイス コンテキストのハンドルを必要とする Windows 関数を使用しない場合は、IDirectDrawSurface7::Lock および IDirectDrawSurface7::Unlock メソッドを使って、バック バッファをロックしたりロックを解除したりすることができる。
次に、プライマリ バッファ メッセージまたはバック バッファ メッセージのどちらが書き込まれるべきかを phase 変数で決定する。phase 変数が 1 の場合はプライマリ バッファ メッセージが書き込まれて、phase 変数が 0 に設定される。phase 変数が 0 の場合は、バック バッファ メッセージが書き込まれて、phase 変数が 1 に設定される。
メッセージがバック バッファに書き込まれた後、IDirectDrawSurface7::ReleaseDC メソッドによってバック バッファのロックが解除される。
サーフェス メモリ (サーフェスの全体もしくは一部) をロックすると、アプリケーションとシステム ブリットを同時にサーフェス メモリへアクセスできなくなる。このため、アプリケーションがサーフェス メモリへ書き込む間に発生するエラーを回避できる。さらに、サーフェス メモリのロックが解除されるまで、アプリケーションはページ フリップできない。
サーフェスがロックされた後、この例では標準の Windows GDI 関数を使用する。バックグラウンド カラーの設定に SetBkColor、バックグラウンドに配置するテキストの色の選択に SetTextColor、サーフェス上のテキストとバックグラウンド カラーの出力に TextOut を使用している。
テキストがバッファに書き込まれた後、この例では IDirectDrawSurface7::ReleaseDC メソッドを使い、サーフェスのロックを解除してハンドルを解放する。アプリケーションがバック バッファへの書き込みを終了するときは常に、アプリケーションに応じて IDirectDrawSurface7::ReleaseDC または IDirectDrawSurface7::Unlock のどちらかを呼び出さなければならない。サーフェスのロックが解除されるまで、アプリケーションはサーフェスをフリップできない。
注 : IDirectDrawSurface7::Unlock を使ってサーフェスのロックが解除されると、サーフェス メモリへのポインタは無効となる。サーフェス メモリへの有効なポインタを取得するには、再び IDirectDrawSurface7::Lock を使用しなくてはならない。