ID2D1HwndRenderTarget
COM公式ドキュメント
描画命令をウィンドウにレンダリングします。
解説(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。
このレンダーターゲットに関連付けられた HWND が遮蔽されているかどうかを示します。
戻り値
このレンダーターゲットに関連付けられた HWND が遮蔽されているかどうかを示す値。
解説(Remarks)
| pixelSize | D2D_SIZE_U* | in | リサイズ後のレンダーターゲットのピクセル寸法へのポインタ。 |
このレンダーターゲットに関連付けられた HWND を返します。
戻り値
型: HWND
このレンダーターゲットに関連付けられた HWND。
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 方式にも切替可。#define global IID_ID2D1HwndRenderTarget "{2CD90698-12E2-11DC-9FED-001143A055F9}" #usecom global ID2D1HwndRenderTarget IID_ID2D1HwndRenderTarget "{}" #comfunc global ID2D1HwndRenderTarget_CheckWindowState 57 #comfunc global ID2D1HwndRenderTarget_Resize 58 sptr #comfunc global ID2D1HwndRenderTarget_GetHwnd 59 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。