Метод 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. Это значение может быть равно NULL , если вызывающий объект требует, чтобы метод возвращал только требуемый размер буфера в dataCount.
Если массив достаточно велик, этот метод копирует точки данных сегмента в массив и возвращает в dataCount количество копируемых точек данных. Если параметр segmentData имеет значение NULL или ссылается на недостаточно большой буфер, возвращается указатель NULL , данные не копируются, а dataCount будет содержать требуемый размер буфера, указанный в качестве количества элементов.
Возвращаемое значение
Метод возвращает HRESULT. Возможные значения включают, помимо прочего, значения в следующей таблице. Сведения о возвращаемых значениях API документов XPS, не перечисленных в этой таблице, см. в разделе Ошибки документа XPS.
Код возврата | Описание |
---|---|
|
Метод выполнен успешно. |
|
dataCount имеет значение NULL. |
|
segmentData имеет значение NULL или ссылается на буфер, который недостаточно велик для получения данных сегмента. DataCount содержит необходимое количество элементов. |
Комментарии
Чтобы определить требуемый размер массива данных сегмента перед вызовом этого метода, вызовите Метод GetSegmentDataCount.
Сегмент geometry описывается начальной точкой, типом сегмента и дополнительными параметрами, значения которых определяются типом сегмента. Координаты начальной точки первого сегмента являются свойством геометрической фигуры и задаются путем вызова SetStartPoint. Начальная точка каждого последующего сегмента является конечной точкой предыдущего сегмента.
Значения в массиве, возвращаемом в параметре segmentData, будут соответствовать XPS_SEGMENT_TYPE значениям в массиве, возвращаемым методом GetSegmentTypes в параметре segmentTypes . Чтобы правильно считывать значения данных сегмента, необходимо знать тип каждого сегмента на геометрическом рисунке. Например, если первый сегмент строки имеет значение типа сегмента 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, Windows Vista с пакетом обновления 2 (SP2) и обновление платформы для Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 R2, Windows Server 2008 с пакетом обновления 2 (SP2) и Обновление платформы для Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | xpsobjectmodel.h |