Dessiner des graphiques dans un OM XPS

Cette page explique comment dessiner des graphiques dans un OM XPS.

Si vous voulez dessiner des graphiques vectoriels dans une page, instanciez une interface IXpsOMPath, remplissez-le avec le contenu souhaité et ajoutez-le à la liste des objets visuels de la page ou du canevas. Une interface IXpsOMPath contient des propriétés de forme vectorielle telles que le contour, la couleur de remplissage, le style de ligne et la couleur de ligne. La forme du chemin est spécifiée par une interface IXpsOMGeometry qui contient une collection d’interfaces IXpsOMGeometryFigure et, de manière facultative, une interface IXpsOMMatrixTransform. Vous pouvez utiliser n’importe quelle interface qui hérite de l’interface IXpsOMBrush pour remplir le périmètre du tracé et l’intérieur de la forme décrite par le tracé.

Avant d’utiliser les exemples de code suivants dans votre programme, lisez l’exclusion de responsabilité dans les Tâches courantes de programmation de documents XPS.

Exemple de code

L’exemple de code suivant crée un tracé simple qui décrit un rectangle rempli d’une couleur unique.

Créer le trait d’encre et les pinceaux de remplissage

La première section de l’exemple de code crée IXpsOMSolidColorBrush qui sera utilisé pour remplir le tracé de l’objet.

    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.

Définir la forme

La deuxième section de l’exemple de code crée l’interface IXpsOMGeometry. Il crée ensuite l’interface IXpsOMGeometryFigure qui spécifie la forme de la figure et ajoute la figure à l’interface IXpsOMGeometry. L’exemple crée un rectangle spécifié par Rect. Les segments doivent être définis uniquement pour trois des quatre côtés du rectangle. Le périmètre de la forme, le rectangle dans le cas présent, commence à partir du point de départ et s’étend comme défini par les segments de la figure géométrique. La définition de la propriété IsClosed sur TRUE indique que le rectangle est fermé en ajoutant un segment supplémentaire qui connecte la fin du dernier segment au point de départ.

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

Créer le tracé et l’ajouter à la collection visuelle

La dernière section de cet exemple de code crée et configure l’objet Path, puis l’ajoute à la liste des objets visuels de la page.

    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();

Meilleures pratiques

Ajoutez une description textuelle de la forme spécifiée par l’interface IXpsOMPath. Au profit des utilisateurs malvoyants, utilisez les méthodes SetAccessibilityShortDescription et SetAccessibilityLongDescription afin de fournir du contenu textuel pour les fonctionnalités de prise en charge de l’accessibilité, telles que des lecteurs d’écran.

Informations supplémentaires

L’exemple de code de cette page utilise une interface IXpsOMSolidColorBrush comme pinceau de remplissage et pinceau de trait d’encre pour le tracé. Outre l’interface IXpsOMSolidColorBrush, vous pouvez utiliser une interface IXpsOMGradientBrush, IXpsOMImageBrush ou IXpsOMVisualBrush.

Le trait d’encre est la ligne qui peut être dessinée autour du périmètre de la figure. La XML Paper Specification prend en charge de nombreux styles de trait d’encre différents. Pour spécifier le style de ligne de trait d’encre, définissez les propriétés de trait avec les méthodes suivantes de l’interface IXpsOMPath :

Étapes suivantes

Naviguer dans l’OM XPS

Écrire du texte dans un OM XPS

Placer des images dans un OM XPS

Écrire un OM XPS dans un document XPS

Imprimer un OM XPS

Utilisé dans cette page

IOpcPartUri

IXpsOMGeometry

IXpsOMGeometryFigure

IXpsOMGeometryFigureCollection

IXpsOMObjectFactory

IXpsOMPage

IXpsOMPath

IXpsOMSolidColorBrush

IXpsOMVisualCollection

Pour plus d'informations

Initialiser un OM XPS

Informations de référence sur l’API Document XPS

XML Paper Specification