Win32 API 日本語リファレンス
ホームGraphics.Direct2D › ID2D1HwndRenderTarget

ID2D1HwndRenderTarget

COM
IID2cd90698-12e2-11dc-9fed-001143a055f9継承元ID2D1RenderTarget自前メソッド開始 vtbl57

公式ドキュメント

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

解説(Remarks)

他のレンダーターゲットと同様に、描画コマンドを発行する前に BeginDraw を呼び出す必要があります。描画が完了したら、EndDraw を呼び出して描画が終了したことを示し、レンダーターゲットを支えるバッファへのアクセスを解放します。

ID2D1HwndRenderTarget の場合、BeginDraw の唯一の副作用は、描画コマンドを発行できるようにレンダーターゲットの状態を変更することです。

EndDraw はバッチ処理された描画コマンドをすべてフラッシュします。エラーが発生していなければ、バッファをプレゼントし、関連付けられたウィンドウに表示させます。最後に、EndDraw は描画またはプレゼント中に最初に発生したエラーの HRESULT と、そのエラー発生時のタグの状態を返します。

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

ハードウェアレンダーターゲットのバックバッファは、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;
}

この例ではコードの一部を省略しています。

メソッド 3

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 57 D2D1_WINDOW_STATE CheckWindowState()

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

戻り値

型: D2D1_WINDOW_STATE

このレンダーターゲットに関連付けられた HWND が遮蔽されているかどうかを示す値。

解説(Remarks)

注意 前回 EndDraw が呼び出されたときにウィンドウが遮蔽されていた場合、次にレンダーターゲットが CheckWindowState を呼び出すと、現在のウィンドウ状態にかかわらず D2D1_WINDOW_STATE_OCCLUDED を返します。CheckWindowState を使用して現在のウィンドウ状態を判定したい場合は、EndDraw を呼び出すたびに CheckWindowState を呼び出し、その戻り値を無視してください。この呼び出しにより、次に CheckWindowState を呼び出したときに実際のウィンドウ状態が返されるようになります。
vtbl 58 HRESULT Resize(D2D_SIZE_U* pixelSize)
pixelSizeD2D_SIZE_U*inリサイズ後のレンダーターゲットのピクセル寸法へのポインタ。
vtbl 59 HWND GetHwnd()

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

戻り値

型: HWND

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

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_ID2D1HwndRenderTarget "{2CD90698-12E2-11DC-9FED-001143A055F9}"
#usecom global ID2D1HwndRenderTarget IID_ID2D1HwndRenderTarget "{}"
#comfunc global ID2D1HwndRenderTarget_CheckWindowState  57
#comfunc global ID2D1HwndRenderTarget_Resize            58 var
#comfunc global ID2D1HwndRenderTarget_GetHwnd           59
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。