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

図のセグメントのセグメント情報とデータ ポイントを設定します。

構文

HRESULT SetSegments(
  [in] UINT32                 segmentCount,
  [in] UINT32                 segmentDataCount,
  [in] const XPS_SEGMENT_TYPE *segmentTypes,
  [in] const FLOAT            *segmentData,
  [in] const BOOL             *segmentStrokes
);

パラメーター

[in] segmentCount

セグメントの数。

この値は、 segmentTypes および segmentStrokes によって参照される配列内の要素 の数でもあります

[in] segmentDataCount

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

この値は、 segmentData によって参照される配列内の要素の数でもあります。

[in] segmentTypes

XPS_SEGMENT_TYPE変数の配列。 segmentCount の値は、この配列内の要素の数を指定します。

[in] segmentData

セグメント データ値の配列。 segmentDataCount の値は、この配列内の要素の数を指定します。

[in] segmentStrokes

セグメント ストローク値の配列。 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 で渡される配列内のエントリには負の値が含まれますが、負でない値を含める必要があります。

注釈

ジオメトリ セグメントは、始点、セグメントタイプ、およびセグメントタイプによって値が決定される追加パラメータによって記述されます。 最初のセグメントの始点の座標はジオメトリ図形のプロパティであり、 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 つのデータ値:
ベジエ曲線の最初のコントロール ポイントの x 座標。
ベジエ曲線の最初の制御点の y 座標。
ベジェ曲線の 2 番目のコントロール ポイントの x 座標。
ベジェ曲線の 2 番目のコントロール ポイントの y 座標。
ベジエ曲線の終点の x 座標。
ベジエ曲線の終点の y 座標。
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER XPS_SEGMENT_TYPE_QUADRATIC_BEZIER図セグメントの例を示す図 4 つのデータ値:
四角形ベジエ曲線のコントロール ポイントの x 座標。
四角形ベジエ曲線のコントロール ポイントの y 座標。
四角形ベジエ曲線の終点の x 座標。
四角形ベジエ曲線の終点の y 座標。
 

図のセグメントの種類を取得するには、 GetSegmentTypes を呼び出します。

次のコード例は、 SetSegments で必要なバッファーを作成して設定する 1 つの方法を示しています。

最初のコード例では、 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;
}

要件

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

こちらもご覧ください

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

XPS ドキュメント エラー

XPS_SEGMENT_TYPE