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 |
---|---|
|
O método foi bem-sucedido. |
|
dataCount é NULL. |
|
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 |
Dois valores de dados:
|
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE |
Cinco valores de dados:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
Cinco valores de dados:
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
Cinco valores de dados:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
Cinco valores de dados:
|
XPS_SEGMENT_TYPE_BEZIER |
Seis valores de dados:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
Quatro valores de dados:
|
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 |