IXpsOMGeometryFigure::GetSegmentData 方法 (xpsobjectmodel.h)

获取几何图形的段数据点。

语法

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

参数

[in, out] dataCount

segmentData 参数引用的数组的大小。

如果方法成功返回, dataCount 将包含 由 segmentData 引用的数组中返回的元素数。

如果在调用 方法时 segmentData 设置为 NULL ,则必须将 dataCount 设置为零。

如果在 segmentData 中返回 NULL 指针,dataCount 将包含所需的缓冲区大小作为元素数。

[in, out] segmentData

数组的地址,该数组的元素数与 dataCount 中指定的元素数相同。 如果调用方要求该方法仅返回 dataCount 中所需的缓冲区大小,则可以将此值设置为 NULL

如果数组足够大,此方法会将段数据点复制到数组中,并在 dataCount 中返回复制的数据点数。 如果 segmentData 设置为 NULL 或引用的缓冲区不够大,则将返回 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 数组中的前两个数据值将是该线段终点的 x 和 y 坐标;如果下一段的段类型值为 XPS_SEGMENT_TYPE_BEZIER,则 segmentData 数组中的接下来六个值将描述该段的特征;几何图形中每个线段的等等。

下表描述了为每个段类型返回的特定数据值集。 有关如何在程序中访问此数据的示例,请参阅下面的代码示例。

段类型 必需的数据值
XPS_SEGMENT_TYPE_LINE 显示XPS_SEGMENT_TYPE_LINE图段示例的关系图 两个数据值:
段线终点的 x 坐标。
段线终点的 y 坐标。
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE 图段XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE图。 五个数据值:
弧线终点的 x 坐标。
弧线终点的 y 坐标。
椭圆沿 x 轴的半径的长度。
椭圆沿 y 轴的半径的长度。
旋转角度。
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE 显示XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE图段示例的关系图 五个数据值:
弧线终点的 x 坐标。
弧线终点的 y 坐标。
椭圆沿 x 轴的半径的长度。
椭圆沿 y 轴的半径的长度。
旋转角度。
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE 图段XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE图。 五个数据值:
弧线终点的 x 坐标。
弧线终点的 y 坐标。
椭圆沿 x 轴的半径的长度。
椭圆沿 y 轴的半径的长度。
旋转角度。
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE 显示XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE图段示例的关系图 五个数据值:
弧线终点的 x 坐标。
弧线终点的 y 坐标。
椭圆沿 x 轴的半径的长度。
椭圆沿 y 轴的半径的长度。
旋转角度。
XPS_SEGMENT_TYPE_BEZIER 显示XPS_SEGMENT_TYPE_BEZIER图段示例的关系图 六个数据值:
贝塞尔曲线第一个控制点的 x 坐标。
贝塞尔曲线第一个控制点的 y 坐标。
贝塞尔曲线第二个控制点的 x 坐标。
贝塞尔曲线第二个控制点的 y 坐标。
贝塞尔曲线终点的 x 坐标。
贝塞尔曲线终点的 y 坐标。
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER 显示XPS_SEGMENT_TYPE_QUADRATIC_BEZIER图段示例的关系图 四个数据值:
四边形贝塞尔曲线控制点的 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、带 SP2 的 Windows Vista 和适用于 Windows Vista 的平台更新 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2008 R2、Windows Server 2008 SP2 和适用于 Windows Server 2008 的平台更新 [桌面应用 |UWP 应用]
目标平台 Windows
标头 xpsobjectmodel.h

另请参阅

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML 纸张规范

XPS 文档错误