Placer des images dans un OM XPS
Décrit le placement d’images dans un OM XPS.
Pour placer des images dans un modèle OM XPS, créez un objet Path qui définit l’emplacement et le contour d’une image, puis utilisez un pinceau d’image pour remplir le chemin. Ajoutez l’objet Path créé à la liste des objets visuels de la page ou du canevas afin qu’il puisse être rendu avec l’autre contenu visuel.
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
Créer une ressource d’image
Si l’image source n’est pas disponible dans l’OM XPS en tant que ressource d’image, commencez par créer la ressource d’image :
HRESULT hr = S_OK;
IStreamPtr imageStream; // the resulting image stream
IOpcPartUri *imagePartUri;
IXpsOMImageResource *imageResource;
XPS_RECT rect = {0.0f, 0.0f, 0.0f, 0.0f}; // set to image size
hr = xpsFactory->CreateReadOnlyStreamOnFile (
imageFileName, &imageStream );
hr = xpsFactory->CreatePartUri( imagePartName, &imagePartUri );
imageType; // set to type of image being read in
hr = xpsFactory->CreateImageResource (
imageStream,
imageType,
imagePartUri,
&imageResource);
imagePartUri->Release();
imageStream->Release();
// imageResource can now be used by other parts in the XPS OM.
Placer une image dans une collection visuelle
Si l’image source est disponible dans l’OM XPS en tant que ressource d’image, elle peut être utilisée pour créer un objet de pinceau d’image et ajoutée en tant que pinceau de remplissage au chemin qui décrit l’emplacement et la taille de l’image dans la page.
// These variables are initialized outside of this code example,
// for example, as the parameters of a method or from some
// preceding program code.
// dimensions of the image in pixels
XPS_SIZE bmpDim = {0,0} ;
// DPI resolution values obtained from image
FLOAT dpiX = 96.0f;
FLOAT dpiY = 96.0f;
// initialize viewport values
XPS_RECT viewPort = {0.0,0.0,0.0,0.0};
// initialize viewbox values
XPS_RECT viewBox = {0.0,0.0,0.0,0.0};
// These are part of this code example.
IXpsOMPath *imageRectPath;
IXpsOMImageBrush *imageBrush;
IXpsOMVisualCollection *pageVisuals;
// Describe image source dimensions and set viewbox to be the
// entire image DIP width of image.
// Example:
// 600 image pixels, 300 dpi -> 2 inches -> 2 * 96 = 192 DIP width
viewBox.width = FLOAT((double)bmpDim.width * 96.0 / dpiX);
viewBox.height = FLOAT((double)bmpDim.height * 96.0 / dpiY);
// Describe the size and position of the image destination.
// rect is an XPS_RECT structure that is initialized outside
// of this sample for example, it might be passed in as a parameter.
// destination rectangle
viewPort.x = rect.x;
viewPort.y = rect.y;
viewPort.width = rect.width;
viewPort.height = rect.height;
// Create the image brush.
hr = xpsFactory->CreateImageBrush(imageResource, &viewBox, &viewPort,
reinterpret_cast<IXpsOMImageBrush**>(&imageBrush));
// Create the path that describes the outline of the image on the page.
// This step uses the function described in the next code example.
hr = CreateRectanglePath(xpsFactory, &rect,
reinterpret_cast<IXpsOMPath**>(&imageRectPath));
// Set the accessibility description for the path object as required.
hr = imageRectPath->SetAccessibilityShortDescription( shortDescText );
// Set the image brush to be the fill brush for this path.
hr = imageRectPath->SetFillBrushLocal( imageBrush );
// Get the list of visuals for this page...
hr = xpsPage->GetVisuals( &pageVisuals );
// ...and add the completed path to the list.
hr = pageVisuals->Append( imageRectPath );
// Release locally created interfaces.
if (NULL != pageVisuals) pageVisuals->Release();
if (NULL != imageRectPath) imageRectPath->Release();
if (NULL != imageBrush) imageBrush->Release();
Créer un objet Path pour l’image
La méthode suivante accepte une structure XPS_RECT et crée un tracé rectangulaire.
HRESULT
CreateRectanglePath(
__in IXpsOMObjectFactory *xpsFactory,
__in const XPS_RECT *rect,
__out IXpsOMPath **rectPath
)
{
HRESULT hr = S_OK;
IXpsOMGeometryFigure *rectFigure;
IXpsOMGeometry *imageRectGeometry;
IXpsOMGeometryFigureCollection *geomFigureCollection;
// Define start point and three of the four sides of the rectangle.
// The fourth side is implied by setting the path type to CLOSED.
XPS_POINT startPoint = {rect->x, rect->y};
XPS_SEGMENT_TYPE segmentTypes[3] = {
XPS_SEGMENT_TYPE_LINE,
XPS_SEGMENT_TYPE_LINE,
XPS_SEGMENT_TYPE_LINE
};
FLOAT segmentData[6] = {
rect->x, rect->y+rect->height,
rect->x+rect->width, rect->y+rect->height,
rect->x+rect->width, rect->y
};
BOOL segmentStrokes[3] = {
TRUE, TRUE, TRUE
};
// Create a closed geometry figure using the three
// segments defined above.
hr = xpsFactory->CreateGeometryFigure( &startPoint, &rectFigure );
hr = rectFigure->SetIsClosed( TRUE );
hr = rectFigure->SetIsFilled( TRUE );
hr = rectFigure->SetSegments( 3, 6,
segmentTypes, segmentData, segmentStrokes );
// Create a geometry that consists of the figure created above.
hr = xpsFactory->CreateGeometry( &imageRectGeometry );
hr = imageRectGeometry->GetFigures( &geomFigureCollection );
hr = geomFigureCollection->Append( rectFigure );
// Create the path that consists of the geometry created above
// and return the pointer in the parameter passed in to the function.
hr = xpsFactory->CreatePath( reinterpret_cast<IXpsOMPath**>(rectPath) );
hr = (*rectPath)->SetGeometryLocal( imageRectGeometry );
// The calling method will release these interfaces when
// it is done with them.
return hr;
}
Rubriques connexes
-
Étapes suivantes
-
Utilisé dans cette page
-
Pour plus d'informations