Método IXpsOMGeometryFigure::GetSegmentData (xpsobjectmodel.h)
Obtiene los puntos de datos de segmento para la figura de geometría.
Sintaxis
HRESULT GetSegmentData(
[in, out] UINT32 *dataCount,
[in, out] FLOAT *segmentData
);
Parámetros
[in, out] dataCount
Tamaño de la matriz a la que hace referencia el parámetro segmentData .
Si el método devuelve correctamente, dataCount contendrá el número de elementos devueltos en la matriz a la que hace referencia segmentData.
Si segmentData se establece en NULL cuando se llama al método , dataCount debe establecerse en cero.
Si se devuelve un puntero NULL en segmentData, dataCount contendrá el tamaño de búfer necesario como el número de elementos.
[in, out] segmentData
Dirección de una matriz que tiene el mismo número de elementos que se especifican en dataCount. Este valor se puede establecer en NULL si el autor de la llamada requiere que el método devuelva solo el tamaño de búfer necesario en dataCount.
Si la matriz es lo suficientemente grande, este método copia los puntos de datos de segmento en la matriz y devuelve, en dataCount, el número de puntos de datos que se copian. Si segmentData se establece en NULL o hace referencia a un búfer que no es lo suficientemente grande, se devolverá un puntero NULL , no se copiarán datos y dataCount contendrá el tamaño de búfer necesario especificado como el número de elementos.
Valor devuelto
El método devuelve un valor HRESULT. Entre los valores posibles se incluyen, entre otros, los de la tabla siguiente. Para obtener información sobre los valores devueltos de la API de documentos XPS que no aparecen en esta tabla, vea Errores del documento XPS.
Código devuelto | Descripción |
---|---|
|
El método se ha llevado a cabo de forma correcta. |
|
dataCount es NULL. |
|
segmentData es NULL o hace referencia a un búfer que no es lo suficientemente grande como para recibir los datos del segmento. dataCount contiene el número necesario de elementos. |
Comentarios
Para determinar el tamaño necesario de la matriz de datos de segmento antes de llamar a este método, llame a GetSegmentDataCount.
Un segmento de geometría se describe mediante el punto inicial, el tipo de segmento y parámetros adicionales cuyos valores están determinados por el tipo de segmento. Las coordenadas del punto inicial del primer segmento son una propiedad de la figura de geometría y se establecen llamando a SetStartPoint. El punto inicial de cada segmento posterior es el punto final del segmento anterior.
Los valores de la matriz devueltas en el parámetro segmentData se corresponderán con los valores de XPS_SEGMENT_TYPE de la matriz devueltas por el método GetSegmentTypes en el parámetro segmentTypes . Para leer correctamente los valores de datos del segmento, deberá conocer el tipo de cada segmento de la figura geometry. Por ejemplo, si el primer segmento de línea tiene un valor de tipo de segmento de XPS_SEGMENT_TYPE_LINE, los dos primeros valores de datos de la matriz segmentData serán las coordenadas x e y del punto final de ese segmento; si el siguiente segmento tiene un valor de tipo de segmento de XPS_SEGMENT_TYPE_BEZIER, los seis valores siguientes de la matriz segmentData describirán las características de ese segmento; y así sucesivamente para cada segmento de línea de la figura geometry.
En la tabla siguiente se describe el conjunto específico de valores de datos que se devuelven para cada tipo de segmento. Para obtener un ejemplo de cómo acceder a estos datos en un programa, vea el ejemplo de código siguiente.
Tipo de segmento | Valores de datos necesarios |
---|---|
XPS_SEGMENT_TYPE_LINE |
Dos valores de datos:
|
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE |
Cinco valores de datos:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
Cinco valores de datos:
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
Cinco valores de datos:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
Cinco valores de datos:
|
XPS_SEGMENT_TYPE_BEZIER |
Seis valores de datos:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
Cuatro valores de datos:
|
En el ejemplo de código siguiente se obtiene acceso a los distintos puntos de datos de cada tipo de segmento en una figura de geometría.
// 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 compatible | Windows 7, Windows Vista con SP2 y Platform Update para Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2008 R2, Windows Server 2008 con SP2 y Actualización de plataforma para Windows Server 2008 [aplicaciones de escritorio | Aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | xpsobjectmodel.h |