次の方法で共有


Direct2D クイック スタート

Direct2D は、2D グラフィックスを作成するためのネイティブ コードのイミディエイト モード API です。 このトピックでは、一般的な Win32 アプリケーション内で Direct2D を使用して HWND に描画する方法について説明します。

注意

Direct2D を使用する Windows ストア アプリを作成する場合は、Windows 8の Direct2D クイック スタートに関するトピックを参照してください。

 

このトピックは、次のセクションで構成されています。

単純な四角形の描画

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 ヘッダーを含める

Win32 アプリケーションに必要なヘッダーに加えて、d2d1.h ヘッダーを含めます。

手順 2: ID2D1Factory を作成する

Direct2D の例で最初に行うことの 1 つは、 ID2D1Factory を作成する方法です。

ID2D1Factory* pD2DFactory = NULL;
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    &pD2DFactory
    );

ID2D1Factory インターフェイスは、Direct2D を使用するための開始点です。ID2D1Factory を使用して Direct2D リソースを作成します。

ファクトリを作成するときに、それがマルチスレッドかシングルスレッドかを指定できます。 (マルチスレッド ファクトリの詳細については、 ID2D1Factory リファレンス ページの解説を参照してください)。この例では、シングルスレッド ファクトリを作成します。

一般に、アプリケーションでファクトリを 1 回作成し、アプリケーションの有効期間にわたって保持する必要があります。

手順 3: ID2D1HwndRenderTarget を作成する

ファクトリを作成した後、それを使用してレンダー ターゲットを作成します。



// Obtain the size of the drawing area.
RECT rc;
GetClientRect(hwnd, &rc);

// Create a Direct2D render target          
ID2D1HwndRenderTarget* pRT = NULL;          
HRESULT hr = pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(
        hwnd,
        D2D1::SizeU(
            rc.right - rc.left,
            rc.bottom - rc.top)
    ),
    &pRT
);

レンダー ターゲットは、描画操作を実行し、ブラシなどのデバイス依存の描画リソースを作成できるデバイスです。 さまざまな種類のレンダー ターゲットが異なるデバイスにレンダリングされます。 前の例では、画面の一部にレンダリングされる ID2D1HwndRenderTarget を使用しています。

可能であれば、レンダー ターゲットは GPU を使用してレンダリング操作を高速化し、描画リソースを作成します。 それ以外の場合、レンダリング ターゲットは CPU を使用してレンダリング命令を処理し、リソースを作成します。 (この動作は、レンダー ターゲットの作成時に D2D1_RENDER_TARGET_TYPE フラグを使用して変更できます)。

CreateHwndRenderTarget メソッドは、3 つのパラメーターを受け取ります。 最初のパラメーター である D2D1_RENDER_TARGET_PROPERTIES 構造体は、リモート表示オプション、レンダー ターゲットをソフトウェアまたはハードウェアに強制的にレンダリングするかどうか、DPI を指定します。 この例のコードでは、 D2D1::RenderTargetProperties ヘルパー関数を使用して、既定のレンダー ターゲット プロパティを受け入れます。

2 番目のパラメーター である D2D1_HWND_RENDER_TARGET_PROPERTIES 構造体は、コンテンツのレンダリング先の HWND 、レンダー ターゲットの初期サイズ (ピクセル単位)、およびその プレゼンテーション オプションを指定します。 この例では、 D2D1::HwndRenderTargetProperties ヘルパー関数を使用して、HWND と初期サイズを指定します。 既定のプレゼンテーション オプションを使用します。

3 番目のパラメーターは、レンダー ターゲット参照を受け取るポインターのアドレスです。

