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


Метод 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. Возможные значения включают, помимо прочего, значения в следующей таблице. Сведения о возвращаемых значениях API документов XPS, не перечисленных в этой таблице, см. в статье Ошибки документа XPS.

Код возврата Описание
S_OK
Метод выполнен успешно.
E_INVALIDARG
segmentTypes содержит значение нераспознанного типа.

Кроме того, количество записей в массиве segmentData больше, чем количество записей в массиве segmentTypes .

E_POINTER
segmentTypes, segmentData или segmentStrokes имеет значение NULL.
XPS_E_INVALID_FLOAT
segmentData содержит значение FLOAT , которое является бесконечным или не является числом (NAN).
XPS_E_MISSING_SEGMENT_DATA
Массив, передаваемый в segmentData, содержит меньше записей, чем массив, переданный в segmentTypes.
XPS_E_NEGATIVE_FLOAT
Запись в массиве, передаваемом в segmentData , содержит отрицательное значение, но оно должно содержать не отрицательное значение.

Комментарии

Геометрический сегмент описывается начальной точкой, типом сегмента и дополнительными параметрами, значения которых определяются типом сегмента. Координаты начальной точки первого сегмента являются свойством геометрического рисунка и задаются путем вызова SetStartPoint. Начальная точка каждого последующего сегмента является конечной точкой предыдущего сегмента.

Количество значений данных, определяющих сегмент линии, зависит от типа сегмента. В следующей таблице описывается конкретный набор обязательных значений данных, которые должны использоваться для каждого типа сегмента. Значения в массиве данных сегмента, передаваемом в параметре segmentData , должны соответствовать XPS_SEGMENT_TYPE значениям в массиве, передаваемом в параметре 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 конечной точки кривой Квадро Безье.
 

Чтобы получить типы сегментов на рисунке, вызовите Метод GetSegmentTypes.

В следующих примерах кода показан один из способов создания и заполнения буферов, необходимых для SetSegments.

В первом примере кода метод AddSegmentDataToArrays принимает точки данных, описывающие один сегмент, и сохраняет их в трех разных буферах данных, необходимых для метода SetSegments . Буферы данных, передаваемые в качестве аргументов в 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;
}

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

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

GetSegmentTypes

IXpsOMGeometryFigure

XPS

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

XPS_SEGMENT_TYPE