2010-03-11 36 views
7

假設您有一個帶有兩個或更多腳本文本的字符串。當您使用GDI功能(如TextOut)時,Windows的(現代版本)將執行「字體鏈接」。也就是說,GDI會使用您選擇的字體繪製其中的內容,並使用自動選擇的適當字體繪製其餘字體。例如,如果部分文本是英文的(使用羅馬字母),部分文本是中文(使用CJK字符),並且選擇了Arial,則英文部分將以Arial繪製,而中文部分將會用另一種具有CJK字形的字體繪製。是否可以確定Windows爲字體鏈接選擇的字體?

我的問題是,有沒有辦法確定哪些字體TextOut將選擇(或選擇)的字體鏈接?

我不得不用低級別的Uniscribe API來繪製一些文字,它不會自動進行字體鏈接。我已經實現了自己的字體鏈接,但是有時我的算法會選擇與TextOut不同的字體。我試圖更好地理解Windows算法,但我並不擅長識別視覺上的字體(特別是在不熟悉的腳本中)。

回答

2

字體由註冊表項選擇。它在this article.很好的描述引用的相關部分:

如果字體鏈接是您 設備上啓用,您可以通過在 HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\列舉 註冊表項的子項檢查註冊表 Windows NT \ CurrentVersion \ FontLink \ SystemLink 來確定鏈接的 字體到基本字體的映射。您可以使用Regedit添加鏈接 以創建其他 子項。

+3

謝謝,這是一個很好的資源。但是我在另一篇博客中讀到,那些註冊表鍵只是爲了向後兼容,並且它們不再真正驅動字體鏈接。例如,在我的機器上,TextOut將爲不在註冊表中的基本字體進行字體鏈接。而且它也不是字體回退,因爲爲其他腳本選擇的字體根據基本字體而不同。 – 2010-03-11 19:00:09

+0

查看IMLangFontLink:http://msdn.microsoft.com/en-us/library/aa767872%28v=VS.85%29.aspx – 2010-03-11 19:13:41

+0

我在前面的迭代中使用了IMLangFontLink2,但是當我混合LTR腳本時它引發了問題與RTL腳本。我認爲這是一個非常古老的解決方案,它可能仍然是爲了向後兼容。 – 2010-03-11 21:45:35

相關問題