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

ID2D1SimplifiedGeometrySink

COM
IID2cd9069e-12e2-11dc-9fed-001143a055f9継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

2次ベジエ曲線や円弧を含まないジオメトリパスを表します。

解説(Remarks)

ジオメトリシンクは 1 つ以上のフィギュアで構成されます。各フィギュアは 1 つ以上の線分またはベジエ曲線セグメントで構成されます。フィギュアを作成するには、BeginFigure メソッドを呼び出してフィギュアの開始点を指定し、続いて AddLines および AddBeziers を使用して線分やベジエセグメントを追加します。セグメントの追加を終えたら、EndFigure メソッドを呼び出します。この一連の手順を繰り返すことで、さらにフィギュアを作成できます。フィギュアの作成をすべて終えたら、Close メソッドを呼び出します。

円弧や 2 次ベジエ曲線を含むことができるジオメトリパスを作成するには、ID2D1GeometrySink を使用してください。

メソッド 7

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

vtbl 3 void SetFillMode(D2D1_FILL_MODE fillMode)

このジオメトリシンクが表すジオメトリの内側にある点と外側にある点を判定するために使用する方法を指定します。

fillModeD2D1_FILL_MODEin指定された点がジオメトリの一部であるかどうかを判定するために使用する方法。

解説(Remarks)

塗りつぶしモードの既定値は D2D1_FILL_MODE_ALTERNATE です。塗りつぶしモードを設定するには、最初の BeginFigure の呼び出しよりも前に SetFillMode を呼び出します。これに従わない場合、ジオメトリシンクはエラー状態になります。

vtbl 4 void SetSegmentFlags(D2D1_PATH_SEGMENT vertexFlags)

ジオメトリシンクに新しく追加されるセグメントに適用する、ストロークおよび接合のオプションを指定します。

vertexFlagsD2D1_PATH_SEGMENTinジオメトリシンクに新しく追加されるセグメントに適用する、ストロークおよび接合のオプション。

解説(Remarks)

このメソッドを呼び出すと、以降シンクに追加される各セグメントに、指定したセグメントフラグが適用されます。セグメントフラグは、このメソッドが再度呼び出されて別のセグメントフラグが指定されるまで、追加されるすべてのセグメントに適用されます。

vtbl 5 void BeginFigure(D2D_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin)

指定した点で新しいフィギュアを開始します。

startPointD2D_POINT_2Fin新しいフィギュアを開始する点。
figureBeginD2D1_FIGURE_BEGINin新しいフィギュアを中空にするか、塗りつぶすか。

解説(Remarks)

フィギュアの作成中にこのメソッドを呼び出すと、インターフェイスは無効化され、以降のすべてのメソッドは失敗します。

次の例では、ID2D1PathGeometry を作成し、シンクを取得して、それを使用して砂時計形状を定義しています。

ID2D1GeometrySink *pSink = NULL;

// Create a path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);

    if (SUCCEEDED(hr))
    {
        // Write to the path geometry using the geometry sink.
        hr = m_pPathGeometry->Open(&pSink);

        if (SUCCEEDED(hr))
        {
            pSink->BeginFigure(
                D2D1::Point2F(0, 0),
                D2D1_FIGURE_BEGIN_FILLED
                );

            pSink->AddLine(D2D1::Point2F(200, 0));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(150, 50),
                    D2D1::Point2F(150, 150),
                    D2D1::Point2F(200, 200))
                );

            pSink->AddLine(D2D1::Point2F(0, 200));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(50, 150),
                    D2D1::Point2F(50, 50),
                    D2D1::Point2F(0, 0))
                );

            pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

            hr = pSink->Close();
        }
        SafeRelease(&pSink);
    }
}
vtbl 6 void AddLines(D2D_POINT_2F* points, DWORD pointsCount)

指定した点の並びを使用して一連の線分を作成し、ジオメトリシンクに追加します。

pointsD2D_POINT_2F*in描画する線分を表す 1 つ以上の点の配列へのポインター。線分は、ジオメトリシンクの現在の点(最後に描画されたセグメントの終点、または BeginFigure で指定された位置)から、配列の最初の点へ描画されます。配列にさらに点が含まれる場合、最初の点から 2 番目の点へ、2 番目の点から 3 番目の点へ、というように線分が描画されます。
pointsCountDWORDinpoints 配列に含まれる点の数。
vtbl 7 void AddBeziers(D2D1_BEZIER_SEGMENT* beziers, DWORD beziersCount)

一連の 3 次ベジエ曲線を作成し、ジオメトリシンクに追加します。

