Win32 API 日本語リファレンス
ホームStorage.Xps › IXpsOMGeometryFigure

IXpsOMGeometryFigure

COM
IIDd410dc83-908c-443e-8947-b1795d3c165a継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IXpsOMGeometry インターフェースで指定されるパスまたはクリッピング領域の一部分を記述します。

解説(Remarks)

IXpsOMGeometryFigure は、XPS マークアップの PathFigure 要素に対応します。

次のコード例は、このインターフェースのインスタンスを作成する方法を示しています。


IXpsOMGeometryFigure    *newInterface;
// startPoint contains the starting point
// of the geometry figure being created
XPS_POINT                startPoint = {0,0};

// Note the implicit requirement that CoInitializeEx 
//  has previously been called from this thread.

hr = CoCreateInstance(
    __uuidof(XpsOMObjectFactory),
    NULL,
    CLSCTX_INPROC_SERVER,
    _uuidof(IXpsOMObjectFactory),
    reinterpret_cast<LPVOID*>(&xpsFactory)
    );

if (SUCCEEDED(hr))
{
    hr = xpsFactory->CreateGeometryFigure (&startPoint, &newInterface);
    if (SUCCEEDED(hr))
    {
        // use newInterface

        newInterface->Release();
    }
    xpsFactory->Release();
}
else
{
    // evaluate HRESULT error returned in hr
}

メソッド 15

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

vtbl 3 HRESULT GetOwner(IXpsOMGeometry** owner)

ジオメトリフィギュアを含む IXpsOMGeometry インターフェースへのポインターを取得します。

ownerIXpsOMGeometry**outジオメトリフィギュアを含む IXpsOMGeometry インターフェースへのポインターです。このインターフェースがジオメトリに割り当てられていない場合は、NULL ポインターが返されます。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
ownerNULL です。
vtbl 4 HRESULT GetSegmentData(DWORD* dataCount, FLOAT* segmentData)

ジオメトリフィギュアのセグメントデータポイントを取得します。

dataCountDWORD*inout

segmentData パラメーターが参照する配列のサイズです。

メソッドが正常に返された場合、dataCount には segmentData が参照する配列に返された要素数が格納されます。

メソッドの呼び出し時に segmentDataNULL に設定する場合は、dataCount を 0 に設定する必要があります。

segmentDataNULL ポインターが返された場合、dataCount には必要なバッファーサイズが要素数として格納されます。

segmentDataFLOAT*inout

dataCount で指定した数と同じ要素数を持つ配列のアドレスです。必要なバッファーサイズのみを dataCount に返させたい場合は、この値を NULL に設定できます。

配列が十分な大きさである場合、このメソッドはセグメントデータポイントを配列にコピーし、コピーしたデータポイントの数を dataCount に返します。segmentDataNULL に設定されているか、十分な大きさでないバッファーを参照している場合は、NULL ポインターが返され、データはコピーされず、dataCount には必要なバッファーサイズが要素数として格納されます。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
dataCountNULL です。
ERROR_MORE_DATA
segmentDataNULL であるか、セグメントデータを受け取るのに十分な大きさでないバッファーを参照しています。dataCount には必要な要素数が格納されます。

解説(Remarks)

このメソッドを呼び出す前にセグメントデータ配列の必要なサイズを確認するには、GetSegmentDataCount を呼び出します。

ジオメトリセグメントは、開始点、セグメントの種類、およびセグメントの種類によって値が決まる追加のパラメーターによって記述されます。最初のセグメントの開始点の座標はジオメトリフィギュアのプロパティであり、SetStartPoint を呼び出して設定します。以降の各セグメントの開始点は、直前のセグメントの終了点になります。

