DirectWrite 簡介
人員 在日常生活中一直與文字溝通。 這是人們取用大量資訊的主要方式。 過去,它過去曾通過印刷內容,主要是文件、報紙、書籍等。 越來越多的是其 Windows 電腦上的在線內容。 典型的 Windows 使用者會花很多時間從電腦畫面讀取。 他們可能正在瀏覽網路、掃描電子郵件、撰寫報表、填寫電子錶格或撰寫軟體,但他們真正所做的就是閱讀。 雖然文字和字型幾乎滲透到 Windows 用戶體驗的每個部分,但對大多數用戶來說,螢幕上的閱讀並不像閱讀列印輸出那麼愉快。
對於 Windows 應用程式開發人員來說,撰寫文字處理程式碼是一項挑戰,因為提高可讀性、複雜格式設定和版面配置控件的需求,以及應用程式必須顯示的多種語言支援。 即使是最基本的文字處理系統也必須允許文字輸入、版面配置、顯示、編輯和複製和貼上。 Windows 使用者通常預期比這些基本功能還多,甚至需要簡單的編輯器支援多種字型、各種段落樣式、內嵌影像、拼字檢查和其他功能。 現代UI設計也不再局限於單一格式、純文本,但需要提供更豐富的字型和文字版面配置體驗。
這是 DirectWrite 如何讓 Windows 應用程式增強 UI 和檔的文字體驗的簡介。
改善文字體驗
新式 Windows 應用程式對其 UI 和檔中的文字有複雜的需求。 這些包括更佳的可讀性、對各種語言和腳本的支援,以及更佳的轉譯效能。 此外,大部分現有的應用程式都需要一種方式,才能在 WindowsWin32 程式代碼基底中執行現有的投資。
DirectWrite 提供下列三項功能,可讓 Windows 應用程式開發人員改善其應用程式中的文字體驗:與轉譯系統獨立、高品質印刷樣式和多層功能。
轉譯系統獨立
DirectWrite 獨立於任何特定的圖形技術。 應用程式可以自由使用最適合其需求的轉譯技術。 這可讓應用程式彈性地透過 GDI 和透過 Direct3D 或 Direct2D 繼續轉譯其應用程式的某些部分。 事實上,應用程式可以選擇透過專屬轉譯堆疊轉譯 DirectWrite。
高品質印刷樣式
DirectWrite 利用 OpenType Font 技術的進步,在 Windows 應用程式中啟用高品質的印刷樣式。 DirectWrite 字型系統提供處理字型列舉、字型後援和字型快取的服務,這些字型都是處理字型的應用程式所需的。
DirectWrite 提供的 OpenType 支援可讓開發人員新增至其應用程式的進階印刷樣式功能和國際文字支援。
支援進階印刷樣式功能
DirectWrite 可讓應用程式開發人員解除鎖定無法在 WinForms 或 GDI 中使用的 OpenType 字型功能。 DirectWrite IDWriteTypography 物件會公開 OpenType 字型的許多進階功能,例如文體替代字型和斜體。 Microsoft Windows 軟體開發工具包 (SDK) 提供一組範例 OpenType 字型,其設計具有豐富功能,例如 Pericles 和 Pescadero 字型。 如需 OpenType 功能的詳細資訊,請參閱 OpenType 字型功能。
支援國際文字
DirectWrite 使用 OpenType 字型來啟用國際文字的廣泛支援。 支援代理、BIDI、斷行和UVS等Unicode功能。 語言引導式腳本專案化、數位替代和圖像成形可確保任何腳本中的文字都有正確的版面配置和轉譯。
目前支援下列指令碼︰
注意
對於標示為 *的腳本,沒有預設的系統字型。 應用程式必須安裝支持這些文稿的字型。
- 阿拉伯文
- 亞美尼亞文
- 本加拉
- 波波莫福
- 盲文*
- 加拿大土著語節
- 切 諾 基
- 中文(簡體和繁體)
- 古斯拉夫文
- Coptic*
- 梵文字母
- 埃裡索皮克文
- 喬治亞文
- 格拉戈利特*
- 希臘文
- 古吉拉特文
- 果魯穆奇文
- Hebrew
- 日文
- 坎那達文
- 高棉文
- 韓文
- 寮文
- 拉丁文
- 馬來亞拉姆文
- 蒙古文
- 緬甸
- 新太路
- Ogham*
- 歐迪亞文
- 'Phags-pa
- 符文*
- 僧伽羅文
- 敘利亞文
- 泰樂
- 坦米爾文
- 泰盧固文
- 塔安那文
- 泰文
- 藏文
- 一
多層功能
DirectWrite 提供分解的功能層,每個層會順暢地與下一層互動。 API 設計可讓應用程式開發人員根據其需求和排程,自由和彈性地採用個別層。 下圖顯示這些圖層之間的關聯性。
文字版面配置 API 提供 DirectWrite 提供的最高層級功能。 它為應用程式提供服務,以測量、顯示及與格式豐富的文字字串互動。 此文字 API 可用於目前使用 Win32 的 DrawText 的應用程式,以建置具有豐富格式文字的新式 UI。
實作自己版面配置引擎的文字密集型應用程式可能會使用下一層:腳本處理器。 腳本處理器會將文字區塊細分成腳本區塊,並處理 Unicode 表示法與字型中適當字元表示法之間的對應,讓腳本的文字可以正確地以正確的語言顯示。 文字版面配置 API 層所使用的版面配置系統是以字型和腳本處理系統為基礎。
圖像轉譯層是功能的最低層,可為實作自己的文字版面配置引擎的應用程式提供圖像轉譯功能。 圖像轉譯層也適用於實作自定義轉譯器的應用程式,透過 DirectWrite 文字格式 API 中的回呼函式修改圖像繪製行為。
DirectWrite 字型系統可供所有 DirectWrite 功能層使用,並可讓應用程式存取字型和圖像資訊。 其設計目的是要處理常見的字型技術和數據格式。 DirectWrite 字型模型遵循支援相同字型系列中任意數目粗細、樣式和延展的常見印刷樣式做法。 此模型與 WPF 和 CSS 相同,會指定只有粗體(粗體、淺色等)的字型不同,樣式(直立、斜體或斜體)或延展(窄、凝結、寬等)會被視為單一字型系列的成員。
使用 ClearType 改善文字轉譯
改善螢幕上的可讀性是所有 Windows 應用程式的重要需求。 認知心理學研究的證據表明,我們需要能夠準確地辨識每個字母,甚至字母之間的間距對於快速處理至關重要。 不對稱的字母和字會被視為醜陋,並降低閱讀體驗。 Microsoft Advanced Reading Technologies 群組 Kevin Larson 撰寫了一篇文章,該主題發表在 Spectrum IEEE 中。 本文稱為「文字技術」。
DirectWrite 中的文字會使用 Microsoft ClearType 轉譯,以增強文字的清晰性和可讀性。 ClearType 利用新式 LCD 顯示器對於每個可個別控制的圖元都有 RGB 條紋的事實。 DirectWrite 使用 ClearType 的最新增強功能,第一個隨附於 Windows Vista 與 Windows Presentation Foundation,它不僅能評估個別字母,還能評估字母之間的間距。 在這些 ClearType 增強功能之前,難以顯示大小為 10 或 12 點的文字:我們可以在字母之間放置 1 個圖元,這通常太少,或 2 圖元,這通常是太多。 使用子圖元中的額外解析度可讓我們使用小數間距,以改善整個頁面的偶數和對稱性。
下圖顯示使用子圖元定位時,圖像在任何子圖元界限上可能開始的方式。
下圖是使用未採用子圖元位置的 ClearType 轉譯器 GDI 版本來轉譯。
下圖是使用 ClearType 轉譯器的 DirectWrite 版本來轉譯,其使用子圖元位置。
請注意,字母 h 和 n 之間的間距在第二個影像中比較均勻,而字母 o 會從字母 n 進一步間距,甚至與字母 l 更相等。 另請注意字母 l 上的字幹看起來更自然。
Subpixel ClearType 定位在畫面上提供最精確的字元間距,特別是在小尺寸時,子圖元與整個圖元之間的差異代表圖像寬度的顯著比例。 它可讓文字以理想的解析度空間測量,並在液晶色條的自然位置轉譯,並具有子圖元粒度。 根據定義,使用這項技術測量和轉譯的文字與解析度無關,這表示文字的版面配置在各種顯示器解析度的範圍中達成完全相同。
與任一類型的 GDI ClearType 轉譯不同,子圖元 ClearType 提供最精確的字元寬度。
根據預設,文字字串 API 會採用子圖元文字轉譯,這表示它會以與目前顯示解析度無關的理想解析度測量文字,並根據真正縮放的圖像進階寬度和定位位移來產生圖像定位結果。
對於大型文字, DirectWrite 也允許沿著 Y 軸進行反鋸齒,讓邊緣更流暢,並轉譯字母做為字型設計工具的用途。 下圖顯示 Y 方向的消除鋸齒。
雖然 DirectWrite 文字預設會使用子圖元 ClearType 定位和轉譯,但其他轉譯選項可供使用。 許多現有的應用程式會使用 GDI 來轉譯大部分的 UI,有些應用程式會使用系統編輯控件來繼續使用 GDI 進行文字轉譯。 將 DirectWrite 文字新增至這些應用程式時,可能需要犧牲子圖元 ClearType 所提供的閱讀體驗改進,讓文字在應用程式上具有一致的外觀。
為了符合這些需求, DirectWrite 也支援下列轉譯選項:
- 子圖元 ClearType (預設值)。
- 水平和垂直維度中有反鋸齒的子圖元 ClearType。
- 別名文字。
- GDI 自然寬度(例如,由 Microsoft Word 閱讀檢視使用)。
- GDI 相容寬度(包括東亞內嵌位圖)。
每個轉譯模式都可以透過 DirectWrite API 和新的 Windows 7 收件匣 ClearType 微調器微調。
注意
從 Windows 8 開始,您應該在大部分情況下使用灰階文字反鋸齒。 如需詳細資訊,請參閱下一章節。
支援自然版面配置
自然版面配置與解析度無關,因此字元的間距不會隨著您放大或縮小,或視顯示器的 DPI 而定而變更。 次要優點是,間距對字型的設計是正確的。 DirectWrite 對自然轉譯的支援可以進行自然版面配置,這表示個別圖像可以定位為圖元的一小部分。
雖然自然版面配置是預設值,但某些應用程式需要轉譯與 GDI 相同的間距和外觀的文字。 針對這類應用程式,DirectWrite 提供 GDI 傳統和 GDI 自然測量模式和對應的轉譯模式。
上述任何轉譯模式都可以與兩種反鋸齒模式之一結合:ClearType 或灰階。 ClearType 反鋸齒模擬會透過個別操作每個像素的紅色、綠色和藍色值來模擬更高的解析度。 灰階反鋸齒只會計算每個圖元的一個涵蓋範圍(或 Alpha) 值。 ClearType 是預設值,但 Windows 市集應用程式建議使用灰階反鋸齒功能,因為它較快且與標準反鋸齒相容,但仍可讀。
API 概觀
IDWriteFactory 介面是使用 DirectWrite 功能的起點。 Factory 是根物件,可建立一組可以一起使用的物件。
格式化和版面配置作業是作業的必要條件,因為文字必須正確格式化並配置至指定的條件約束集,才能進行繪製或點擊測試。 您可以為此目的使用IDWriteFactory 建立的兩個主要物件是IDWriteTextFormat和IDWriteTextLayout。 IDWriteTextFormat 物件代表文字段落的格式資訊。 IDWriteFactory::CreateTextLayout 函式會採用輸入字串、相關聯的條件約束,例如要填入的空間維度,以及 IDWriteTextFormat 物件,並將完整分析和格式化的結果放入 IDWriteTextLayout 中,以用於後續作業。
然後,應用程式可以使用 Direct2D 提供的 DrawTextLayout 函式,或實作可使用 GDI、Direct2D 或其他圖形系統來轉譯圖像的回呼函式來轉譯文字。 對於單一格式文字,Direct2D 上的 DrawText 函式提供更簡單的方式繪製文字,而不需要先建立 IDWriteTextLayout 物件。
使用 DirectWrite 格式化和繪製 “Hello World”
下列程式代碼範例示範應用程式如何使用IDWriteTextFormat格式化單一段落,並使用 Direct2DDrawText 函式繪製它。
HRESULT DemoApp::DrawHelloWorld(
ID2D1HwndRenderTarget* pIRenderTarget
)
{
HRESULT hr = S_OK;
ID2D1SolidColorBrush* pIRedBrush = NULL;
IDWriteTextFormat* pITextFormat = NULL;
IDWriteFactory* pIDWriteFactory = NULL;
if (SUCCEEDED(hr))
{
hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown**>(&pIDWriteFactory));
}
if(SUCCEEDED(hr))
{
hr = pIDWriteFactory->CreateTextFormat(
L"Arial",
NULL,
DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
10.0f * 96.0f/72.0f,
L"en-US",
&pITextFormat
);
}
if(SUCCEEDED(hr))
{
hr = pIRenderTarget->CreateSolidColorBrush(
D2D1:: ColorF(D2D1::ColorF::Red),
&pIRedBrush
);
}
D2D1_RECT_F layoutRect = D2D1::RectF(0.f, 0.f, 100.f, 100.f);
// Actually draw the text at the origin.
if(SUCCEEDED(hr))
{
pIRenderTarget->DrawText(
L"Hello World",
wcslen(L"Hello World"),
pITextFormat,
layoutRect,
pIRedBrush
);
}
// Clean up.
SafeRelease(&pIRedBrush);
SafeRelease(&pITextFormat);
SafeRelease(&pIDWriteFactory);
return hr;
}
存取字型系統
除了使用上述範例中的IDWriteTextFormat介面來指定文字字串的字型系列名稱之外,DirectWrite 還透過字型列舉提供對字型選取的更多控制,以及根據內嵌檔字型建立自定義字型集合的能力。
IDWriteFontCollection 對像是字型系列集合。 DirectWrite 可讓您透過稱為系統字型集合的特殊字型集合,存取系統上安裝的字型集合。 這是藉由呼叫IDWriteFactory物件的 GetSystemFontCollection 方法取得。 應用程式也可以從應用程式定義回呼所列舉的一組字型建立自定義字型集合,也就是應用程式所安裝的私人字型,或內嵌在檔中的字型。
然後,應用程式可以呼叫 GetFontFamily 以取得集合中的特定 FontFamily 對象,然後呼叫 IDWriteFontFamily::GetFirstMatchingFont 以取得特定的 IDWriteFont 物件。 IDWriteFont 物件代表字型集合中的字型,並公開屬性和一些基本字型計量。
IDWriteFontFace 是另一個物件,代表字型,並在字型上公開一組完整的計量。 IDWriteFontFace 可以直接從字型名稱建立;應用程式不需要取得字型集合即可存取它。 對於需要查詢特定字型詳細數據的 Microsoft Word 等文字版面配置應用程式很有用。
下圖說明這些對象之間的關聯性。
IDWriteFontFace
IDWriteFontFace 物件代表字型,並提供比IDWriteFont物件更詳細的字型相關信息。 來自IDWriteFontFace的字型和圖像計量對於實作文字配置的應用程式很有用。
大部分主流應用程式不會直接使用這些 API,而是會改用 IDWriteFont 或直接指定字型系列名稱。
下表摘要說明這兩個物件的使用案例。
類別 | IDWriteFont | IDWriteFontFace |
---|---|---|
支援用戶互動的 API,例如字型選擇器使用者介面:描述和其他參考 API | 是 | No |
支援字型對應的 API:系列、樣式、粗細、伸展、字元涵蓋範圍 | 是 | No |
DrawText API | 是 | No |
用於轉譯的 API | No | Yes |
用於文字配置的 API:字元計量等等 | No | Yes |
UI 控制件和文字版面配置的 API:全字型計量 | Yes | Yes |
以下是列舉系統字型集合中字型的範例應用程式。
#include <dwrite.h>
#include <string.h>
#include <stdio.h>
#include <new>
// SafeRelease inline function.
template <class T> inline void SafeRelease(T **ppT)
{
if (*ppT)
{
(*ppT)->Release();
*ppT = NULL;
}
}
void wmain()
{
IDWriteFactory* pDWriteFactory = NULL;
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
);
IDWriteFontCollection* pFontCollection = NULL;
// Get the system font collection.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}
UINT32 familyCount = 0;
// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
familyCount = pFontCollection->GetFontFamilyCount();
}
for (UINT32 i = 0; i < familyCount; ++i)
{
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
IDWriteLocalizedStrings* pFamilyNames = NULL;
// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}
UINT32 index = 0;
BOOL exists = false;
wchar_t localeName[LOCALE_NAME_MAX_LENGTH];
if (SUCCEEDED(hr))
{
// Get the default locale for this user.
int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);
// If the default locale is returned, find that locale name, otherwise use "en-us".
if (defaultLocaleSuccess)
{
hr = pFamilyNames->FindLocaleName(localeName, &index, &exists);
}
if (SUCCEEDED(hr) && !exists) // if the above find did not find a match, retry with US English
{
hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists);
}
}
// If the specified locale doesn't exist, select the first on the list.
if (!exists)
index = 0;
UINT32 length = 0;
// Get the string length.
if (SUCCEEDED(hr))
{
hr = pFamilyNames->GetStringLength(index, &length);
}
// Allocate a string big enough to hold the name.
wchar_t* name = new (std::nothrow) wchar_t[length+1];
if (name == NULL)
{
hr = E_OUTOFMEMORY;
}
// Get the family name.
if (SUCCEEDED(hr))
{
hr = pFamilyNames->GetString(index, name, length+1);
}
if (SUCCEEDED(hr))
{
// Print out the family name.
wprintf(L"%s\n", name);
}
SafeRelease(&pFontFamily);
SafeRelease(&pFamilyNames);
delete [] name;
}
SafeRelease(&pFontCollection);
SafeRelease(&pDWriteFactory);
}
文字轉譯
文字轉譯 API 可讓 DirectWrite 字型中的字元轉譯成 Direct2D 表面或 GDI 裝置獨立位圖,或轉換成外框或位圖。 DirectWrite 中的 ClearType 轉譯支援與 Windows 上先前實作相比,具有改善銳度和對比的子圖元定位。 DirectWrite 也支持別名的黑白文字,以支援包含內嵌位圖之東亞字型的案例,或使用者已停用任何類型的字型平滑處理的情況。
所有選項都可透過 DirectWrite API 存取的所有可用 ClearType 旋鈕進行調整,也透過新的 Windows 7 ClearType 微調程式控制面板小程序公開。
有兩個 API 可用於轉譯圖像,一個透過 Direct2D 提供硬體加速轉譯,另一個則提供軟體轉譯至 GDI 位圖。 使用IDWriteTextLayout並實作IDWriteTextRenderer回呼的應用程式可以呼叫這其中一個函式來回應 DrawGlyphRun 回呼。 此外,實作自己版面配置或處理圖像層級數據的應用程式可以使用這些 API。
ID2DRenderTarget::D rawGlyphRun
應用程式可以使用 Direct2D API DrawGlyphRun ,為使用 GPU 轉譯文字提供硬體加速。 硬體加速會影響文字轉譯管線的所有階段,從將圖像合併到圖像執行,以及篩選字元執行位圖,到將 ClearType 混合演算法套用至最終顯示的輸出。 這是建議的 API,可取得最佳的轉譯效能。
IDWriteBitmapRenderTarget::D rawGlyphRun
應用程式可以使用 IDWriteBitmapRenderTarget::D rawGlyphRun 方法,對32-bpp位圖執行圖像執行的軟體轉譯。 IDWriteBitmapRenderTarget 物件會封裝位圖和可用於轉譯字元的記憶體裝置內容。 如果您想要保留 GDI,此 API 會很有用,因為您有在 GDI 中轉譯的現有程式代碼基底。
如果您有使用 GDI 的現有文字版面配置程式代碼的應用程式,而且您想要保留其現有的版面配置程序代碼,但只針對轉譯字元的最後一個步驟使用 DirectWrite,IDWriteGdiInterop::CreateFontFaceFromHdc 會提供兩個 API 之間的網橋。 在呼叫此函式之前,應用程式會使用 IDWriteGdiInterop::CreateFontFaceFromHdc 函式,從裝置內容取得字型臉部參考。
注意
在大部分情況下,應用程式可能不需要使用這些圖像轉譯 API。 應用程式建立IDWriteTextLayout對象之後,可以使用ID2D1RenderTarget::D rawTextLayout方法來轉譯文字。
自定義轉譯模式
許多參數會影響文字轉譯,例如 gamma、ClearType 層級、圖元幾何,以及增強的對比。 轉譯參數是由 物件封裝,其會實作公用 IDWriteRenderingParams 介面。 轉譯參數物件會根據 Windows 7 中 ClearType 控制面板小程式指定的硬體屬性和/或使用者喜好設定,自動初始化。 一般而言,如果用戶端使用 DirectWrite 配置 API,DirectWrite 會自動選取對應至指定測量模式的轉譯模式。
想要更多控件的應用程式可以使用 IDWriteFactory::CreateCustomRenderingParams 來實作不同的轉譯選項。 此函式也可以用來設定伽瑪、像素幾何和增強的對比。
以下是可用的各種轉譯選項:
子圖元消除鋸齒
應用程式會將 renderingMode 參數設定為 DWRITE_RENDERING_MODE_NATURAL,以只在水平維度中使用反鋸齒來指定轉譯。
水平和垂直維度中的子圖元消除鋸齒。
應用程式會將 renderingMode 參數設定為 DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,以在水準和垂直維度中使用反鋸齒來指定轉譯。 這使得曲線和對角線看起來更平滑,代價是一些柔和,通常用於大於 16 ppem 的大小。
別名文字
應用程式會將 renderingMode 參數設定為 DWRITE_RENDERING_MODE_ALIASED,以指定別名文字。
灰階文字
應用程式會將 pixelGeometry 參數設定為DWRITE_PIXEL_GEOMETRY_FLAT來指定灰階文字。
GDI 相容寬度 (包括東亞內嵌點圖)
應用程式會將 renderingMode 參數設定為 DWRITE_RENDERING_MODE_GDI_CLASSIC,以指定 GDI 相容寬度的反鋸齒。
GDI 自然寬度
應用程式會將 renderingMode 參數設定為 DWRITE_RENDERING_MODE_GDI_NATURAL,以指定 GDI 自然寬度相容的反鋸齒。
外框文字
若要以大型大小轉譯,應用程式開發人員可能會偏好使用字型外框來轉譯,而不是將點陣化為位圖。 應用程式會將 renderingMode 參數設定為 DWRITE_RENDERING_MODE_OUTLINE,以指定轉譯應該略過轉譯器,並直接使用外框。
GDI 互操作性
IDWriteGdiInterop 介面提供與 GDI 的互操作性。 這可讓應用程式繼續對 GDI 程式代碼基底的現有投資,並選擇性地使用 DirectWrite 進行轉譯或配置。
以下是可讓應用程式移轉至 GDI 字型系統的 API:
-
建立符合 LOGFONT 結構所指定屬性的 IDWriteFont 物件。
-
根據指定IDWriteFont的 GDI 相容屬性,初始化LOGFONT結構。
-
根據指定IDWriteFontFace的 GDI 兼容屬性,初始化LOGFONT結構。
推論
改善閱讀體驗對用戶來說,無論是在螢幕上還是紙上,都有很大的價值。 DirectWrite 為應用程式開發人員提供易於使用和分層程序設計模型,以改善其 Windows 應用程式的文字體驗。 應用程式可以使用 DirectWrite,透過版面配置 API 為其 UI 和文件轉譯格式豐富的文字。 針對更複雜的案例,應用程式可以直接使用圖像、存取字型等,並利用 DirectWrite 的強大功能來提供高品質的印刷樣式。
DirectWrite 的互操作性功能可讓應用程式開發人員轉送現有的 Win32 程式代碼基底,並在其應用程式中選擇性地採用 DirectWrite。