Freigeben über


IXpsOMGeometryFigure::SetSegments-Methode (xpsobjectmodel.h)

Legt die Segmentinformationen und Datenpunkte für Segmente in der Abbildung fest.

Syntax

HRESULT SetSegments(
  [in] UINT32                 segmentCount,
  [in] UINT32                 segmentDataCount,
  [in] const XPS_SEGMENT_TYPE *segmentTypes,
  [in] const FLOAT            *segmentData,
  [in] const BOOL             *segmentStrokes
);

Parameter

[in] segmentCount

Die Anzahl der Segmente.

Dieser Wert ist auch die Anzahl der Elemente in den Arrays, auf die von segmentTypes und segmentStrokes verwiesen wird.

[in] segmentDataCount

Die Anzahl der Segmentdatenpunkte.

Dieser Wert ist auch die Anzahl der Elemente im Array, auf die von segmentData verwiesen wird.

[in] segmentTypes

Ein Array von XPS_SEGMENT_TYPE Variablen. Der Wert von segmentCount gibt die Anzahl der Elemente in diesem Array an.

[in] segmentData

Ein Array von Segmentdatenwerten. Der Wert von segmentDataCount gibt die Anzahl der Elemente in diesem Array an.

[in] segmentStrokes

Ein Array von Segmentstrichwerten. Der Wert von segmentCount gibt die Anzahl der Elemente in diesem Array an.

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_INVALIDARG
segmentTypes enthält einen Wert des unbekannten Typs.

Alternativ ist die Anzahl der Einträge im segmentData-Array größer als die Anzahl der Einträge im segmentTypes-Array .

E_POINTER
segmentTypes, segmentData oder segmentStrokes ist NULL.
XPS_E_INVALID_FLOAT
segmentData enthält einen FLOAT-Wert , der unendlich ist oder keine Zahl (NAN) ist.
XPS_E_MISSING_SEGMENT_DATA
Das array, das in segmentData übergeben wird, weist weniger Einträge auf als das in segmentTypes übergebene Array.
XPS_E_NEGATIVE_FLOAT
Ein Eintrag im Array, der in segmentData übergeben wird, enthält einen negativen Wert, muss jedoch einen nicht negativen Wert enthalten.

Hinweise

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 Anzahl der Datenwerte, die ein Zeilensegment definieren, hängt vom Segmenttyp ab. Die folgende Tabelle beschreibt den spezifischen Satz der erforderlichen Datenwerte, die für jeden Segmenttyp verwendet werden müssen. Die Werte im Segmentdatenarray, das im segmentData-Parameter übergeben wird, müssen den XPS_SEGMENT_TYPE Werten im Array entsprechen, das im segmentTypes-Parameter übergeben wird. 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.

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.
 

Rufen Sie GetSegmentTypes auf, um die Segmenttypen in der Abbildung abzurufen.

Die folgenden Codebeispiele veranschaulichen eine Möglichkeit zum Erstellen und Auffüllen der für SetSegments erforderlichen Puffer.

Im ersten Codebeispiel verwendet die AddSegmentDataToArrays-Methode die Datenpunkte, die ein einzelnes Segment beschreiben, und speichert sie in den drei verschiedenen Datenpuffern, die für die SetSegments-Methode erforderlich sind. Die Datenpuffer, die als Argumente an AddSegmentDataToArrays übergeben werden, werden von der aufrufenden Methode verwaltet, wie im Codebeispiel nach AddSegmentDataToArrays gezeigt.