segmentData パラメーターに返される配列内の値は、GetSegmentTypes メソッドが segmentTypes パラメーターに返す配列内の XPS_SEGMENT_TYPE 値に対応します。セグメントデータの値を正しく読み取るには、ジオメトリフィギュア内の各セグメントの種類を把握しておく必要があります。たとえば、最初の線分のセグメントの種類が XPS_SEGMENT_TYPE_LINE である場合、segmentData 配列の最初の 2 つのデータ値はそのセグメントの終了点の x 座標と y 座標になります。次のセグメントの種類が XPS_SEGMENT_TYPE_BEZIER である場合、segmentData 配列の次の 6 つの値がそのセグメントの特性を表します。ジオメトリフィギュア内の各線分について、以降も同様です。

次の表は、セグメントの種類ごとに返されるデータ値の具体的な組み合わせを示しています。プログラムでこのデータにアクセスする方法の例については、後に示すコード例を参照してください。

セグメントの種類 必要なデータ値
XPS_SEGMENT_TYPE_LINE XPS_SEGMENT_TYPE_LINE のフィギュアセグメントの例を示す図 2 つのデータ値:
セグメント線の終了点の x 座標。
セグメント線の終了点の y 座標。
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE のフィギュアセグメントを示す図。 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE のフィギュアセグメントの例を示す図 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE のフィギュアセグメントを示す図。 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE のフィギュアセグメントの例を示す図 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_BEZIER XPS_SEGMENT_TYPE_BEZIER のフィギュアセグメントの例を示す図 6 つのデータ値:
ベジェ曲線の 1 番目の制御点の x 座標。
ベジェ曲線の 1 番目の制御点の y 座標。
ベジェ曲線の 2 番目の制御点の x 座標。
ベジェ曲線の 2 番目の制御点の y 座標。
ベジェ曲線の終了点の x 座標。
ベジェ曲線の終了点の y 座標。
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER XPS_SEGMENT_TYPE_QUADRATIC_BEZIER のフィギュアセグメントの例を示す図 4 つのデータ値:
2 次ベジェ曲線の制御点の x 座標。
2 次ベジェ曲線の制御点の y 座標。
2 次ベジェ曲線の終了点の x 座標。
2 次ベジェ曲線の終了点の y 座標。

