首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

借助 C++ 進行 Windows 開發:使用 DirectWrite 和最新 C++ 管理字體

     編輯:關於C++

DirectWrite 簡介

強大文本佈局 API,支援 WinRT、IE11、Office 2013+,與 Direct2D 緊密配合實現硬件加速渲染。

傳統 COM 風格枚舉字體

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);
    }
}

現代 C++ (dx.h) 簡化版

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 支持,代碼更清晰安全。

字體瀏覽器實戰 (WinRT + Direct2D)

  • SampleWindow 類持有 DirectWrite::Factory2、set<wstring> m_fonts、迭代器 m_font、字號 m_size。
  • CreateDeviceIndependentResources 建立工廠、枚舉字體名填充 set、創建 TextFormat。
  • CoreWindow::KeyDown 事件處理上下左右鍵:切換字體、調整字號(長按加速)。
  • Draw 方法調用 m_target.DrawText 直接渲染。

字體瀏覽器

彩色字體支援 (Windows 8.1+)

m_target.DrawText(text, len, m_textFormat, rect, m_brush, DrawTextOptions::EnableColorFont);

Emoji 字體

放大彩色字體

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved