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 文档错误。
返回代码 | 说明 |
---|---|
|
方法成功。 |
|
dataCount 为 NULL。 |
|
segmentData 为 NULL 或引用的缓冲区不够大,无法接收段数据。 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_ARC_LARGE_CLOCKWISE |
五个数据值:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
五个数据值:
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
五个数据值:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
五个数据值:
|
XPS_SEGMENT_TYPE_BEZIER |
六个数据值:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
四个数据值:
|
下面的代码示例访问几何图形中每个段类型的不同数据点。
// 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 |