次のコード例は、ジオメトリフィギュア内の各セグメントの種類ごとに異なるデータポイントへアクセスする方法を示しています。

    // currentFigure is the pointer to an IXpsOMGeometryFigure
    // that contains the segment data to examine

    HRESULT             hr = S_OK;
    UINT32              numSegments = 0;
    UINT32              numSegmentDataPoints = 0;
    XPS_SEGMENT_TYPE    *segmentTypes = NULL;
    FLOAT               *segmentDataPoints = NULL;
    BOOL                *segmentStrokes = NULL;

    // get number of segments in this figure
    hr = currentFigure->GetSegmentCount (&numSegments);

    if (SUCCEEDED(hr))
    {
        // allocate array for segment data types
        segmentTypes = new (std::nothrow) XPS_SEGMENT_TYPE[numSegments];
        if (segmentTypes == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // allocate array for segment strokes
        segmentStrokes = new (std::nothrow) BOOL[numSegments];
        if (segmentStrokes == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // get array of segment data types
        hr = currentFigure->GetSegmentTypes (&numSegments, segmentTypes);
    }

    if (SUCCEEDED(hr))
    {
        // get size of segment data array
        hr = currentFigure->GetSegmentDataCount (&numSegmentDataPoints);
    }

    if (SUCCEEDED(hr))
    {
        // get array to hold segment data points
        segmentDataPoints = new (std::nothrow) FLOAT[numSegmentDataPoints];
        if (segmentDataPoints == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // get segment data points
        hr = currentFigure->GetSegmentData (
            &numSegmentDataPoints, segmentDataPoints);
    }

    if (SUCCEEDED(hr))
    {
        // process segment data
        UINT32           thisSegment = 0;
        XPS_SEGMENT_TYPE *thisSegmentType = segmentTypes;
        XPS_SEGMENT_TYPE *lastSegmentType = NULL;
        FLOAT            *thisSegmentDataPoint = segmentDataPoints;
        FLOAT            *lastSegmentsDataPoint = NULL;

        // points to element just after valid array
        // valid pointers are < this value and  >= &segmentTypes[0]
        lastSegmentType = &segmentTypes[numSegments]; 
        // points to element just after valid array
        // valid pointers are < this value and >= &segmentDataPoints[0]
        lastSegmentsDataPoint = &segmentDataPoints[numSegmentDataPoints];

        // look at each segment that was returned
        while (thisSegment < numSegments)
        {
            if ((thisSegmentType >= lastSegmentType) || 
                (thisSegmentDataPoint >= lastSegmentsDataPoint))
            {
                // the array data is not correct.
                hr = E_UNEXPECTED;
                break; // out of loop
            } 
            else
            {
                // process the data based on the segment type
                switch (*thisSegmentType) 
                {
                    case    XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE:
                    case    XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE:
                    case    XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE:
                    case    XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE:
                        {
                        // 5 data points
                        FLOAT    arcEndPoint_x = *thisSegmentDataPoint++;
                        FLOAT    arcEndPoint_y = *thisSegmentDataPoint++;
                        FLOAT    radius_x = *thisSegmentDataPoint++;
                        FLOAT    radius_y = *thisSegmentDataPoint++;
                        FLOAT    angle = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_BEZIER:
                        {
                        // 6 data points
                        FLOAT    controlPoint1_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint1_y = *thisSegmentDataPoint++;
                        FLOAT    controlPoint2_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint2_y = *thisSegmentDataPoint++;
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_LINE:
                        {
                        // 2 data points
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                        {
                        // 4 data points
                        FLOAT    controlPoint_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint_y = *thisSegmentDataPoint++;
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    default:
                        // unrecognized segment type
                        break;
                }
                // 
                thisSegment++;
                thisSegmentType++;
            }
        }
    }

    delete[] segmentTypes; segmentTypes = NULL;
    delete[] segmentStrokes; segmentStrokes = NULL;
    delete[] segmentDataPoints; segmentDataPoints = NULL;
vtbl 5 HRESULT GetSegmentTypes(DWORD* segmentCount, XPS_SEGMENT_TYPE* segmentTypes)

フィギュア内のセグメントの種類を取得します。

segmentCountDWORD*inout

segmentTypes(後述)が参照する配列のサイズです。このパラメーターを NULL にすることはできません。

メソッドが正常に返された場合、segmentCount には segmentTypes が参照する配列に返された要素数が格納されます。

メソッドの呼び出し時に segmentTypesNULL の場合は、segmentCount を 0 に設定する必要があります。

segmentTypesNULL ポインターが返された場合、segmentCount の値には必要なバッファーサイズが要素数として格納されます。

segmentTypesXPS_SEGMENT_TYPE*inout

segmentCount で指定した数と同じ要素数を持つ XPS_SEGMENT_TYPE 値の配列です。必要なバッファーサイズのみを返させたい場合は、この値を NULL に設定します。

配列が十分な大きさである場合、このメソッドは XPS_SEGMENT_TYPE 値を配列にコピーし、コピーした値の数を segmentCount に返します。segmentTypesNULL であるか、十分な大きさでないバッファーを参照している場合は、NULL ポインターが返され、データはコピーされず、segmentCount には必要なバッファーサイズが要素数として格納されます。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
segmentCountNULL です。
ERROR_MORE_DATA
segmentTypesNULL であるか、XPS_SEGMENT_TYPE のデータを受け取るのに十分な大きさでないバッファーを参照しています。segmentCount には必要な要素数が格納されます。

解説(Remarks)

プログラムでこのメソッドを使用する方法の例については、GetSegmentData のコード例を参照してください。

vtbl 6 HRESULT GetSegmentStrokes(DWORD* segmentCount, BOOL* segmentStrokes)

フィギュアのセグメントのストローク定義を取得します。

segmentCountDWORD*inout

segmentStrokes が参照する配列のサイズです。このパラメーターを NULL にすることはできません。

メソッドが正常に返された場合、segmentCount には segmentStrokes が参照する配列に返された要素数が格納されます。

メソッドの呼び出し時に segmentStrokesNULL の場合は、segmentCount を 0 に設定する必要があります。

segmentStrokesNULL ポインターが返された場合、segmentCount の値には必要なバッファーサイズが要素数として格納されます。

segmentStrokesBOOL*inout

segmentCount で指定した数と同じ要素数を持つ配列です。このメソッドに必要なバッファーサイズのみを返させたい場合は、この値を NULL に設定します。

配列が十分な大きさである場合、このメソッドはセグメントストロークの値を配列にコピーし、コピーしたセグメントストロークの値の数を segmentCount に返します。segmentDataNULL であるか、十分な大きさでないバッファーを参照している場合は、NULL ポインターが返され、データはコピーされず、segmentCount には必要なバッファーサイズが要素数として格納されます。

次の表は、segmentStrokes が参照する配列の要素が取り得る値を示しています。

意味
TRUE
セグメントはストロークされます。
FALSE
セグメントはストロークされません。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
segmentCountNULL です。
ERROR_MORE_DATA
segmentStrokesNULL であるか、セグメントストロークのデータを受け取るのに十分な大きさでないバッファーを参照しています。segmentCount には必要な要素数が格納されます。
vtbl 7 HRESULT SetSegments(DWORD segmentCount, DWORD segmentDataCount, XPS_SEGMENT_TYPE* segmentTypes, FLOAT* segmentData, BOOL* segmentStrokes)

フィギュア内のセグメントについて、セグメント情報とデータポイントを設定します。

segmentCountDWORDin

セグメントの数です。

この値は、segmentTypessegmentStrokes が参照する配列の要素数でもあります。

segmentDataCountDWORDin

セグメントデータポイントの数です。

この値は、segmentData が参照する配列の要素数でもあります。

segmentTypesXPS_SEGMENT_TYPE*inXPS_SEGMENT_TYPE 変数の配列です。この配列の要素数は segmentCount の値で指定します。
segmentDataFLOAT*inセグメントデータ値の配列です。この配列の要素数は segmentDataCount の値で指定します。
segmentStrokesBOOL*inセグメントストローク値の配列です。この配列の要素数は segmentCount の値で指定します。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
segmentTypes に認識できない種類の値が含まれています。

または、segmentData 配列のエントリ数が segmentTypes 配列のエントリ数より多くなっています。

E_POINTER
segmentTypessegmentData、または segmentStrokesNULL です。
XPS_E_INVALID_FLOAT
segmentData に、無限大または非数 (NAN) の FLOAT 値が含まれています。
XPS_E_MISSING_SEGMENT_DATA
segmentData に渡された配列のエントリ数が、segmentTypes に渡された配列のエントリ数より少なくなっています。
XPS_E_NEGATIVE_FLOAT
segmentData に渡された配列のエントリに負の値が含まれていますが、非負の値でなければなりません。

解説(Remarks)

ジオメトリセグメントは、開始点、セグメントの種類、およびセグメントの種類によって値が決まる追加のパラメーターによって記述されます。最初のセグメントの開始点の座標はジオメトリフィギュアのプロパティであり、SetStartPoint を呼び出して設定します。以降の各セグメントの開始点は、直前のセグメントの終了点になります。

線分を定義するデータ値の個数は、セグメントの種類によって異なります。次の表は、セグメントの種類ごとに使用しなければならないデータ値の具体的な組み合わせを示しています。segmentData パラメーターに渡すセグメントデータ配列内の値は、segmentTypes パラメーターに渡す配列内の XPS_SEGMENT_TYPE 値と対応している必要があります。たとえば、最初の線分のセグメントの種類が XPS_SEGMENT_TYPE_LINE である場合、segmentData 配列の最初の 2 つのデータ値はそのセグメントの終了点の x 座標と y 座標になります。次のセグメントの種類が XPS_SEGMENT_TYPE_BEZIER である場合、segmentData 配列の次の 6 つの値がそのセグメントの特性を表します。ジオメトリフィギュア内の各線分について、以降も同様です。

セグメントの種類 必要なデータ値
XPS_SEGMENT_TYPE_LINE XPS_SEGMENT_TYPE_LINE のフィギュアセグメントの例を示す図 2 つのデータ値:
セグメント線の終了点の x 座標。
セグメント線の終了点の y 座標。
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE のフィギュアセグメントを示す図。 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE のフィギュアセグメントの例を示す図 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE のフィギュアセグメントを示す図。 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE のフィギュアセグメントの例を示す図 5 つのデータ値:
円弧の終了点の x 座標。
円弧の終了点の y 座標。
楕円の x 軸方向の半径の長さ。
楕円の y 軸方向の半径の長さ。
回転角度。
XPS_SEGMENT_TYPE_BEZIER XPS_SEGMENT_TYPE_BEZIER のフィギュアセグメントの例を示す図 6 つのデータ値:
ベジェ曲線の 1 番目の制御点の x 座標。
ベジェ曲線の 1 番目の制御点の y 座標。
ベジェ曲線の 2 番目の制御点の x 座標。
ベジェ曲線の 2 番目の制御点の y 座標。
ベジェ曲線の終了点の x 座標。
ベジェ曲線の終了点の y 座標。
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER XPS_SEGMENT_TYPE_QUADRATIC_BEZIER のフィギュアセグメントの例を示す図 4 つのデータ値:
2 次ベジェ曲線の制御点の x 座標。
2 次ベジェ曲線の制御点の y 座標。
2 次ベジェ曲線の終了点の x 座標。
2 次ベジェ曲線の終了点の y 座標。

フィギュア内のセグメントの種類を取得するには、GetSegmentTypes を呼び出します。

次のコード例は、SetSegments に必要なバッファーを作成して値を格納する方法の一例を示しています。

最初のコード例では、AddSegmentDataToArrays メソッドが 1 つのセグメントを記述するデータポイントを受け取り、SetSegments メソッドに必要な 3 種類のデータバッファーに格納します。AddSegmentDataToArrays に引数として渡すデータバッファーは、AddSegmentDataToArrays の後に示すコード例のように、呼び出し側のメソッドが管理します。

HRESULT
AddSegmentDataToArrays(
    XPS_SEGMENT_TYPE        segmentType,
    BOOL                    segmentStroke,
    FLOAT                   *segmentPoints,
    UINT32                  *segmentsAvailable,
    UINT32                  *segmentPointsAvailable,
    XPS_SEGMENT_TYPE        **segmentTypeBuffer,
    BOOL                    **segmentStrokeBuffer,
    FLOAT                   **segmentPointBuffer
)
/*
Description:

Populates the buffers required by IXpsOMGeometryFigure::SetSegmentData
using data and buffers provided by the calling method.

Parameters:

segmentType
    IN: XPS_SEGMENT_TYPE value that specifies the segment type for
        the current segment.

segmentStroke
    IN: BOOL value that specifies whether the current segment 
        is stroked.

*segmentPoints
    IN: pointer to an array of FLOAT values that specify the 
        segment's data points. The number of values in the array
        depend on the value of the segmentType parameter.

*segmentsAvailable
    IN: the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer.
        This value must be >= 1 when calling the method.
    OUT:  the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer after
        segmentType and segmentStroke have been added. If the 
        method was successful, the returned value is one less 
        than the value passed in to the method.

*segmentPointsAvailable
    IN: the number of values that remain unused in the
        segmentPointBuffer.    This value must be greater-than or equal
        to the number of points required by the segmentType value.
    OUT:  the number of values that remain unused in the
        segmentPointBuffer after the segmentPoints have been added.
        The returned value depends on the segmentType value.

**segmentTypeBuffer
    IN: the first free element in the buffer that receives the segment
        type values.
    OUT: the first free element in the buffer that receives the segment
        type values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentStrokeBuffer
    IN: the first free element in the buffer that receives the segment
        stroke values.
    OUT: the first free element in the buffer that receives the segment
        stroke values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentPointBuffer
    IN: the first free element in the buffer that receives the segment
        point values.
    OUT: the first free element in the buffer that receives the segment
        point values. If the method is successful, the element referenced
        by this value will depend on the segment type.

Remarks.
1) the buffers and values passed into this method are managed by
    the calling method.

2) if the value returned in segmentsAvailable is 0, segmentTypeBuffer
    and segmentStrokeBuffer point to invalid memory.

3) if the value returned in segmentPointsAvailable is 0, segmentPointBuffer
    point to invalid memory.

*/
{
    HRESULT hr = S_OK;

    // test to see if there is sufficient space in the 
    // segmentTypeBuffer and the segmentStrokeBuffer before
    // proceeding
    if (*segmentsAvailable == 0)
    {
        hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
    }

    if (SUCCEEDED(hr))
    {
        // process the data based on the segment type
        switch (segmentType) 
        {
            case    XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE:
            case    XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE:
            case    XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE:
            case    XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE:
                if (*segmentPointsAvailable >= 5) 
                {
                    // 5 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc angle
                    *segmentPointsAvailable -= 5;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_BEZIER:
                if (*segmentPointsAvailable >= 6) 
                {
                    // 6 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 6;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_LINE:
                if (*segmentPointsAvailable >= 2) 
                {
                    // 2 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 2;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                if (*segmentPointsAvailable >= 4) 
                {
                    // 4 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 4;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            default:
                // unrecognized segment type
                hr = E_UNEXPECTED;
                break;
        }

    }

    if (SUCCEEDED(hr))
    {
        // Copy segment type and segment stroke values
        // to array and decrement number of array values
        // that remain unused.
        //
        // The space available for these operations was
        // tested at the beginning of the method.
        *(*segmentTypeBuffer)++ = segmentType;
        *(*segmentStrokeBuffer)++ = segmentStroke;
        *segmentsAvailable--;
    } 

    return hr;
}

次のコード例では、UpdateSegmentDataSetSegments メソッドに必要なデータバッファーを作成し、前のコード例の AddSegmentDataToArrays メソッドを呼び出してセグメントデータを格納します。バッファーへの格納が完了した後、SetSegments を呼び出してそのデータをジオメトリフィギュアに追加します。

これらのコード例では、実際のセグメントデータは示されていません。

HRESULT
UpdateSegmentData (
    IXpsOMGeometryFigure    *geometryFigure,
    UINT32                  segmentCount,
    UINT32                  segmentDataCount
)
/*
    Note that this method is not complete and only includes
    the code necessary to show how the SetSegments call is used.

    In this sample, the geometryFigure, segmentCount, and
    segmentDataCount values are assumed to have been initialized
    outside of this example.
*/
{
    HRESULT             hr = S_OK;
    XPS_SEGMENT_TYPE    segmentType = (XPS_SEGMENT_TYPE)0;
    BOOL                segmentStroke = FALSE;
    FLOAT               segmentPoints = 0;
    UINT32              segmentsAvailable = 0;
    UINT32              segmentPointsAvailable = 0;
    // these buffers are sized and allocated based on 
    //    the segment data to store.
    XPS_SEGMENT_TYPE    *segmentTypeBuffer = NULL;
    BOOL                *segmentStrokeBuffer = NULL;
    FLOAT               *segmentPointBuffer = NULL;

    XPS_SEGMENT_TYPE    *nextSegmentTypeValue = NULL;
    BOOL                *nextSegmentStrokeValue = NULL;
    FLOAT               *nextSegmentPointValue = NULL;

    // segment data is created outside of this example

    // allocate buffers as required using information 
    // from segment data. This can be dynamic or static
    // depending on how the segment information is managed.
    // This example assumes that the segment information 
    // does not change during this method.

    // initialize "next" pointers to point to the first
    // element in each array.
    nextSegmentTypeValue = segmentTypeBuffer;
    nextSegmentStrokeValue = segmentStrokeBuffer;
    nextSegmentPointValue = segmentPointBuffer;

    // for each segment in the figure, add the 
    // segment data to the buffers

        hr = AddSegmentDataToArrays(
                segmentType,
                segmentStroke,
                &segmentPoints,
                &segmentsAvailable,
                &segmentPointsAvailable,
                &nextSegmentTypeValue,
                &nextSegmentStrokeValue,
                &nextSegmentPointValue);
        
    if (SUCCEEDED(hr))
    {
        // set segment data
        hr = geometryFigure->SetSegments (
            segmentCount,
            segmentDataCount,
            segmentTypeBuffer,
            segmentPointBuffer,
            segmentStrokeBuffer);
    }
    // clean up buffers

    return hr;
}
vtbl 8 HRESULT GetStartPoint(XPS_POINT* startPoint)

フィギュアの開始点を取得します。

startPointXPS_POINT*outフィギュアの開始点の座標です。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
startPointNULL です。

解説(Remarks)

ドキュメントのマークアップにおいて、startPoint に返される値は PathFigure 要素の StartPoint 属性の値に対応します。

vtbl 9 HRESULT SetStartPoint(XPS_POINT* startPoint)

フィギュアの開始点を設定します。

startPointXPS_POINT*inフィギュアの開始点の座標です。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
startPointNULL です。
XPS_E_INVALID_FLOAT
startPoint に渡された XPS_POINT 構造体のいずれかのフィールドに、有効でない値が含まれています。
vtbl 10 HRESULT GetIsClosed(BOOL* isClosed)

フィギュアが閉じているかどうかを示す値を取得します。

isClosedBOOL*out

フィギュアが閉じているかどうかを示すブール値です。

意味
TRUE
フィギュアは閉じています。図形を閉じるために、フィギュアの開始点と終了点の間の線分がストロークされます。
FALSE
フィギュアは開いています。フィギュアの開始点と終了点の間に線分はストロークされません。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
isClosedNULL です。

解説(Remarks)

この値は、ストロークを指定する Path 要素で PathFigure 属性が使用されている場合にのみ適用されます。

閉じたフィギュアでは、図形を閉じるためにフィギュアの開始点と終了点の間に線分が追加されます。

この値は、ドキュメントのマークアップにおける PathFigure 要素の IsClosed 要素の値に対応します。

vtbl 11 HRESULT SetIsClosed(BOOL isClosed)

フィギュアが閉じているかどうかを示す値を設定します。

isClosedBOOLin

設定する値です。

意味
TRUE
フィギュアは閉じています。開始点とフィギュア内で定義された最後の点の間の線分がストロークされます。
FALSE
フィギュアは開いています。開始点とフィギュア内で定義された最後の点の間に線分はありません。

戻り値

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

解説(Remarks)

この値は、ストロークを指定する Path 要素で PathFigure 属性が使用されている場合にのみ適用されます。

閉じたフィギュアでは、図形を閉じるためにフィギュアの開始点と終了点の間に線分が追加されます。

この値は、ドキュメントのマークアップにおける PathFigure 要素の IsClosed 要素の値に対応します。

vtbl 12 HRESULT GetIsFilled(BOOL* isFilled)

フィギュアが塗りつぶされるかどうかを示す値を取得します。

isFilledBOOL*out

フィギュアが塗りつぶされるかどうかを示すブール値です。

意味
TRUE
フィギュアはブラシで塗りつぶされます。
FALSE
フィギュアは塗りつぶされません。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
isFilledNULL です。

解説(Remarks)

この値は、ドキュメントのマークアップにおける PathFigure 要素の IsFilled 属性の値に対応します。

vtbl 13 HRESULT SetIsFilled(BOOL isFilled)

フィギュアが塗りつぶされるかどうかを示す値を設定します。

isFilledBOOLin

設定する値です。

意味
TRUE
フィギュアはブラシで塗りつぶされます。
FALSE
フィギュアは塗りつぶされません。

戻り値

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

解説(Remarks)

ドキュメントのマークアップにおいて、isFilled に返される値は PathFigure 要素の IsFilled 属性の値に対応します。

vtbl 14 HRESULT GetSegmentCount(DWORD* segmentCount)

フィギュア内のセグメントの数を取得します。

segmentCountDWORD*outフィギュア内のセグメントの数です。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
segmentCountNULL です。

解説(Remarks)

プログラムでこのメソッドを使用する方法の例については、GetSegmentData のコード例を参照してください。

vtbl 15 HRESULT GetSegmentDataCount(DWORD* segmentDataCount)

フィギュア内のセグメントデータポイントの数を取得します。

segmentDataCountDWORD*outセグメントデータポイントの数です。メソッドの呼び出し時に segmentDataCountNULL にすることはできません。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
segmentDataCountNULL です。

解説(Remarks)

セグメントデータポイントを取得するには、GetSegmentData を呼び出します。

プログラムでこのメソッドを使用する方法の例については、GetSegmentData のコード例を参照してください。

vtbl 16 HRESULT GetSegmentStrokePattern(XPS_SEGMENT_STROKE_PATTERN* segmentStrokePattern)

フィギュア内のセグメントがストロークされるかどうかを示す XPS_SEGMENT_STROKE_PATTERN 値を取得します。

segmentStrokePatternXPS_SEGMENT_STROKE_PATTERN*outフィギュア内のセグメントがストロークされるかどうかを示す XPS_SEGMENT_STROKE_PATTERN 値です。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_POINTER
segmentStrokePatternNULL です。
vtbl 17 HRESULT Clone(IXpsOMGeometryFigure** geometryFigure)

インターフェースのディープコピーを作成します。(IXpsOMGeometryFigure.Clone)

geometryFigureIXpsOMGeometryFigure**outコピーされたインターフェースへのポインターです。

戻り値

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

戻り値のコード 説明
S_OK
メソッドは成功しました。
E_OUTOFMEMORY
この操作を実行するのに十分なメモリがありません。
E_POINTER
geometryFigureNULL です。

解説(Remarks)

コピーの所有者は NULL です。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IXpsOMGeometryFigure "{D410DC83-908C-443E-8947-B1795D3C165A}"
#usecom global IXpsOMGeometryFigure IID_IXpsOMGeometryFigure "{}"
#comfunc global IXpsOMGeometryFigure_GetOwner                 3 sptr
#comfunc global IXpsOMGeometryFigure_GetSegmentData           4 var,var
#comfunc global IXpsOMGeometryFigure_GetSegmentTypes          5 var,var
#comfunc global IXpsOMGeometryFigure_GetSegmentStrokes        6 var,var
#comfunc global IXpsOMGeometryFigure_SetSegments              7 int,int,var,var,var
#comfunc global IXpsOMGeometryFigure_GetStartPoint            8 var
#comfunc global IXpsOMGeometryFigure_SetStartPoint            9 var
#comfunc global IXpsOMGeometryFigure_GetIsClosed              10 var
#comfunc global IXpsOMGeometryFigure_SetIsClosed              11 int
#comfunc global IXpsOMGeometryFigure_GetIsFilled              12 var
#comfunc global IXpsOMGeometryFigure_SetIsFilled              13 int
#comfunc global IXpsOMGeometryFigure_GetSegmentCount          14 var
#comfunc global IXpsOMGeometryFigure_GetSegmentDataCount      15 var
#comfunc global IXpsOMGeometryFigure_GetSegmentStrokePattern  16 var
#comfunc global IXpsOMGeometryFigure_Clone                    17 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。