Windows 8の Direct2D クイック スタート
Direct2D は、2D グラフィックスを作成するためのネイティブ コードのイミディエイト モード API です。 このトピックでは、Direct2D を使用して Windows::UI::Core::CoreWindow に描画する方法について説明します。
このトピックは、次のセクションで構成されています。
- 単純な四角形の描画
- 手順 1: Direct2D ヘッダーを含める
- 手順 2: ID2D1Factory1 を作成する
- 手順 3: ID2D1Device と ID2D1DeviceContext を作成する
- 手順 4: ブラシを作成する
- 手順 5: 四角形を描画する
- コード例
単純な四角形の描画
GDI を使用して四角形を描画するには、次のコードに示すように、WM_PAINT メッセージを処理できます。
switch(message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
// Obtain the size of the drawing area.
RECT rc;
GetClientRect(
hwnd,
&rc
);
// Save the original object
HGDIOBJ original = NULL;
original = SelectObject(
ps.hdc,
GetStockObject(DC_PEN)
);
// Create a pen.
HPEN blackPen = CreatePen(PS_SOLID, 3, 0);
// Select the pen.
SelectObject(ps.hdc, blackPen);
// Draw a rectangle.
Rectangle(
ps.hdc,
rc.left + 100,
rc.top + 100,
rc.right - 100,
rc.bottom - 100);
DeleteObject(blackPen);
// Restore the original object
SelectObject(ps.hdc, original);
EndPaint(hwnd, &ps);
}
return 0;
// Code for handling other messages.
Direct2D で同じ四角形を描画するコードは似ています。描画リソースを作成し、描画する図形を記述し、図形を描画してから、描画リソースを解放します。 以下のセクションでは、これらの各手順について詳しく説明します。
手順 1: Direct2D ヘッダーを含める
アプリケーションに必要なヘッダーに加えて、d2d1.h ヘッダーと d2d1_1.h ヘッダーを含めます。
手順 2: ID2D1Factory1 を作成する
Direct2D の例で最初に行うことの 1 つは、 ID2D1Factory1 を作成する方法です。
DX::ThrowIfFailed(
D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
__uuidof(ID2D1Factory1),
&options,
&m_d2dFactory
)
);
ID2D1Factory1 インターフェイスは、Direct2D を使用するための開始点です。ID2D1Factory1 を使用して Direct2D リソースを作成します。
ファクトリを作成するときに、それがマルチスレッドかシングルスレッドかを指定できます。 (マルチスレッド ファクトリの詳細については、 ID2D1Factory リファレンス ページの解説を参照してください)。この例では、シングルスレッド ファクトリを作成します。
一般に、アプリケーションでファクトリを 1 回作成し、アプリケーションの有効期間にわたって保持する必要があります。
手順 3: ID2D1Device と ID2D1DeviceContext を作成する
ファクトリを作成したら、それを使用して Direct2D デバイスを作成し、デバイスを使用して Direct2D デバイス コンテキストを作成します。 これらの Direct2D オブジェクトを作成するには、 Direct3D 11 デバイス 、 DXGI デバイス、 DXGI スワップ チェーンが必要です。 必要な前提条件の作成については、「 デバイスとデバイス コンテキスト 」を参照してください。
// Obtain the underlying DXGI device of the Direct3D11.1 device.
DX::ThrowIfFailed(
m_d3dDevice.As(&dxgiDevice)
);
// Obtain the Direct2D device for 2-D rendering.
DX::ThrowIfFailed(
m_d2dFactory->CreateDevice(dxgiDevice.Get(), &m_d2dDevice)
);
// And get its corresponding device context object.
DX::ThrowIfFailed(
m_d2dDevice->CreateDeviceContext(
D2D1_DEVICE_CONTEXT_OPTIONS_NONE,
&m_d2dContext
)
);
デバイス コンテキストは、描画操作を実行し、ブラシなどのデバイス依存の描画リソースを作成できるデバイスです。 また、デバイス コンテキストを使用して、レンダリング ターゲットとして使用する DXGI サーフェスに ID2D1Bitmap をリンクします。 デバイス コンテキストは、さまざまな種類のターゲットにレンダリングできます。
ここでのコードでは、 CoreWindow にレンダリングされる DXGI スワップ チェーンにリンクするビットマップのプロパティを宣言しています。 ID2D1DeviceContext::CreateBitmapFromDxgiSurface メソッドは、DXGI サーフェスから Direct2D サーフェスを取得します。 これにより、ターゲット ID2D1Bitmap にレンダリングされるものがスワップ チェーンの表面にレンダリングされます。
Direct2D サーフェスを取得したら、 ID2D1DeviceContext::SetTarget メソッドを使用して、アクティブなレンダー ターゲットとして設定します。
// Now we set up the Direct2D render target bitmap linked to the swapchain.
// Whenever we render to this bitmap, it will be directly rendered to the
// swapchain associated with the window.
D2D1_BITMAP_PROPERTIES1 bitmapProperties =
BitmapProperties1(
D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
m_dpi,
m_dpi
);
// Direct2D needs the dxgi version of the backbuffer surface pointer.
ComPtr<IDXGISurface> dxgiBackBuffer;
DX::ThrowIfFailed(
m_swapChain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer))
);
// Get a D2D surface from the DXGI back buffer to use as the D2D render target.
DX::ThrowIfFailed(
m_d2dContext->CreateBitmapFromDxgiSurface(
dxgiBackBuffer.Get(),
&bitmapProperties,
&m_d2dTargetBitmap
)
);
// So now we can set the Direct2D render target.
m_d2dContext->SetTarget(m_d2dTargetBitmap.Get());
手順 4: ブラシを作成する
ファクトリと同様に、デバイス コンテキストでは描画リソースを作成できます。 この例では、デバイス コンテキストによってブラシが作成されます。
ComPtr<ID2D1SolidColorBrush> pBlackBrush;
DX::ThrowIfFailed(
m_d2dContext->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::Black),
&pBlackBrush
)
);
ブラシは、図形のストロークやジオメトリの塗りつぶしなど、領域を描画するオブジェクトです。 この例のブラシは、定義済みの単色の黒で領域を塗りつぶします。
Direct2D には、線形グラデーションと放射状グラデーションを描画するためのグラデーション ブラシ、ビットマップとパターンで描画するためのビットマップ ブラシ、レンダリングされたイメージで描画するためのイメージ ブラシWindows 8から始まる、他の種類のブラシも用意されています。
一部の描画 API には、図形を塗りつぶすアウトラインとブラシを描画するためのペンが用意されています。 Direct2D は異なります。ペン オブジェクトは提供されませんが、アウトラインの描画や図形の塗りつぶしにブラシを使用します。 アウトラインを描画するときは、ID2D1StrokeStyle インターフェイスを使用するか、ID2D1StrokeStyle1 インターフェイスWindows 8で開始し、パスストローク操作を制御するブラシを使用します。
ブラシは、ブラシを作成したレンダー ターゲットと、同じリソース ドメイン内の他のレンダー ターゲットでのみ使用できます。 一般に、ブラシを 1 回作成し、ブラシを作成したレンダー ターゲットの有効期間にわたって保持する必要があります。 ID2D1SolidColorBrush は単独の例外です。比較的安価に作成できるため、フレームを描画するたびに ID2D1SolidColorBrush を作成できます。パフォーマンスに大きな影響はありません。 1 つの ID2D1SolidColorBrush を使用し、使用するたびにその色または不透明度を変更することもできます。
手順 5: 四角形を描画する
次に、デバイス コンテキストを使用して四角形を描画します。
m_d2dContext->BeginDraw();
m_d2dContext->DrawRectangle(
D2D1::RectF(
rc.left + 100.0f,
rc.top + 100.0f,
rc.right - 100.0f,
rc.bottom - 100.0f),
pBlackBrush);
DX::ThrowIfFailed(
m_d2dContext->EndDraw()
);
DX::ThrowIfFailed(
m_swapChain->Present1(1, 0, ¶meters);
);
DrawRectangle メソッドは、描画する四角形と、四角形のアウトラインの描画に使用するブラシという 2 つのパラメーターを受け取ります。 必要に応じて、ストロークの幅、破線パターン、線結合、および終了キャップのオプションを指定することもできます。
描画コマンドを発行する前に BeginDraw メソッドを呼び出す必要があり、描画コマンドの発行が完了したら EndDraw メソッドを呼び出す必要があります。 EndDraw メソッドは、描画コマンドが成功したかどうかを示す HRESULT を返します。 成功しなかった場合、ThrowIfFailed ヘルパー関数は例外をスローします。
IDXGISwapChain::P resent メソッドは、バッファーサーフェイスを画面上の と入れ替えて結果を表示します。
コード例
このトピックのコードでは、Direct2D アプリケーションの基本的な要素を示します。 簡潔にするために、このトピックでは、適切に記述されたアプリケーションの特性であるアプリケーション フレームワークとエラー処理コードを省略しています。