Freigeben über


Zeichnen von Grafiken in einem XPS-OM

Auf dieser Seite wird beschrieben, wie Grafiken in einem XPS-OM gezeichnet werden.

Um vektorbasierte Grafiken auf einer Seite zu zeichnen, instanziieren Sie eine IXpsOMPath-Schnittstelle, füllen Sie sie mit dem gewünschten Inhalt, und fügen Sie sie der Liste der visuellen Objekte der Seite oder des Zeichenbereichs hinzu. Eine IXpsOMPath-Schnittstelle enthält solche Eigenschaften einer vektorbasierten Form wie Gliederung, Füllfarbe, Linienart und Linienfarbe. Die Form des Pfades wird durch eine IXpsOMGeometry-Schnittstelle angegeben, die eine Sammlung von IXpsOMGeometryFigure-Schnittstellen und optional eine IXpsOMMatrixTransform-Schnittstelle enthält. Sie können jede Schnittstelle verwenden, die von der IXpsOMBrush-Schnittstelle erbt, um den Umfang des Pfads und das Innere der Form zu füllen, die vom Pfad beschrieben wird.

Bevor Sie die folgenden Codebeispiele in Ihrem Programm verwenden, lesen Sie den Haftungsausschluss in Allgemeinen XPS-Dokumentprogrammierungsaufgaben.

Codebeispiel

Im folgenden Codebeispiel wird ein einfacher Pfad erstellt, der ein Rechteck beschreibt, das mit einer einzelnen Farbe gefüllt ist.

Erstellen des Strichs und der Füllpinsel

Im ersten Abschnitt des Codebeispiels wird die IXpsOMSolidColorBrush erstellt, die zum Ausfüllen des Pfadobjekts verwendet wird.

    HRESULT               hr = S_OK;

    XPS_COLOR             xpsColor;
    IXpsOMSolidColorBrush *xpsFillBrush = NULL;
    IXpsOMSolidColorBrush *xpsStrokeBrush = NULL;

    // Set the fill brush color to RED.
    xpsColor.colorType = XPS_COLOR_TYPE_SRGB;
    xpsColor.value.sRGB.alpha = 0xFF;
    xpsColor.value.sRGB.red = 0xFF;
    xpsColor.value.sRGB.green = 0x00;
    xpsColor.value.sRGB.blue = 0x00;

    // Use the object factory to create the brush.
    hr = xpsFactory->CreateSolidColorBrush( 
        &xpsColor,
        NULL,          // color profile resource
        &xpsFillBrush);
    // The color profile resource parameter is NULL because
    //  this color type does not use a color profile resource.

    // Set the stroke brush color to BLACK.
    xpsColor.colorType = XPS_COLOR_TYPE_SRGB;
    xpsColor.value.sRGB.alpha = 0xFF;
    xpsColor.value.sRGB.red = 0x00;
    xpsColor.value.sRGB.green = 0x00;
    xpsColor.value.sRGB.blue = 0x00;

    // Use the object factory to create the brush.
    hr = xpsFactory->CreateSolidColorBrush( 
            &xpsColor,
            NULL, // This color type does not use a color profile resource.
            &xpsStrokeBrush);

    // The brushes are released below after they have been used.

Definieren der Form

Im zweiten Abschnitt des Codebeispiels wird die IXpsOMGeometry-Schnittstelle erstellt. Anschließend wird die IXpsOMGeometryFigure-Schnittstelle erstellt, welche die Form der Abbildung angibt, und die Abbildung der IXpsOMGeometry-Schnittstelle hinzufügt. Im Beispiel wird ein Rechteck erstellt, das durch rect angegeben wird. Segmente müssen nur für drei der vier Seiten des Rechtecks definiert werden. Der Umfang der Form, in diesem Fall des Rechtecks, beginnt vom Anfangspunkt und geht entlang der Segmente der geometrischen Figur. Durch Festlegen der IsClosed-Eigenschaft auf TRUE wird angegeben, dass das Rechteck geschlossen wird, indem ein zusätzliches Segment hinzugefügt wird, welches das Ende des letzten Abschnitts mit dem Startpunkt verbindet.

    // rect is initialized outside of the sample and 
    //  contains the coordinates of the rectangular geometry to create.
    XPS_RECT                            rect = {0,0,100,100};       

    HRESULT                             hr = S_OK;
    IXpsOMGeometryFigure                *rectFigure;
    IXpsOMGeometry                      *imageRectGeometry;
    IXpsOMGeometryFigureCollection      *geomFigureCollection;

    // Define the start point and create an empty figure.
    XPS_POINT                           startPoint = {rect.x, rect.y};
    hr = xpsFactory->CreateGeometryFigure( &startPoint, &rectFigure );
    // Define the segments of the geometry figure.
    //  First, define the type of each segment.
    XPS_SEGMENT_TYPE segmentTypes[3] = {
        XPS_SEGMENT_TYPE_LINE,  // each segment is a straight line
        XPS_SEGMENT_TYPE_LINE, 
        XPS_SEGMENT_TYPE_LINE
    };

    // Define the x and y coordinates of each corner of the figure
    //  the start point has already been defined so only the 
    //  remaining three corners need to be defined.
    FLOAT segmentData[6] = {
        rect.x,                (rect.y + rect.height),
        (rect.x + rect.width), (rect.y + rect.height), 
        (rect.x + rect.width), rect.y 
    };

    // Describe if the segments are stroked (that is if the segment lines
    //  should be drawn as a line).
    BOOL segmentStrokes[3] = {
        TRUE, TRUE, TRUE // Yes, draw each of the segment lines.
    };

    // Add the segment data to the figure.
    hr = rectFigure->SetSegments(
                        3, 
                        6, 
                        segmentTypes, 
                        segmentData, 
                        segmentStrokes);

    // Set the closed and filled properties of the figure.
    hr = rectFigure->SetIsClosed( TRUE );
    hr = rectFigure->SetIsFilled( TRUE );
 
    // Create the geometry object.
    hr = xpsFactory->CreateGeometry( &imageRectGeometry );
    
    // Get a pointer to the figure collection interface of the geometry...
    hr = imageRectGeometry->GetFigures( &geomFigureCollection );

    // ...and then add the figure created above to this geometry.
    hr = geomFigureCollection->Append( rectFigure );
    // If not needed for anything else, release the rectangle figure.
    rectFigure->Release();

    // when done adding figures, release the figure collection. 
    geomFigureCollection->Release();

    //  When done with the geometry object, release the object.
    // imageRectGeometry->Release();
    //  In this case, imageRectGeometry is used in the next sample
    //  so the geometry object is not released, yet.
    

