Compartilhar via


Método IXpsOMGeometryFigure::GetSegmentData (xpsobjectmodel.h)

Obtém os pontos de dados do segmento para a figura de geometria.

Sintaxe

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

Parâmetros

[in, out] dataCount

O tamanho da matriz referenciada pelo parâmetro segmentData .

Se o método retornar com êxito, dataCount conterá o número de elementos retornados na matriz referenciada por segmentData.

Se segmentData for definido como NULL quando o método for chamado, dataCount deverá ser definido como zero.

Se um ponteiro NULL for retornado em segmentData, dataCount conterá o tamanho do buffer necessário como o número de elementos.

[in, out] segmentData

O endereço de uma matriz que tem o mesmo número de elementos especificado em dataCount. Esse valor poderá ser definido como NULL se o chamador exigir que o método retorne apenas o tamanho do buffer necessário em dataCount.

Se a matriz for grande o suficiente, esse método copiará os pontos de dados do segmento para a matriz e retornará, em dataCount, o número de pontos de dados copiados. Se segmentData for definido como NULL ou fizer referência a um buffer que não seja grande o suficiente, um ponteiro NULL será retornado, nenhum dado será copiado e dataCount conterá o tamanho do buffer necessário especificado como o número de elementos.

Retornar valor

O método retorna um HRESULT. Os valores possíveis incluem, mas não se limitam, aqueles na tabela a seguir. Para obter informações sobre valores retornados da API de documento XPS que não estão listados nesta tabela, consulte Erros de documento XPS.

Código de retorno Descrição
S_OK
O método foi bem-sucedido.
E_POINTER
dataCount é NULL.
ERROR_MORE_DATA
segmentData é NULL ou faz referência a um buffer que não é grande o suficiente para receber os dados do segmento. dataCount contém o número necessário de elementos.

Comentários

Para determinar o tamanho necessário da matriz de dados do segmento antes de chamar esse método, chame GetSegmentDataCount.

Um segmento de geometria é descrito pelo ponto inicial, o tipo de segmento e parâmetros adicionais cujos valores são determinados pelo tipo de segmento. As coordenadas para o ponto inicial do primeiro segmento são uma propriedade da figura de geometria e são definidas chamando SetStartPoint. O ponto inicial de cada segmento subsequente é o ponto final do segmento anterior.

Os valores na matriz retornada no parâmetro segmentData corresponderão aos valores XPS_SEGMENT_TYPE na matriz retornada pelo método GetSegmentTypes no parâmetro segmentTypes . Para ler os valores de dados do segmento corretamente, você precisará saber o tipo de cada segmento na figura de geometria. Por exemplo, se o primeiro segmento de linha tiver um valor de tipo de segmento de XPS_SEGMENT_TYPE_LINE, os dois primeiros valores de dados na matriz segmentData serão as coordenadas x e y do ponto final desse segmento; se o próximo segmento tiver um valor de tipo de segmento de XPS_SEGMENT_TYPE_BEZIER, os próximos seis valores na matriz segmentData descreverão as características desse segmento; e assim por diante para cada segmento de linha na figura de geometria.

A tabela a seguir descreve o conjunto específico de valores de dados retornados para cada tipo de segmento. Para obter um exemplo de como acessar esses dados em um programa, consulte o exemplo de código a seguir.

Tipo de segmento Valores de dados necessários
XPS_SEGMENT_TYPE_LINE Um diagrama que mostra um exemplo de um segmento de figura XPS_SEGMENT_TYPE_LINE Dois valores de dados:
coordenada x do ponto de extremidade da linha de segmento.
Coordenada y do ponto de extremidade da linha de segmento.
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE Diagrama de um segmento de figura XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE. Cinco valores de dados:
coordenada x do ponto final do arco.
Coordenada y do ponto final do arco.
Comprimento do raio da elipse ao longo do eixo x.
Comprimento do raio da elipse ao longo do eixo y.
Ângulo de rotação.
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Um diagrama que mostra um exemplo de um segmento de figura XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Cinco valores de dados:
coordenada x do ponto final do arco.
Coordenada y do ponto final do arco.
Comprimento do raio da elipse ao longo do eixo x.
Comprimento do raio da elipse ao longo do eixo y.
Ângulo de rotação.
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE Diagrama de um segmento de figura XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE. Cinco valores de dados:
coordenada x do ponto final do arco.
Coordenada y do ponto final do arco.
Comprimento do raio da elipse ao longo do eixo x.
Comprimento do raio da elipse ao longo do eixo y.
Ângulo de rotação.
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Um diagrama que mostra um exemplo de um segmento de figura XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Cinco valores de dados:
coordenada x do ponto final do arco.
Coordenada y do ponto final do arco.
Comprimento do raio da elipse ao longo do eixo x.
Comprimento do raio da elipse ao longo do eixo y.
Ângulo de rotação.
XPS_SEGMENT_TYPE_BEZIER Um diagrama que mostra um exemplo de um segmento de figura XPS_SEGMENT_TYPE_BEZIER Seis valores de dados:
coordenada x do primeiro ponto de controle da curva de Bézier.
Coordenada y do primeiro ponto de controle da curva de Bézier.
coordenada x do segundo ponto de controle da curva de Bézier.
Coordenada y do segundo ponto de controle da curva de Bézier.
coordenada x do ponto final da curva de Bézier.
Coordenada y do ponto final da curva de Bézier.
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Um diagrama que mostra um exemplo de um segmento de figura XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Quatro valores de dados:
coordenada x do ponto de controle da curva Quad Bezier.
Coordenada y do ponto de controle da curva Quad Bezier.
coordenada x do ponto final da curva Quad Bezier.
Coordenada y do ponto final da curva Quad Bezier.
 

O exemplo de código a seguir acessa os diferentes pontos de dados de cada tipo de segmento em uma figura de geometria.

    // 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;

Requisitos

   
Cliente mínimo com suporte Windows 7, Windows Vista com SP2 e Atualização de Plataforma para Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2008 R2, Windows Server 2008 com SP2 e Platform Update para Windows Server 2008 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho xpsobjectmodel.h

Confira também

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

Especificação de Papel XML

Erros de documento XPS