ID2D1DCRenderTarget
COM公式ドキュメント
GDI デバイスコンテキストに描画コマンドを発行します。
解説(Remarks)
ID2D1DCRenderTarget オブジェクトの作成
ID2D1DCRenderTarget を作成するには、ID2D1Factory::CreateDCRenderTarget メソッドを使用します。DC レンダーターゲットで描画を行う前に、その BindDC メソッドを使用して GDI DC と関連付ける必要があります。これは、異なる DC を使用するたび、または描画対象の領域のサイズが変わるたびに行います。
DC レンダーターゲットを GDI と連携させるには、そのピクセル形式を DXGI_FORMAT_B8G8R8A8_UNORM に、アルファモードを D2D1_ALPHA_MODE_PREMULTIPLIED または D2D1_ALPHA_MODE_IGNORE に設定します。
アプリケーションでは、レンダーターゲットを一度だけ作成し、アプリケーションが終了するまで、またはレンダーターゲットの EndDraw メソッドが D2DERR_RECREATE_TARGET エラーを返すまで、それらを保持しておく必要があります。このエラーを受け取った場合は、レンダーターゲット(およびそれが作成したすべてのリソース)を再作成する必要があります。
ID2D1DCRenderTarget、GDI 変換、および右から左に記述する言語版の Windows
ID2D1DCRenderTarget を使用すると、Direct2D のコンテンツが内部ビットマップにレンダリングされ、その後 GDI によってそのビットマップが DC にレンダリングされます。GDI が(SetWorldTransform メソッドを通じて)GDI 変換やその他の効果を、レンダーターゲットが使用しているのと同じ DC に適用することもあり、その場合 GDI は Direct2D が生成したビットマップを変換します。GDI 変換を使用して Direct2D のコンテンツを変換すると、アンチエイリアシングやサブピクセル配置がすでに計算済みのビットマップを変換することになるため、出力の視覚的な品質が低下する可能性があります。
たとえば、アンチエイリアス処理されたジオメトリとテキストを含むシーンを、レンダーターゲットを使用して描画するとします。GDI 変換を使用して DC に拡大変換を適用し、シーンを 10 倍に拡大すると、ピクセル化やギザギザのエッジが見られます。(ただし、同様の変換を Direct2D を使用して適用した場合は、シーンの視覚的品質は低下しません。)
場合によっては、GDI が Direct2D コンテンツの品質を低下させる可能性のある追加処理を行っていることが、明白でないことがあります。たとえば、右から左に記述する(RTL)版の Windows では、ID2D1DCRenderTarget によってレンダリングされたコンテンツが、GDI によって描画先にコピーされる際に水平方向に反転することがあります。コンテンツが実際に反転するかどうかは、DC の現在の設定によって異なります。
レンダリングするコンテンツの種類によっては、この反転を防ぎたい場合があります。Direct2D コンテンツに ClearType テキストが含まれている場合、この反転によってテキストの品質が低下します。
RTL のレンダリング動作は、GDI の SetLayout 関数を使用して制御できます。ミラーリングを防ぐには、次の例に示すように、GDI の SetLayout 関数を呼び出し、第 2 パラメーターの唯一の値として LAYOUT_BITMAPORIENTATIONPRESERVED を指定します(LAYOUT_RTL と組み合わせないでください)。
SetLayout(m_hwnd, LAYOUT_BITMAPORIENTATIONPRESERVED);
例
次のコードは DC レンダーターゲットを作成します。
// Create a DC render target.
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_IGNORE),
0,
0,
D2D1_RENDER_TARGET_USAGE_NONE,
D2D1_FEATURE_LEVEL_DEFAULT
);
hr = m_pD2DFactory->CreateDCRenderTarget(&props, &m_pDCRT);
前述のコードにおいて、m_pD2DFactory は ID2D1Factory へのポインター、m_pDCRT は ID2D1DCRenderTarget へのポインターです。
次のコード例は、DC を ID2D1DCRenderTarget にバインドします。
HRESULT DemoApp::OnRender(const PAINTSTRUCT &ps)
{
// Get the dimensions of the client drawing area.
GetClientRect(m_hwnd, &rc);
// Bind the DC to the DC render target.
hr = m_pDCRT->BindDC(ps.hdc, &rc);
Direct2D で GDI を使用する方法の詳細については、「Direct2D and GDI Interoperation Overview」を参照してください。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
レンダーターゲットを、描画コマンドを発行する対象のデバイスコンテキストにバインドします。
| hDC | HDC | in | レンダーターゲットが描画コマンドを発行する対象のデバイスコンテキスト。 |
| pSubRect | RECT* | in | レンダーターゲットがバインドされるデバイスコンテキスト(HDC)へのハンドルの寸法。 |
戻り値
解説(Remarks)
DC レンダーターゲットで描画を行う前に、その BindDC メソッドを使用して GDI DC と関連付ける必要があります。これは、異なる DC を使用するたび、または描画対象の領域のサイズが変わるたびに行います。
例
前述のコードにおいて、m_pD2DFactory は ID2D1Factory へのポインター、m_pDCRT は ID2D1DCRenderTarget へのポインターです。
次のコード例は、DC を ID2D1DCRenderTarget にバインドします。
HRESULT DemoApp::OnRender(const PAINTSTRUCT &ps)
{
// Get the dimensions of the client drawing area.
GetClientRect(m_hwnd, &rc);
// Bind the DC to the DC render target.
hr = m_pDCRT->BindDC(ps.hdc, &rc);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID2D1DCRenderTarget "{1C51BC64-DE61-46FD-9899-63A5D8F03950}" #usecom global ID2D1DCRenderTarget IID_ID2D1DCRenderTarget "{}" #comfunc global ID2D1DCRenderTarget_BindDC 57 sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID2D1DCRenderTarget "{1C51BC64-DE61-46FD-9899-63A5D8F03950}" #usecom global ID2D1DCRenderTarget IID_ID2D1DCRenderTarget "{}" #comfunc global ID2D1DCRenderTarget_BindDC 57 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。