Platform SDK: DirectX

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

[Visual Basic]

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

[C++]

DDEx1 の WM_TIMER メッセージは、バック バッファ.へのフリップに使用される。サーフェス メモリのロックが解除されると、バック バッファプライマリ サーフェスにフリップする IDirectDrawSurface7::Flip メソッドを使用できるようになる。次に例を示す。

    case WM_TIMER:
        // サーフェスを更新しフリップする。
        if (g_bActive && TIMER_ID == wParam)
        {
            UpdateFrame(hWnd);
            while (TRUE)
            {
                hRet = g_pDDSPrimary->Flip(NULL, 0);
                if (hRet == DD_OK)
                    break;
                if (hRet == DDERR_SURFACELOST)
                {
                    hRet = g_pDDSPrimary->Restore();
                    if (hRet != DD_OK)
                        break;
                }
                if (hRet != DDERR_WASSTILLDRAWING)
                    break;
            }
        }
        break;

この例では、g_pDDSPrimary パラメータがプライマリ サーフェスとそれに関連付けられたバック バッファを指定する。IDirectDrawSurface7::Flip が呼び出されると、フロント サーフェスとバック サーフェスが交換される (サーフェスへのポインタだけが変更され、実際にデータが移動するわけではない)。フリップが成功して DD_OK が返されると、アプリケーションは while ループから抜ける。

フリップが DDERR_SURFACELOST 値を返す場合、IDirectDrawSurface7::Restore メソッドを使ってサーフェスをリストアしようとする。リストアが成功すると、アプリケーションはループに戻り、IDirectDrawSurface7::Flip の呼び出しを再び試みる。リストアが失敗すると、アプリケーションは while ループを抜けて、エラーを返す。

 :  IDirectDrawSurface7::Flip を呼び出す場合、フリップはすぐに完了しない。むしろ、システムで垂直帰線が発生した後にフリップが計画される。たとえば、直前のフリップが発生していなければ、IDirectDrawSurface7::Flip DDERR_WASSTILLDRAWING を返す。この例では、IDirectDrawSurface7::Flip の呼び出しは DD_OK を返すまでループし続ける。

次項 :ステップ 7 : DirectDraw オブジェクトの割り当て解除