Erstellen Sie den Pfad, und fügen Sie ihn der visuellen Sammlung hinzu

Im letzten Abschnitt dieses Codebeispiels wird das Pfadobjekt erstellt und konfiguriert. Anschließend wird es der Liste der visuellen Objekte der Seite hinzugefügt.

    HRESULT                    hr = S_OK;
    // The page interface pointer is initialized outside of this sample.
    IXpsOMPath                *rectPath = NULL;
    IXpsOMVisualCollection    *pageVisuals = NULL;

    // Create the new path object.
    hr = xpsFactory->CreatePath( &rectPath );

    // Add the geometry to the path.
    //  imageRectGeometry is initialized outside of this example.
    hr = rectPath->SetGeometryLocal( imageRectGeometry );

    // Set the short description of the path to provide
    //  a textual description of the object for accessibility.
    hr = rectPath->SetAccessibilityShortDescription( L"Red Rectangle" );
    
    // Set the fill and stroke brushes to use the brushes 
    //  created in the first section.
    hr = rectPath->SetFillBrushLocal( xpsFillBrush );
    hr = rectPath->SetStrokeBrushLocal( xpsStrokeBrush);

    // Get the visual collection of this page and add this path to it.
    hr = xpsPage->GetVisuals( &pageVisuals );
    hr = pageVisuals->Append( rectPath );
    // If not needed for anything else, release the rectangle path.
    rectPath->Release();
    
    // When done with the visual collection, release it.
    pageVisuals->Release();

    // When finished with the brushes, release the interface pointers.
    if (NULL != xpsFillBrush) xpsFillBrush->Release();
    if (NULL != xpsStrokeBrush) xpsStrokeBrush->Release();

    // When done with the geometry interface, release it.
    imageRectGeometry->Release();

    // When done with the path interface, release it.
    rectPath->Release();

Bewährte Methoden

Fügen Sie eine textbezogene Beschreibung der Form hinzu, die von der IXpsOMPath-Schnittstelle angegeben wird. Verwenden Sie zum Vorteil sehbehinderter Benutzer die Methoden SetAccessibilityShortDescription und SetAccessibilityLongDescription, um Textinhalte für Features zur Unterstützung der Barrierefreiheit, wie z.B. Bildschirmsprachausgaben, bereitzustellen.

Zusätzliche Informationen

Im Codebeispiel auf dieser Seite wird eine IXpsOMSolidColorBrush-Schnittstelle als Füllpinsel und Strichpinsel für den Pfad verwendet. Zusätzlich zur IXpsOMSolidColorBrush-Schnittstelle können Sie eine IXpsOMGradientBrush-, IXpsOMImageBrush- oder IXpsOMVisualBrush-Schnittstelle verwenden.

Der Strich ist die Linie, die am Umfang der Abbildung entlang gezeichnet werden kann. Die XML Paper Specification unterstützt viele verschiedene Strichlinienarten. Legen Sie zum Angeben der Strichlinienart die Stricheigenschaften mit den folgenden Methoden der IXpsOMPath-Schnittstelle fest:

Nächste Schritte

Navigieren im XPS-OM

Schreiben von Text in ein XPS-OM

Platzieren von Bildern in einem XPS-OM

Schreiben eines XPS-OM in ein XPS-Dokument

Drucken eines XPS-OM

Wird auf dieser Seite verwendet

IOpcPartUri

IXpsOMGeometry

IXpsOMGeometryFigure

IXpsOMGeometryFigureCollection

IXpsOMObjectFactory

IXpsOMPage

IXpsOMPath

IXpsOMSolidColorBrush

IXpsOMVisualCollection

Weitere Informationen

Initialisieren eines XPS-OM

XPS-Dokument-API-Referenz

XML Paper Specification