將文字寫入 XPS OM
本主題描述如何將文字寫入 XPS OM。
文字會藉由建立和格式化 IXpsOMGlyphs 介面,然後將 IXpsOMGlyphs 介面新增 至頁面或畫布的視覺物件清單,以置於 XPS OM 中。 每個 IXpsOMGlyphs 介面都代表字元執行,這是共用通用格式的字元連續執行。 當字元格式專案(例如字型類型或大小)變更或分行符號時,必須建立新的 IXpsOMGlyphs 介面,並將其新增至視覺物件清單。
您可以使用 IXpsOMGlyphs 介面的 方法來 設定字元執行的某些屬性。 不過,某些屬性會與其他屬性互動,而且必須使用 IXpsOMGlyphsEditor 介面來設定 。
在程式中使用下列程式碼範例之前,請先閱讀 Common XPS 檔程式設計工作 中的 免責聲明。
程式碼範例
從字串建立字元執行
字元執行通常是在數個步驟中建立的,包括載入字元回合所使用的字型資源、設定填滿筆刷、指定字型大小和起始位置,以及設定 Unicode 字串。
程式碼範例的下一節包含接受某些變數的常式,包括字型大小、色彩和位置,以及要寫入的字元。 程式碼接著會建立字元執行,然後將它新增至頁面。 程式碼範例假設初始化 XPS OM 中所述 的初始化已發生,而且檔至少有一頁。 如需建立空白 XPS OM 的詳細資訊,請參閱 建立空白 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;
}
載入和建立資源
建立 IXpsOMGlyphs 介面需要字型資源。 在許多情況下,文字區塊使用相同的字型和色彩。 因此,程式碼範例的這個區段會建立字型資源介面,這些介面將用於頁面上放置文字的呼叫中。
// 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.
在頁面中繪製文字
程式碼範例的最後一個區段會針對每個類似格式的文字執行建立字元執行。 若要在最後一節中執行程式碼, xpsFactory 介面以及字型資源和文字色彩筆刷是必要的,而且必須已具現化和初始化。 在此範例中,第一節所述的函式是用來建立圖像執行,並將它們新增至頁面。
// 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++;
}
相關主題
-
後續步驟
-
用於本節
-
詳細資訊