Platform SDK: DirectX

ステップ 5 : サーフェスへの書き込み

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。

[C++]

プライマリ サーフェスバック バッファが作成されると、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 を使用しなくてはならない。

次項 :ステップ 6 : サーフェスのフリップ