Schreiben von Text in ein XPS-OM
In diesem Thema wird beschrieben, wie Text in ein XPS-OM geschrieben wird.
Text wird in einem XPS-OM platziert, indem eine IXpsOMGlyphen-Schnittstelle erstellt und formatiert und anschließend die IXpsOMGlyphen-Schnittstelle zur Liste der visuellen Objekte der Seite oder Canvas hinzugefügt werden. Jede IXpsOMGlyphen-Schnittstelle stellt eine Glyphenreihe dar, bei dem es sich um eine fortlaufende Ausführung von Zeichen handelt, die ein gemeinsames Format aufweisen. Wenn sich ein Zeichenformatelement (z. B. Schriftart oder Schriftgrad) ändert oder wenn ein Zeilenumbruch erfolgt, muss eine neue IXpsOMGlyphen-Schnittstelle erstellt und der Liste der visuellen Objekte hinzugefügt werden.
Einige der Eigenschaften einer Glyphenreihe können mithilfe der Methoden der IXpsOMGlyphen- Schnittstelle festgelegt werden. Einige Eigenschaften interagieren jedoch mit anderen und müssen mithilfe einer IXpsOMGlyphsEditor-Schnittstelle festgelegt werden.
Bevor Sie die folgenden Codebeispiele in Ihrem Programm verwenden, lesen Sie den Haftungsausschluss in Allgemeine XPS-Dokumentprogrammierungsaufgaben.
Codebeispiel
Erstellen einer Glyphenreihe aus einer Zeichenfolge
Eine Glyphenreihe wird häufig in mehreren Schritten erstellt, die das Laden der Schriftartressourcen, die von der Glyphenreihe verwendet werden, das Festlegen eines Füllpinsels, das Angeben des Schriftgrads und der Startposition sowie das Festlegen der Unicode-Zeichenfolge umfassen.
Der folgende Abschnitt des Codebeispiels enthält eine Routine, die einige Variablen akzeptiert, einschließlich des Schriftgrads, der Farbe und der Position sowie der Zeichen, die geschrieben werden sollen. Der Code erstellt dann eine Glyphenreihe und fügt diese dann einer Seite hinzu. Im Codebeispiel wird davon ausgegangen, dass die in Initialisieren eines XPS-OM beschriebene Initialisierung erfolgt ist und dass das Dokument mindestens eine Seite aufweist. Weitere Informationen zum Erstellen eines leeren XPS-OM finden Sie unter Erstellen eines leeren XPS-OM.
// Write Text to an XPS OM
HRESULT
WriteText_AddTextToPage(
// A pre-created object factory
__in IXpsOMObjectFactory *xpsFactory,
// The font resource to use for this run
__in IXpsOMFontResource *xpsFont,
// The font size
__in float fontEmSize,
// The solid color brush to use for the font
__in IXpsOMSolidColorBrush *xpsBrush,
// The starting location of this glyph run
__in XPS_POINT *origin,
// The text to use for this run
__in LPCWSTR unicodeString,
// The page on which to write this glyph run
__inout IXpsOMPage *xpsPage
)
{
// The data type definitions are included in this function
// for the convenience of this code example. In an actual
// implementation they would probably belong in a header file.
HRESULT hr = S_OK;
XPS_POINT glyphsOrigin = {origin->x, origin->y};
IXpsOMGlyphsEditor *glyphsEditor = NULL;
IXpsOMGlyphs *xpsGlyphs = NULL;
IXpsOMVisualCollection *pageVisuals = NULL;
// Create a new Glyphs object and set its properties.
hr = xpsFactory->CreateGlyphs(xpsFont, &xpsGlyphs);
hr = xpsGlyphs->SetOrigin(&glyphsOrigin);
hr = xpsGlyphs->SetFontRenderingEmSize(fontEmSize);
hr = xpsGlyphs->SetFillBrushLocal(xpsBrush);
// Some properties are inter-dependent so they
// must be changed by using a GlyphsEditor.
hr = xpsGlyphs->GetGlyphsEditor(&glyphsEditor);
hr = glyphsEditor->SetUnicodeString(unicodeString);
hr = glyphsEditor->ApplyEdits();
// Add the new Glyphs object to the page
hr = xpsPage->GetVisuals(&pageVisuals);
hr = pageVisuals->Append(xpsGlyphs);
// Release interface pointers.
if (NULL != xpsGlyphs) xpsGlyphs->Release();
if (NULL != glyphsEditor) glyphsEditor->Release();
if (NULL != pageVisuals) pageVisuals->Release();
return hr;
}
Laden und Erstellen von Ressourcen
Für die Erstellung einer IXpsOMGlyphen-Schnittstelle ist eine Schriftartressource erforderlich. In vielen Fällen verwendet ein Textblock dieselbe Schriftart und Farbe. Daher erstellt dieser Abschnitt des Codebeispiels die Schriftartressourcenschnittstellen, die in den Aufrufen verwendet werden, die den Text auf der Seite platzieren.
// fontFileName is the name of the font file and it
// is defined outside of this example.
HRESULT hr = S_OK;
GUID fontNameGuid;
WCHAR guidString[128] = {0};
WCHAR uriString[256] = {0};
IStream *fontStream = NULL;
IOpcPartUri *fontUri = NULL;
IXpsOMFontResource *fontResource = NULL;
IXpsOMVisualCollection *pageVisuals = NULL;
IXpsOMPage *page = NULL;
IXpsOMVisual *canvasVisual = NULL;
IXpsOMSolidColorBrush *xpsTextColor = NULL;
XPS_COLOR xpsColorBodyText;
// Create font stream.
hr = xpsFactory->CreateReadOnlyStreamOnFile (
fontFileName, &fontStream );
// Create new obfuscated part name for this resource using a GUID.
hr = CoCreateGuid( &fontNameGuid );
hr = StringFromGUID2(
fontNameGuid,
guidString,
ARRAYSIZE(guidString));
// Create a URI string for this font resource that will place
// the font part in the /Resources/Fonts folder of the package.
wcscpy_s(uriString, ARRAYSIZE(uriString), L"/Resources/Fonts/");
// Create the part name using the GUID string as the name and
// ".odttf" as the extension GUID string start and ends with
// curly braces so they are removed.
wcsncat_s(uriString, ARRAYSIZE(uriString),
guidString + 1, wcslen(guidString) - 2);
wcscat_s(uriString, ARRAYSIZE(uriString), L".odttf");
// Create the font URI interface.
hr = xpsFactory->CreatePartUri(
uriString,
&fontUri);
// Create the font resource.
hr = xpsFactory->CreateFontResource(
fontStream,
XPS_FONT_EMBEDDING_OBFUSCATED,
fontUri,
FALSE, // isObfSourceStream
&fontResource);
if (NULL != fontUri) fontUri->Release();
// Create the brush to use for the font.
xpsColorBodyText.colorType = XPS_COLOR_TYPE_SRGB;
xpsColorBodyText.value.sRGB.alpha = 0xFF;
xpsColorBodyText.value.sRGB.red = 0x00;
xpsColorBodyText.value.sRGB.green = 0x00;
xpsColorBodyText.value.sRGB.blue = 0x00;
hr = xpsFactory->CreateSolidColorBrush(
&xpsColorBodyText,
NULL, // This color type does not use a color profile resource.
&xpsTextColor);
// xpsTextColor is released after it has been used.
Text in eine Seite einfügen
Der letzte Abschnitt des Codebeispiels erstellt die Glyphenreihe für jede Ausführung ähnlich formatierten Texts. Zum Ausführen des Codes in diesem letzten Abschnitt sind die xpsFactory-Schnittstelle sowie die Schriftartressource und ein Textfarbpinsel erforderlich und müssen instanziiert und initialisiert worden sein. In diesem Beispiel wird die im ersten Abschnitt beschriebene Funktion verwendet, um die Glyphenreihe zu erstellen und sie der Seite hinzuzufügen.
// The following interfaces are created outside of this example.
// The page on which to place the text.
IXpsOMPage *page = NULL;
// The object factory used by this program.
IXpsOMObjectFactory *xpsFactory = NULL;
// The font resource created in the previous snippet.
IXpsOMFontResource *fontResource = NULL;
// The color brush created in the previous snippet.
IXpsOMSolidColorBrush *xpsTextColor = NULL;
// The following variables are defined outside of this example.
// An array of pointers to the Unicode strings to write.
LPCWSTR *textRuns = NULL;
// An array of start points that correspond to the
// strings in textRuns.
XPS_POINT *startPoints = NULL;
// The number of text runs to add to the page.
UINT32 numRuns = 0;
HRESULT hr = S_OK;
FLOAT fontSize = 7.56f;
UINT32 thisRun;
// Add all the text runs to the page.
thisRun = 0;
while (thisRun < numRuns) {
hr = WriteText_AddTextToPage(
xpsFactory,
fontResource,
fontSize,
xpsTextColor,
&startPoints[thisRun],
textRuns[thisRun],
page);
thisRun++;
}
Zugehörige Themen
-
Nächste Schritte
-
In diesem Abschnitt verwendet
-
Weitere Informationen