beziersD2D1_BEZIER_SEGMENT*in作成するベジエ曲線を表すベジエセグメントの配列へのポインター。曲線は、ジオメトリシンクの現在の点(最後に描画されたセグメントの終点、または BeginFigure で指定された位置)から、配列内の最初のベジエセグメントの終点へ描画されます。配列にさらにベジエセグメントが含まれる場合、後続の各ベジエセグメントは直前のベジエセグメントの終点を開始点として使用します。
beziersCountDWORDinbeziers 配列に含まれるベジエセグメントの数。
vtbl 8 void EndFigure(D2D1_FIGURE_END figureEnd)

現在のフィギュアを終了します。必要に応じて閉じます。

figureEndD2D1_FIGURE_ENDin現在のフィギュアを閉じるかどうかを示す値。フィギュアを閉じる場合、現在の点と BeginFigure で指定された開始点との間に線分が描画されます。

解説(Remarks)

対応する BeginFigure の呼び出しがない状態でこのメソッドを呼び出すと、ジオメトリシンクはエラー状態になります。以降の呼び出しは無視され、Close メソッドの呼び出し時に全体の失敗が返されます。

次の例では、ID2D1PathGeometry を作成し、シンクを取得して砂時計形状を定義し、続いて D2D1_FIGURE_END_CLOSED 値を指定して EndFigure を呼び出すことで砂時計の作成を終了しています。完全な例については、「How to Draw and Fill a Complex Shape」を参照してください。

ID2D1GeometrySink *pSink = NULL;

// Create a path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);

    if (SUCCEEDED(hr))
    {
        // Write to the path geometry using the geometry sink.
        hr = m_pPathGeometry->Open(&pSink);

        if (SUCCEEDED(hr))
        {
            pSink->BeginFigure(
                D2D1::Point2F(0, 0),
                D2D1_FIGURE_BEGIN_FILLED
                );

            pSink->AddLine(D2D1::Point2F(200, 0));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(150, 50),
                    D2D1::Point2F(150, 150),
                    D2D1::Point2F(200, 200))
                );

            pSink->AddLine(D2D1::Point2F(0, 200));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(50, 150),
                    D2D1::Point2F(50, 50),
                    D2D1::Point2F(0, 0))
                );

            pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

            hr = pSink->Close();
        }
        SafeRelease(&pSink);
    }
}
vtbl 9 HRESULT Close()

ジオメトリシンクを閉じ、エラー状態かどうかを示し、シンクのエラー状態をリセットします。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

フィギュアの作成中にジオメトリシンクを閉じないでください。閉じるとジオメトリシンクはエラー状態になります。クローズ操作を成功させるには、BeginFigure の各呼び出しに対して EndFigure の呼び出しが 1 回ずつ必要です。

このメソッドを呼び出した後、ジオメトリシンクは使用できなくなる場合があります。このインターフェイスの Direct2D 実装では、閉じた後にジオメトリシンクを変更することはできませんが、他の実装ではこの制限が課されない場合があります。

次の例では、ID2D1PathGeometry を作成し、シンクを取得して、それを使用して砂時計形状を定義しています。

ID2D1GeometrySink *pSink = NULL;

// Create a path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);

    if (SUCCEEDED(hr))
    {
        // Write to the path geometry using the geometry sink.
        hr = m_pPathGeometry->Open(&pSink);

        if (SUCCEEDED(hr))
        {
            pSink->BeginFigure(
                D2D1::Point2F(0, 0),
                D2D1_FIGURE_BEGIN_FILLED
                );

            pSink->AddLine(D2D1::Point2F(200, 0));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(150, 50),
                    D2D1::Point2F(150, 150),
                    D2D1::Point2F(200, 200))
                );

            pSink->AddLine(D2D1::Point2F(0, 200));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(50, 150),
                    D2D1::Point2F(50, 50),
                    D2D1::Point2F(0, 0))
                );

            pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

            hr = pSink->Close();
        }
        SafeRelease(&pSink);
    }
}
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_ID2D1SimplifiedGeometrySink "{2CD9069E-12E2-11DC-9FED-001143A055F9}"
#usecom global ID2D1SimplifiedGeometrySink IID_ID2D1SimplifiedGeometrySink "{}"
#comfunc global ID2D1SimplifiedGeometrySink_SetFillMode      3 int
#comfunc global ID2D1SimplifiedGeometrySink_SetSegmentFlags  4 int
#comfunc global ID2D1SimplifiedGeometrySink_BeginFigure      5 int,int
#comfunc global ID2D1SimplifiedGeometrySink_AddLines         6 var,int
#comfunc global ID2D1SimplifiedGeometrySink_AddBeziers       7 var,int
#comfunc global ID2D1SimplifiedGeometrySink_EndFigure        8 int
#comfunc global ID2D1SimplifiedGeometrySink_Close            9
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。