HRESULT
AddSegmentDataToArrays(
    XPS_SEGMENT_TYPE        segmentType,
    BOOL                    segmentStroke,
    FLOAT                   *segmentPoints,
    UINT32                  *segmentsAvailable,
    UINT32                  *segmentPointsAvailable,
    XPS_SEGMENT_TYPE        **segmentTypeBuffer,
    BOOL                    **segmentStrokeBuffer,
    FLOAT                   **segmentPointBuffer
)
/*
Description:

Populates the buffers required by IXpsOMGeometryFigure::SetSegmentData
using data and buffers provided by the calling method.

Parameters:

segmentType
    IN: XPS_SEGMENT_TYPE value that specifies the segment type for
        the current segment.

segmentStroke
    IN: BOOL value that specifies whether the current segment 
        is stroked.

*segmentPoints
    IN: pointer to an array of FLOAT values that specify the 
        segment's data points. The number of values in the array
        depend on the value of the segmentType parameter.

*segmentsAvailable
    IN: the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer.
        This value must be >= 1 when calling the method.
    OUT:  the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer after
        segmentType and segmentStroke have been added. If the 
        method was successful, the returned value is one less 
        than the value passed in to the method.

*segmentPointsAvailable
    IN: the number of values that remain unused in the
        segmentPointBuffer.    This value must be greater-than or equal
        to the number of points required by the segmentType value.
    OUT:  the number of values that remain unused in the
        segmentPointBuffer after the segmentPoints have been added.
        The returned value depends on the segmentType value.

**segmentTypeBuffer
    IN: the first free element in the buffer that receives the segment
        type values.
    OUT: the first free element in the buffer that receives the segment
        type values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentStrokeBuffer
    IN: the first free element in the buffer that receives the segment
        stroke values.
    OUT: the first free element in the buffer that receives the segment
        stroke values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentPointBuffer
    IN: the first free element in the buffer that receives the segment
        point values.
    OUT: the first free element in the buffer that receives the segment
        point values. If the method is successful, the element referenced
        by this value will depend on the segment type.

Remarks.
1) the buffers and values passed into this method are managed by
    the calling method.

2) if the value returned in segmentsAvailable is 0, segmentTypeBuffer
    and segmentStrokeBuffer point to invalid memory.

3) if the value returned in segmentPointsAvailable is 0, segmentPointBuffer
    point to invalid memory.

*/
{
    HRESULT hr = S_OK;

    // test to see if there is sufficient space in the 
    // segmentTypeBuffer and the segmentStrokeBuffer before
    // proceeding
    if (*segmentsAvailable == 0)
    {
        hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
    }

    if (SUCCEEDED(hr))
    {
        // process the data based on the segment type
        switch (segmentType) 
        {
            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:
                if (*segmentPointsAvailable >= 5) 
                {
                    // 5 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc angle
                    *segmentPointsAvailable -= 5;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_BEZIER:
                if (*segmentPointsAvailable >= 6) 
                {
                    // 6 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 6;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_LINE:
                if (*segmentPointsAvailable >= 2) 
                {
                    // 2 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 2;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                if (*segmentPointsAvailable >= 4) 
                {
                    // 4 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 4;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            default:
                // unrecognized segment type
                hr = E_UNEXPECTED;
                break;
        }

    }

    if (SUCCEEDED(hr))
    {
        // Copy segment type and segment stroke values
        // to array and decrement number of array values
        // that remain unused.
        //
        // The space available for these operations was
        // tested at the beginning of the method.
        *(*segmentTypeBuffer)++ = segmentType;
        *(*segmentStrokeBuffer)++ = segmentStroke;
        *segmentsAvailable--;
    } 

    return hr;
}

In diesem Codebeispiel erstellt UpdateSegmentData die für die SetSegments-Methode erforderlichen Datenpuffer und ruft die AddSegmentDataToArrays-Methode aus dem vorherigen Codebeispiel auf, um sie mit den Segmentdaten aufzufüllen. Nachdem die Puffer aufgefüllt wurden, wird SetSegments aufgerufen, um diese Daten der Geometriefigur hinzuzufügen.

Hinweis Die tatsächlichen Segmentdaten werden in diesen Codebeispielen nicht angezeigt.

 
HRESULT
UpdateSegmentData (
    IXpsOMGeometryFigure    *geometryFigure,
    UINT32                  segmentCount,
    UINT32                  segmentDataCount
)
/*
    Note that this method is not complete and only includes
    the code necessary to show how the SetSegments call is used.

    In this sample, the geometryFigure, segmentCount, and
    segmentDataCount values are assumed to have been initialized
    outside of this example.
*/
{
    HRESULT             hr = S_OK;
    XPS_SEGMENT_TYPE    segmentType = (XPS_SEGMENT_TYPE)0;
    BOOL                segmentStroke = FALSE;
    FLOAT               segmentPoints = 0;
    UINT32              segmentsAvailable = 0;
    UINT32              segmentPointsAvailable = 0;
    // these buffers are sized and allocated based on 
    //    the segment data to store.
    XPS_SEGMENT_TYPE    *segmentTypeBuffer = NULL;
    BOOL                *segmentStrokeBuffer = NULL;
    FLOAT               *segmentPointBuffer = NULL;

    XPS_SEGMENT_TYPE    *nextSegmentTypeValue = NULL;
    BOOL                *nextSegmentStrokeValue = NULL;
    FLOAT               *nextSegmentPointValue = NULL;

    // segment data is created outside of this example

    // allocate buffers as required using information 
    // from segment data. This can be dynamic or static
    // depending on how the segment information is managed.
    // This example assumes that the segment information 
    // does not change during this method.

    // initialize "next" pointers to point to the first
    // element in each array.
    nextSegmentTypeValue = segmentTypeBuffer;
    nextSegmentStrokeValue = segmentStrokeBuffer;
    nextSegmentPointValue = segmentPointBuffer;

    // for each segment in the figure, add the 
    // segment data to the buffers

        hr = AddSegmentDataToArrays(
                segmentType,
                segmentStroke,
                &segmentPoints,
                &segmentsAvailable,
                &segmentPointsAvailable,
                &nextSegmentTypeValue,
                &nextSegmentStrokeValue,
                &nextSegmentPointValue);
        
    if (SUCCEEDED(hr))
    {
        // set segment data
        hr = geometryFigure->SetSegments (
            segmentCount,
            segmentDataCount,
            segmentTypeBuffer,
            segmentPointBuffer,
            segmentStrokeBuffer);
    }
    // clean up buffers

    return hr;
}

Anforderungen

Anforderung Wert
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

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

XPS-Dokumentfehler

XPS_SEGMENT_TYPE