DirectWrite 是一種相當強大的文本布局 API
您可以將 DirectWrite 與 Direct
DirectWrite API
我將使用 DirectWrite 探究系統字體集
ComPtr<IDWriteFactory
IDWriteFactory
我將基於前面的 ComPtr 類模板調用 DWriteCreateFactory 函數
HR(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED
__uuidof(factory)
reinterpret_cast<IUnknown **>(factory
DirectWrite 包含一項名為 Windows 字體緩存服務 (FontCache) 的 Windows 服務
在 DirectWrite 工廠對象給定的情況下
ComPtr<IDWriteFontCollection> fonts;
HR(factory
GetSystemFontCollection 方法的第二個參數是可選的
unsigned const count = fonts
然後我使用 GetFontFamily 方法通過從零開始的索引檢索單個字體系列對象
ComPtr<IDWriteFontFamily> family;
HR(fonts
IDWriteFontFamily 接口繼承自 IDWriteFontList 接口
ComPtr<IDWriteLocalizedStrings> names;
HR(family
我也可以枚舉系列名稱
wchar_t locale[LOCALE_NAME_MAX_LENGTH];
VERIFY(GetUserDefaultLocaleName(locale
然後
unsigned index;
BOOL exists;
HR(names
如果請求的區域設置在集中不存在
if (exists)
{
wchar_t name[
HR(names
}
如果擔心長度
圖
ComPtr<IDWriteFactory
HR(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED
__uuidof(factory)
reinterpret_cast<IUnknown **>(factory
ComPtr<IDWriteFontCollection> fonts;
HR(factory
wchar_t locale[LOCALE_NAME_MAX_LENGTH];
VERIFY(GetUserDefaultLocaleName(locale
unsigned const count = fonts
for (unsigned familyIndex =
{
ComPtr<IDWriteFontFamily> family;
HR(fonts
ComPtr<IDWriteLocalizedStrings> names;
HR(family
unsigned nameIndex;
BOOL exists;
HR(names
if (exists)
{
wchar_t name[
HR(names
wprintf(L"%sn"
}
}
最新 C++ 淺談
如果您經常閱讀本雜志
auto factory = CreateFactory();
獲取系統字體集同樣簡單
auto fonts = factory
枚舉此字體集是 dx
for (auto family : fonts)
{
}
這些代碼與以往相同
圖
auto factory = CreateFactory();
auto fonts = factory
wchar_t locale[LOCALE_NAME_MAX_LENGTH];
VERIFY(GetUserDefaultLocaleName(locale
for (auto family : fonts)
{
auto names = family
unsigned index;
if (names
{
wchar_t name[
names
wprintf(L"%sn"
}
}
字體浏覽器與 Windows 運行時
DirectWrite 的作用遠不只是枚舉字體
這些專欄發表後
首先
DirectWrite::Factory
在 SampleWindow CreateDeviceIndependentResources 方法內
m_writeFactory = DirectWrite::CreateFactory();
在這裡我還可以獲取系統字體集和用戶的默認區域設置
auto fonts = m_writeFactory
wchar_t locale[LOCALE_NAME_MAX_LENGTH];
VERIFY(GetUserDefaultLocaleName(locale
我將使應用程序在用戶按下向上和向下箭頭鍵時循環切換字體
set<wstring> m_fonts;
現在
m_fonts
set 填充後
set<wstring>::iterator m_font;
SampleWindow CreateDeviceIndependentResources 方法初始化迭代器並調用 CreateTextFormat 方法
m_font = begin(m_fonts);
CreateTextFormat();
在 Direct
float m_size;
Visual C++ 編譯器很快會允許我初始化像這樣的類內非靜態數據成員
TextFormat m_textFormat;
然後
void CreateTextFormat()
{
m_textFormat = m_writeFactory
}
我已經把它包裝起來
typedef ITypedEventHandler<CoreWindow *
然後
auto __stdcall Invoke(
ICoreWindow *
{
return S_OK;
}
IKeyEventArgs 接口提供的信息與 LPARAM 和 WPARAM 向 WM_KEYDOWN 消息提供的信息基本相同
VirtualKey key;
HR(args
與此類似
CorePhysicalKeyStatus status;
HR(args
為方便用戶
unsigned m_accelerate;
然後
if (!status
{
m_accelerate =
}
else
{
m_accelerate +=
m_accelerate = std::min(
}
我設置了上限
if (VirtualKey_Left == key)
{
m_size = std::max(
}
我很小心
else if (VirtualKey_Right == key)
{
m_size += m_accelerate;
}
接下來
if (begin(m_fonts) == m_font)
{
m_font = end(m_fonts);
}
然後
else if (VirtualKey_Down == key)
{
++m_font;
if (end(m_fonts) == m_font)
{
m_font = begin(m_fonts);
}
}
在這裡
剩下的事情是
wchar_t const text [] = L"The quick brown fox jumps over the lazy dog";
m_target
m_textFormat
RectF(
m_brush);
Direct
圖
彩色字體
Windows
m_target
m_textFormat
RectF(
m_brush);
DrawTextOptions::EnableColorFont);
圖
圖
彩色字體的亮點在於可以自動縮放
圖
通過提供彩色字體
From:http://tw.wingwit.com/Article/program/Web/201405/30797.html