2010-05-18 65 views
5

鑑於HFONT,我如何判斷它是否是符號字體?我使用的pdf庫需要以不同的方式處理符號字體,所以我需要一種編程方式來判斷給定的字體是否爲符號字體。如何判斷字體是否爲符號字體?

回答

5

使用GetObject將字體的屬性獲取爲LOGFONT結構。檢查lfCharSet成員;如果它是SYMBOL_CHARSET,你有一個符號字體。

+0

Dayum!我只是在閱讀http://msdn.microsoft.com/en-us/library/dd145037%28v=VS.85%29.aspx的LOGFONT頁面,你擊敗了我的答案... – 2010-05-18 22:32:36

+0

這可能是在實踐中是正確的,但理論上它可能會失敗。 GetObject返回用於指定字體的LOGFONT副本。但字體映射器可能會替換不同的字體。雖然它似乎不太可能將文字字體的符號字體(或相反),它可能發生在理論上。因此,您最好檢查由GetTextMetrics返回的TEXTMETRIC中的tmCharSet字段,因爲它應該表示實際字體而不是邏輯字體。 – 2016-04-12 17:48:55

+0

@AdrianMcCarthy我認爲'GetObject'返回實際選擇的字體的'LOGFONT',而不是最初請求的字體;除非您有確鑿的鏈接,否則可能需要進行驗證實驗。如果你認爲'GetTextMetrics'更好,另一個答案是值得歡迎的。 – 2016-04-12 19:44:11

1

馬克蘭索姆的答案將工作99.999%的時間,但有理論上的可能性,它可能會給出錯誤的答案。

爲了避免這種可能性,您應該使用GetTextMetrics來獲取實際字體的TEXTMETRICS,並檢查tmCharSet是否爲SYMBOL_CHARSET

檢查lfCharSettmCharSet有什麼區別?

當您創建HFONT時,Windows將生成LOGFONT的內部副本。它描述了你想要的字體,它可能與你得到的字體不同。

當您在設備(或信息)上下文中選擇HFONT時,字體映射程序將查找與該HFONT相關聯的LOGFONT最匹配的實際字體。然而,最佳匹配可能不完全匹配。因此,當你需要找出有關實際字體的內容時,應該注意查詢HDC而不是HFONT

如果您使用GetObject查詢HFONT,您只需返回原始LOGFONTGetObject不會告訴你有關實際字體的任何內容,因爲它不知道字體映射器選擇(或將選擇)的實際字體。

詢問有關選定到特定DC中​​的字體的API(如GetTextMetricsGetTextFace等)將爲您提供有關實際字體的信息。

對於這個問題,馬克的回答(使用GetObject)可能總是會起作用,因爲字體映射器在您想要文本字體(或反之亦然)時選擇符號字體的機率很小。但是,一般來說,當你想知道關於實際字體的東西時,找一種方法來詢問HDC

相關問題