Freigeben über


IXpsOMGeometryFigure::GetSegmentData-Methode (xpsobjectmodel.h)

Ruft die Segmentdatenpunkte für die Geometriefigur ab.

Syntax

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

Parameter

[in, out] dataCount

Die Größe des Arrays, auf das vom segmentData-Parameter verwiesen wird.

Wenn die Methode erfolgreich zurückgibt, enthält dataCount die Anzahl der Elemente, die in dem Array zurückgegeben werden, auf das von segmentData verwiesen wird.

Wenn segmentData auf NULL festgelegt ist, wenn die Methode aufgerufen wird, muss dataCount auf 0 festgelegt werden.

Wenn ein NULL-Zeiger in segmentData zurückgegeben wird, enthält dataCount die erforderliche Puffergröße als Anzahl von Elementen.

[in, out] segmentData

Die Adresse eines Arrays, das die gleiche Anzahl von Elementen wie in dataCount angegeben hat. Dieser Wert kann auf NULL festgelegt werden, wenn der Aufrufer erfordert, dass die Methode nur die erforderliche Puffergröße in dataCount zurückgibt.

Wenn das Array groß genug ist, kopiert diese Methode die Segmentdatenpunkte in das Array und gibt in dataCount die Anzahl der kopierten Datenpunkte zurück. Wenn segmentData auf NULL festgelegt ist oder auf einen Puffer verweist, der nicht groß genug ist, wird ein NULL-Zeiger zurückgegeben, es werden keine Daten kopiert, und dataCount enthält die erforderliche Puffergröße, die als Anzahl von Elementen angegeben ist.

Rückgabewert

Die Methode gibt ein HRESULT zurück. Mögliche Werte sind unter anderem diejenigen in der folgenden Tabelle. Informationen zu Rückgabewerten der XPS-Dokument-API, die in dieser Tabelle nicht aufgeführt sind, finden Sie unter XPS-Dokumentfehler.

Rückgabecode Beschreibung
S_OK
Die Methode wurde erfolgreich ausgeführt.
E_POINTER
dataCount ist NULL.
ERROR_MORE_DATA
segmentData ist NULL oder verweist auf einen Puffer, der nicht groß genug ist, um die Segmentdaten zu empfangen. dataCount enthält die erforderliche Anzahl von Elementen.

Hinweise

Rufen Sie GetSegmentDataCount auf, um die erforderliche Größe des Segmentdatenarrays vor dem Aufrufen dieser Methode zu bestimmen.

Ein Geometriesegment wird durch den Startpunkt, den Segmenttyp und zusätzliche Parameter beschrieben, deren Werte durch den Segmenttyp bestimmt werden. Die Koordinaten für den Startpunkt des ersten Segments sind eine Eigenschaft der Geometriefigur und werden durch Aufrufen von SetStartPoint festgelegt. Der Startpunkt jedes nachfolgenden Segments ist der Endpunkt des vorherigen Segments.

Die Werte im Array, das im segmentData-Parameter zurückgegeben wird, entsprechen den XPS_SEGMENT_TYPE Werten im Array, die von der GetSegmentTypes-Methode im segmentTypes-Parameter zurückgegeben werden. Um die Segmentdatenwerte richtig zu lesen, müssen Sie den Typ der einzelnen Segmente in der Geometriefigur kennen. Wenn das erste Zeilensegment beispielsweise den Segmenttypwert XPS_SEGMENT_TYPE_LINE aufweist, sind die ersten beiden Datenwerte im segmentData-Array die x- und y-Koordinaten des Endpunkts dieses Segments. Wenn das nächste Segment den Segmenttypwert XPS_SEGMENT_TYPE_BEZIER hat, beschreiben die nächsten sechs Werte im segmentData-Array die Merkmale dieses Segments. usw. für jedes Liniensegment in der Geometriefigur.

Die folgende Tabelle beschreibt den spezifischen Satz von Datenwerten, die für jeden Segmenttyp zurückgegeben werden. Ein Beispiel für den Zugriff auf diese Daten in einem Programm finden Sie im folgenden Codebeispiel.

Segmenttyp Erforderliche Datenwerte
XPS_SEGMENT_TYPE_LINE Ein Diagramm, das ein Beispiel für ein XPS_SEGMENT_TYPE_LINE-Abbildungssegment zeigt Zwei Datenwerte:
x-Koordinate des Endpunkts der Segmentlinie.
y-Koordinate des Endpunkts der Segmentlinie.
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE Diagramm eines XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE-Abbildungssegments. Fünf Datenwerte:
x-Koordinate des Endpunkts des Bogens.
y-Koordinate des Endpunkts des Bogens.
Länge des Radius der Ellipse entlang der x-Achse.
Länge des Radius der Ellipse entlang der y-Achse.
Der Drehwinkel.
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Ein Diagramm, das ein Beispiel für ein XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE-Abbildungssegment zeigt Fünf Datenwerte:
x-Koordinate des Endpunkts des Bogens.
y-Koordinate des Endpunkts des Bogens.
Länge des Radius der Ellipse entlang der x-Achse.
Länge des Radius der Ellipse entlang der y-Achse.
Der Drehwinkel.
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE Diagramm eines XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE-Abbildungssegments. Fünf Datenwerte:
x-Koordinate des Endpunkts des Bogens.
y-Koordinate des Endpunkts des Bogens.
Länge des Radius der Ellipse entlang der x-Achse.
Länge des Radius der Ellipse entlang der y-Achse.
Der Drehwinkel.
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Ein Diagramm, das ein Beispiel für ein XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE-Abbildungssegment zeigt Fünf Datenwerte:
x-Koordinate des Endpunkts des Bogens.
y-Koordinate des Endpunkts des Bogens.
Länge des Radius der Ellipse entlang der x-Achse.
Länge des Radius der Ellipse entlang der y-Achse.
Der Drehwinkel.
XPS_SEGMENT_TYPE_BEZIER Ein Diagramm, das ein Beispiel für ein XPS_SEGMENT_TYPE_BEZIER-Abbildungssegment zeigt Sechs Datenwerte:
x-Koordinate des ersten Kontrollpunkts der Bézierkurve.
y-Koordinate des ersten Kontrollpunkts der Bézierkurve.
x-Koordinate des zweiten Kontrollpunkts der Bézierkurve.
y-Koordinate des zweiten Kontrollpunkts der Bézierkurve.
x-Koordinate des Endpunkts der Bézierkurve.
y-Koordinate des Endpunkts der Bézierkurve.
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Ein Diagramm, das ein Beispiel für ein XPS_SEGMENT_TYPE_QUADRATIC_BEZIER-Abbildungssegment zeigt Vier Datenwerte:
x-Koordinate des Kontrollpunkts der Quad-Bézierkurve.
y-Koordinate des Kontrollpunkts der Quad Bezier-Kurve.
x-Koordinate des Endpunkts der Quad Bezier-Kurve.
y-Koordinate des Endpunkts der Quad Bezier-Kurve.
 

Im folgenden Codebeispiel wird auf die verschiedenen Datenpunkte der einzelnen Segmenttypen in einer Geometriefigur zugegriffen.

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

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 7, Windows Vista mit SP2 und Plattformupdate für Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 R2, Windows Server 2008 mit SP2 und Plattformupdate für Windows Server 2008 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile xpsobjectmodel.h

Weitere Informationen

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

XPS-Dokumentfehler