ID2D1HwndRenderTarget インターフェイス

描画命令をウィンドウにレンダリングします。

実装するタイミング

カスタム実装はサポートされません。

メンバー

ID2D1HwndRenderTarget インターフェイス の継承元は次のとおりです: ID2D1RenderTarget. ID2D1HwndRenderTarget は次のメンバーも定義します:

  • メソッド

メソッド

ID2D1HwndRenderTarget インターフェイス は次の項目を定義します: メソッド.

メソッド 説明
CheckWindowState

このレンダー ターゲットに関連付けられた HWND が妨げられているかどうかを示します。

GetHwnd

このレンダー ターゲットに関連付けられた HWND を返します。

Resize

レンダー ターゲットのサイズを、指定されたピクセル サイズに変更します (オーバーロードは 2 つ)。

 

解説

他のレンダー ターゲットの場合と同様に、描画コマンドを発行する前に BeginDraw を呼び出す必要があります。描画が完了したら、EndDraw を呼び出して描画が完了したことを示し、バッファーへのアクセスを解放してレンダー ターゲットを戻します。ID2D1HwndRenderTarget では、BeginDraw の副作用は、描画コマンドを発行できるようにレンダー ターゲットの状態が変更されることだけです。EndDraw は、バッチ処理されたすべての描画コマンドをフラッシュします。エラーが発生しなかった場合、このメソッドはバッファーも表示します。このバッファーは関連付けられたウィンドウに表示されます。最後に、EndDraw は、描画または表示で発生した最初のエラーの HRESULT、およびエラーが発生した時点のタグ状態を返します。

ID2D1HwndRenderTarget オブジェクトはダブル バッファーされるため、発行された描画コマンドはすぐに表示されるのではなく、オフスクリーン サーフェイスで実行されます。EndDraw が呼び出されると、レンダリング エラーが発生していない場合は、オフスクリーン バッファーが表示されます。EndDraw によってフラッシュされたバッチでレンダリング エラーが発生した場合、バッファーは表示されないため、アプリケーションは BeginDraw を呼び出してフレームを再描画する必要があります。エラーに関係なくアプリケーションでフレームを表示する場合、Flush を使用すると、EndDraw を呼び出す前にエラーがあるかどうかをチェックできます。

ハードウェア レンダー ターゲットのバック バッファーは、GetPixelSize によって指定されたサイズです。EndDraw がバッファーを表示する場合、このビットマップは、バッファーが表示されるサーフェイス (ウィンドウのクライアント領域全体) を含むように拡大されます。この拡大は、レンダー ターゲットがハードウェアにレンダリングされる場合はバイリニア フィルタリングを使用して行われ、レンダー ターゲットがソフトウェアを使用している場合はニアレストネイバー フィルタリングを使用して行われます (通常、アプリケーションは Resize を呼び出して、レンダー ターゲットのピクセル サイズと出力先のピクセル サイズが一致し、スケーリングが不要になるようにしますが、これは要件ではありません)。

ウィンドウが複数のアダプターにまたがる場合、Direct2D では、オフスクリーン レンダー ターゲットの一部が、レンダリングが行われているアダプターから、コンテンツを表示する必要があるアダプターにコピーされるようにします。レンダー ターゲットが存在するアダプターが削除された場合またはアプリケーションの実行中にドライバーがアップグレードされた場合、これは EndDraw 呼び出しのエラーとして返されます。この場合、アプリケーションは、必要に応じて、新しいレンダー ターゲットとリソースを作成する必要があります。

ID2D1HwndRenderTarget オブジェクトの作成

ID2D1HwndRenderTarget を作成するには、ID2D1Factory::CreateHwndRenderTarget メソッドを使用します。

アプリケーションでは、一度レンダー ターゲットを作成したら、アプリケーションが有効な間またはレンダー ターゲットの EndDraw メソッドから D2DERR_RECREATE_TARGET エラーが返されるまでは、そのターゲットを保持する必要があります。このエラーが発生すると、レンダー ターゲット (およびレンダー ターゲットによって作成されたすべてのリソース) を作成し直す必要があります。

次の例では、CreateHwndRenderTarget メソッドを使用して ID2D1HwndRenderTarget を作成します。

  RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRenderTarget
    );

次の例では、ID2D1HwndRenderTarget を使用して、ウィンドウにテキストを描画します。

  //  Called whenever the application needs to display the client
//  window. This method writes "Hello, World"
//
//  Note that this function will automatically discard device-specific
//  resources if the Direct3D device disappears during function
//  invocation, and will recreate the resources the next time it's
//  invoked.
//
HRESULT DemoApp::OnRender()
{
    HRESULT hr;

    hr = CreateDeviceResources();

    if (SUCCEEDED(hr))
    {
        static const WCHAR sc_helloWorld[] = L"Hello, World!";

        // Retrieve the size of the render target.
        D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();

        m_pRenderTarget->BeginDraw();

        m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

        m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

        m_pRenderTarget->DrawText(
            sc_helloWorld,
            ARRAYSIZE(sc_helloWorld) - 1,
            m_pTextFormat,
            D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
            m_pBlackBrush
            );

        hr = m_pRenderTarget->EndDraw();

        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
    }

    return hr;
}

この例では、コードが省略されています。完全なサンプルについては、「"Hello, World" サンプル」を参照してください。

要件

クライアントの最小要件

Windows 7, Windows Vista SP2 および Windows Vista 用のプラットフォーム更新プログラム

サーバーの最小要件

Windows Server 2008 R2, Windows Server 2008 SP2 および Windows Server 2008 用のプラットフォーム更新プログラム

ヘッダー

D2d1.h

ライブラリ

D2d1.lib

DLL

D2d1.dll