Méthode IXpsOMGeometryFigure ::GetSegmentData (xpsobjectmodel.h)
Obtient les points de données de segment pour la figure geometry.
Syntaxe
HRESULT GetSegmentData(
[in, out] UINT32 *dataCount,
[in, out] FLOAT *segmentData
);
Paramètres
[in, out] dataCount
Taille du tableau référencé par le paramètre segmentData .
Si la méthode retourne correctement, dataCount contient le nombre d’éléments retournés dans le tableau référencé par segmentData.
Si segmentData a la valeur NULL lorsque la méthode est appelée, dataCount doit être défini sur zéro.
Si un pointeur NULL est retourné dans segmentData, dataCount contient la taille de mémoire tampon requise comme nombre d’éléments.
[in, out] segmentData
Adresse d’un tableau qui a le même nombre d’éléments que spécifié dans dataCount. Cette valeur peut être définie sur NULL si l’appelant exige que la méthode retourne uniquement la taille de mémoire tampon requise dans dataCount.
Si le tableau est suffisamment grand, cette méthode copie les points de données de segment dans le tableau et retourne, dans dataCount, le nombre de points de données copiés. Si segmentData a la valeur NULL ou fait référence à une mémoire tampon qui n’est pas suffisamment grande, un pointeur NULL est retourné, aucune donnée n’est copiée et dataCount contient la taille de mémoire tampon requise spécifiée comme nombre d’éléments.
Valeur retournée
Cette méthode retourne un code HRESULT. Les valeurs possibles incluent, sans s’y limiter, celles de la table qui suit. Pour plus d’informations sur les valeurs de retour de l’API de document XPS qui ne sont pas répertoriées dans ce tableau, consultez Erreurs de document XPS.
Code de retour | Description |
---|---|
|
S_OK |
|
dataCount a la valeur NULL. |
|
segmentData a la valeur NULL ou fait référence à une mémoire tampon qui n’est pas assez grande pour recevoir les données de segment. dataCount contient le nombre d’éléments requis. |
Remarques
Pour déterminer la taille requise du tableau de données de segment avant d’appeler cette méthode, appelez GetSegmentDataCount.
Un segment geometry est décrit par le point de départ, le type de segment et des paramètres supplémentaires dont les valeurs sont déterminées par le type de segment. Les coordonnées du point de départ du premier segment sont une propriété de la figure géométrique et sont définies en appelant SetStartPoint. Le point de départ de chaque segment suivant est le point de fin du segment précédent.
Les valeurs du tableau retournées dans le paramètre segmentData correspondent aux valeurs XPS_SEGMENT_TYPE dans le tableau retournées par la méthode GetSegmentTypes dans le paramètre segmentTypes . Pour lire correctement les valeurs de données de segment, vous devez connaître le type de chaque segment dans la figure geometry. Par exemple, si le segment de première ligne a une valeur de type de segment de XPS_SEGMENT_TYPE_LINE, les deux premières valeurs de données dans le tableau segmentData seront les coordonnées x et y du point de fin de ce segment ; si le segment suivant a une valeur de type de segment de XPS_SEGMENT_TYPE_BEZIER, les six valeurs suivantes du tableau segmentData décrivent les caractéristiques de ce segment ; et ainsi de suite pour chaque segment de ligne dans la figure géométrique.
Le tableau suivant décrit l’ensemble spécifique de valeurs de données retournées pour chaque type de segment. Pour obtenir un exemple d’accès à ces données dans un programme, consultez l’exemple de code qui suit.
Type de segment | Valeurs de données requises |
---|---|
XPS_SEGMENT_TYPE_LINE |
Deux valeurs de données :
|
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE |
Cinq valeurs de données :
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
Cinq valeurs de données :
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
Cinq valeurs de données :
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
Cinq valeurs de données :
|
XPS_SEGMENT_TYPE_BEZIER |
Six valeurs de données :
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
Quatre valeurs de données :
|
L’exemple de code suivant accède aux différents points de données de chaque type de segment dans une figure géométrique.
// 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;
Configuration requise
Client minimal pris en charge | Windows 7, Windows Vista avec SP2 et Mise à jour de plateforme pour Windows Vista [applications de bureau | Applications UWP] |
Serveur minimal pris en charge | Windows Server 2008 R2, Windows Server 2008 avec SP2 et Mise à jour de plateforme pour Windows Server 2008 [applications de bureau | Applications UWP] |
Plateforme cible | Windows |
En-tête | xpsobjectmodel.h |