我列舉Windows字體是這樣的:爲什麼FONTSIGNATURE不反映lfCharSet?
LOGFONTW lf = {0};
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfFaceName[0] = L'\0';
lf.lfPitchAndFamily = 0;
::EnumFontFamiliesEx(hdc, &lf,
reinterpret_cast<FONTENUMPROCW>(FontEnumCallback),
reinterpret_cast<LPARAM>(this), 0);
我的回調函數有此簽名:
int CALLBACK FontEnumerator::FontEnumCallback(const ENUMLOGFONTEX *pelf,
const NEWTEXTMETRICEX *pMetrics,
DWORD font_type,
LPARAM context);
TrueType字體,我通常多次獲得每個面的名稱。例如,對於多個呼叫,我會將pelf->elfFullName
和pelf->elfLogFont.lfFaceName
設置爲"Arial"
。仔細查看其他字段,我看到每個電話都是針對不同的腳本。例如,在第一個電話pelf->elfScript
將是"Western"
和pelf->elfLogFont.lfCharSet
將是相當於ANSI_CHARSET
的數字。在第二次電話會議上,我收到"Hebrew"
和HEBREW_CHARSET
。第三次電話"Arabic"
和ARABIC_CHARSET
。等等。到現在爲止還挺好。
但是所有Arial版本的font signature(pMetrics->ntmFontSig
)字段都是相同的。事實上,字體簽名聲稱所有這些Arial版本都支持拉丁語-1,希伯來語,阿拉伯語等。
我知道我想繪製的字符串的字符集,所以我試圖基於字體簽名實例化一個適當的字體。由於字體簽名總是匹配,所以即使在顯示希伯來文或阿拉伯文文本時,我總是最終選擇「西方」字體。我使用低級別的Uniscribe API,所以我沒有得到Windows字體鏈接的好處,但我的代碼似乎工作。
lfCharSet
究竟是否帶有任何意義,或者是遺留的神器?我是否應該將lfCharSet
設置爲DEFAULT_CHARSET
並停止擔心每張臉的所有腳本變體?
爲了我的目的,我只關心TrueType和OpenType字體。