IXpsOMGeometryFigure::GetSegmentData メソッド (xpsobjectmodel.h)

ジオメトリ図形のセグメント データ ポイントを取得します。

構文

HRESULT GetSegmentData(
  [in, out] UINT32 *dataCount,
  [in, out] FLOAT  *segmentData
);

パラメーター

[in, out] dataCount

segmentData パラメーターによって参照される配列のサイズ。

メソッドが正常に返された場合、 dataCount には 、segmentData によって参照される配列で返される要素の数が含まれます。

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

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

[in, out] segmentData

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

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

戻り値

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

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

注釈

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

ジオメトリ セグメントは、始点、セグメントタイプ、およびセグメントタイプによって値が決定される追加パラメータによって記述されます。 最初のセグメントの始点の座標はジオメトリ図形のプロパティであり、 SetStartPoint を呼び出すことによって設定されます。 後続の各セグメントの始点は、前のセグメントの終点です。

segmentData パラメーターで返される配列の値は、segmentTypes パラメーターの GetSegmentTypes メソッドによって返される配列の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 つのデータ値:
ベジエ曲線の最初のコントロール ポイントの x 座標。
ベジエ曲線の最初の制御点の y 座標。
ベジェ曲線の 2 番目のコントロール ポイントの x 座標。
ベジェ曲線の 2 番目のコントロール ポイントの y 座標。
ベジエ曲線の終点の x 座標。
ベジエ曲線の終点の y 座標。
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER XPS_SEGMENT_TYPE_QUADRATIC_BEZIER図セグメントの例を示す図 4 つのデータ値:
四角形ベジエ曲線のコントロール ポイントの x 座標。
四角形ベジエ曲線のコントロール ポイントの y 座標。
四角形ベジエ曲線の終点の x 座標。
四角形ベジエ曲線の終点の 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;

要件

   
サポートされている最小のクライアント Windows 7、Windows Vista SP2 と Windows Vista 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2008 R2、Windows Server 2008 SP2 および Windows Server 2008 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー xpsobjectmodel.h

こちらもご覧ください

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

XPS ドキュメント エラー