Поделиться через


Метод 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.

Код возврата Описание
S_OK
Метод выполнен успешно.
E_POINTER
dataCount имеет значение NULL.
ERROR_MORE_DATA
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_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, Windows Vista с пакетом обновления 2 (SP2) и обновление платформы для Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2008 R2, Windows Server 2008 с пакетом обновления 2 (SP2) и Обновление платформы для Windows Server 2008 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header xpsobjectmodel.h

См. также раздел

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XPS

Ошибки документа XPS