レンダー ターゲットを作成し、ハードウェア アクセラレーションを使用できる場合は、コンピューターの GPU にリソースを割り当てます。 レンダー ターゲットを 1 回作成し、可能な限り長く保持することで、パフォーマンス上の利点が得られます。 アプリケーションでは、一度レンダー ターゲットを作成し、アプリケーションの有効期間中、または D2DERR_RECREATE_TARGET エラーが発生するまでそれらを保持する必要があります。 このエラーが発生した場合は、レンダー ターゲット (および作成したリソース) を再作成する必要があります。

手順 4: ブラシを作成する

ファクトリと同様に、レンダー ターゲットは描画リソースを作成できます。 この例では、レンダー ターゲットによってブラシが作成されます。

ID2D1SolidColorBrush* pBlackBrush = NULL;
if (SUCCEEDED(hr))
{
            
    pRT->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush
        ); 
}

ブラシは、図形のストロークやジオメトリの塗りつぶしなど、領域を描画するオブジェクトです。 この例のブラシは、定義済みの単色の黒で領域を塗りつぶします。

Direct2D には、線形グラデーションと放射状グラデーションを描画するためのグラデーション ブラシ、ビットマップとパターンで描画するためのビットマップ ブラシなど、他の種類のブラシも用意されています。

一部の描画 API には、図形を塗りつぶすアウトラインとブラシを描画するためのペンが用意されています。 Direct2D は異なります。ペン オブジェクトは提供されませんが、アウトラインの描画や図形の塗りつぶしにブラシを使用します。 アウトラインを描画する場合は、 ID2D1StrokeStyle インターフェイスとブラシを使用して、パスのストローク操作を制御します。

ブラシは、ブラシを作成したレンダー ターゲットと、同じリソース ドメイン内の他のレンダー ターゲットでのみ使用できます。 一般に、ブラシを 1 回作成し、ブラシを作成したレンダー ターゲットの有効期間にわたって保持する必要があります。 ID2D1SolidColorBrush は単独の例外です。比較的安価に作成できるため、フレームを描画するたびに ID2D1SolidColorBrush を作成できます。パフォーマンスに大きな影響はありません。 また、 1 つの ID2D1SolidColorBrush を 使用し、使用するたびにその色を変更することもできます。

手順 5: 四角形を描画する

次に、レンダー ターゲットを使用して四角形を描画します。

 
pRT->BeginDraw();

pRT->DrawRectangle(
    D2D1::RectF(
        rc.left + 100.0f,
        rc.top + 100.0f,
        rc.right - 100.0f,
        rc.bottom - 100.0f),
        pBlackBrush);

HRESULT hr = pRT->EndDraw();  

DrawRectangle メソッドは、描画する四角形と、四角形のアウトラインの描画に使用するブラシという 2 つのパラメーターを受け取ります。 必要に応じて、ストロークの幅、破線パターン、線結合、および終了キャップのオプションを指定することもできます。

描画コマンドを発行する前に BeginDraw メソッドを呼び出す必要があり、描画コマンドの発行が完了したら EndDraw メソッドを呼び出す必要があります。 EndDraw メソッドは、描画コマンドが成功したかどうかを示す HRESULT を返します。

手順 6: リソースを解放する

描画するフレームがなくなった場合、または D2DERR_RECREATE_TARGET エラーが発生した場合は、レンダー ターゲットと作成したデバイスを解放します。

 
SafeRelease(pRT);
SafeRelease(pBlackBrush);

アプリケーションで Direct2D リソースの使用が完了したら (終了する場合など)、Direct2D ファクトリを解放します。

 
SafeRelease(pD2DFactory);

単純な Direct2D アプリケーションを作成する

このトピックのコードでは、Direct2D アプリケーションの基本的な要素を示します。 簡潔にするために、このトピックでは、適切に記述されたアプリケーションの特性であるアプリケーション フレームワークとエラー処理コードを省略しています。 単純な Direct2D アプリケーションを作成するための完全なコードを示し、最適な設計方法を示す詳細なチュートリアルについては、「 単純な Direct2D アプリケーションを作成する」を参照してください。

簡単な Direct2D アプリケーションを作成する