Partager via


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
S_OK
E_POINTER
dataCount a la valeur NULL.
ERROR_MORE_DATA
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 Diagramme montrant un exemple de segment de figure XPS_SEGMENT_TYPE_LINE Deux valeurs de données :
coordonnée x du point de terminaison de la ligne de segment.
coordonnée y du point de terminaison de la ligne de segment.
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE Diagramme d’un segment de figure XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE. Cinq valeurs de données :
coordonnée x du point de terminaison de l’arc.
coordonnée y du point de terminaison de l’arc.
Longueur du rayon de l’ellipse le long de l’axe X.
Longueur du rayon de l’ellipse le long de l’axe y.
Angle de rotation.
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Diagramme montrant un exemple de segment de figure XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Cinq valeurs de données :
coordonnée x du point de terminaison de l’arc.
coordonnée y du point de terminaison de l’arc.
Longueur du rayon de l’ellipse le long de l’axe X.
Longueur du rayon de l’ellipse le long de l’axe y.
Angle de rotation.
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE Diagramme d’un segment de figure XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE. Cinq valeurs de données :
coordonnée x du point de terminaison de l’arc.
coordonnée y du point de terminaison de l’arc.
Longueur du rayon de l’ellipse le long de l’axe X.
Longueur du rayon de l’ellipse le long de l’axe y.
Angle de rotation.
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Diagramme montrant un exemple de segment de figure XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Cinq valeurs de données :
coordonnée x du point de terminaison de l’arc.
coordonnée y du point de terminaison de l’arc.
Longueur du rayon de l’ellipse le long de l’axe X.
Longueur du rayon de l’ellipse le long de l’axe y.
Angle de rotation.
XPS_SEGMENT_TYPE_BEZIER Diagramme montrant un exemple de segment de figure XPS_SEGMENT_TYPE_BEZIER Six valeurs de données :
coordonnée x du premier point de contrôle de la courbe de Béziers.
coordonnée y du premier point de contrôle de la courbe de Béziers.
coordonnée x du deuxième point de contrôle de la courbe de Béziers.
coordonnée y du deuxième point de contrôle de la courbe de Béziers.
coordonnée x du point de terminaison de la courbe de Béziers.
coordonnée y du point de terminaison de la courbe de Béziers.
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Diagramme montrant un exemple de segment de figure XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Quatre valeurs de données :
coordonnée x du point de contrôle de la courbe de Béziers quad.
coordonnée y du point de contrôle de la courbe de Béziers quad.
coordonnée x du point de terminaison de la courbe de Béziers quad.
coordonnée y du point de terminaison de la courbe de Béziers quad.
 

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

Voir aussi

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

Erreurs de document XPS