Запись текста в OM XPS
В этом разделе описывается запись текста в OM XPS.
Текст помещается в OM XPS путем создания и форматирования интерфейса IXpsOMGlyphs , а затем добавления интерфейса IXpsOMGlyphs в список визуальных объектов страницы или холста. Каждый интерфейс IXpsOMGlyphs представляет выполнение глифа , которое представляет собой непрерывный запуск символов, которые используют общий формат. Если элемент формата символа (например, тип шрифта или размер) изменяется или когда разрывы строк, необходимо создать и добавить в список визуальных объектов новый интерфейс IXpsOMGlyphs .
Некоторые свойства выполнения глифа можно задать с помощью методов интерфейса IXpsOMGlyphs. Однако некоторые свойства взаимодействуют с другими пользователями и должны быть заданы с помощью интерфейса IXpsOMGlyphsEditor.
Прежде чем использовать следующие примеры кода в программе, ознакомьтесь с отказом в задачах программирования документов Common XPS.
Пример кода
Создание глифа из строки
Выполнение глифа обычно создается в нескольких шагах, включающих загрузку ресурсов шрифта, используемых при выполнении глифа, настройку кисти заливки, указание размера шрифта и начального расположения и настройку строки Юникода.
В следующем разделе примера кода содержится подпрограмма, которая принимает некоторые переменные, включая размер шрифта, цвет и расположение, а также символы для записи. Затем код создает глиф выполнения, а затем добавляет его на страницу. В примере кода предполагается, что инициализация, описанная в разделе "Инициализация OM XPS", и что документ имеет по крайней мере одну страницу. Дополнительные сведения о создании пустой OM XPS см. в статье "Создание пустой OM XPS".
// 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++;
}
См. также
-
Дальнейшие действия
-
Используется в этом разделе
-
Дополнительные сведения