強大文本佈局 API,支援 WinRT、IE11、Office 2013+,與 Direct2D 緊密配合實現硬件加速渲染。
ComPtr<IDWriteFactory2> factory;
DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(factory), ...);
ComPtr<IDWriteFontCollection> fonts;
factory->GetSystemFontCollection(&fonts);
unsigned count = fonts->GetFontFamilyCount();
for (unsigned i = 0; i < count; ++i) {
ComPtr<IDWriteFontFamily> family;
fonts->GetFontFamily(i, &family);
ComPtr<IDWriteLocalizedStrings> names;
family->GetFamilyNames(&names);
wchar_t locale[LOCALE_NAME_MAX_LENGTH];
GetUserDefaultLocaleName(locale, _countof(locale));
unsigned idx; BOOL exists;
names->FindLocaleName(locale, &idx, &exists);
if (exists) {
wchar_t name[64];
names->GetString(idx, name, 64);
wprintf(L"%s\n", name);
}
}
auto factory = DirectWrite::CreateFactory();
auto fonts = factory.GetSystemFontCollection();
wchar_t locale[LOCALE_NAME_MAX_LENGTH];
GetUserDefaultLocaleName(locale, _countof(locale));
for (auto family : fonts) { // 基於範圍 for,編譯器自動生成迭代器
auto names = family.GetFamilyNames();
unsigned idx;
if (names.FindLocaleName(locale, idx)) {
wchar_t name[64];
names.GetString(idx, name);
wprintf(L"%s\n", name);
}
}
dx.h 封裝 COM 智能指針、錯誤檢查、範圍 for 支持,代碼更清晰安全。
SampleWindow 類持有 DirectWrite::Factory2、set<wstring> m_fonts、迭代器 m_font、字號 m_size。CreateDeviceIndependentResources 建立工廠、枚舉字體名填充 set、創建 TextFormat。CoreWindow::KeyDown 事件處理上下左右鍵:切換字體、調整字號(長按加速)。Draw 方法調用 m_target.DrawText 直接渲染。
m_target.DrawText(text, len, m_textFormat, rect, m_brush, DrawTextOptions::EnableColorFont);


彩色字體自動縮放無失真,DirectWrite + Direct2D + 現代 C++ 讓字體管理煥然一新。