2008-12-31 116 views
5

查找用戶可用的所有系統字體的最佳方法是什麼,以便它們可以顯示在下拉選擇框中?使用Delphi查找系統字體

我還想區分Unicode和非Unicode字體。

我使用的是完全支持Unicode的Delphi 2009,並且希望使用Delphi解決方案。

回答

11

Screen.Fonts屬性通過EnumFontFamiliesEx API function填充。有關調用該函數的示例,請參閱Forms.pas

它調用的回調函數將收到一條TNewTextMetricEx記錄,該記錄的其中一個成員是TFontSignaturefsUsb字段指示字體聲稱支持哪個Unicode子範圍。

系統實際上並沒有「Unicode字體」。即使是其字體中有Unicode的字體也沒有字形全部是 Unicode字符。您可以區分位圖,打印機和TrueType字體,但除此之外,您可以做的最好的方法是確定您正在考慮的字體是否支持您想要的字符。如果字體不是你認爲的「Unicode字體」,但它支持你需要的所有字符,那麼它有什麼不同?要獲取此信息,您可能對GetFontUnicodeRanges感興趣。

Microsoft技術用於根據哪些字體包含哪些字符Uniscribe,特別是font fallback來顯示具有不同字體的文本。我不知道德爾福對Uniscribe的支持。我開始爲它編寫一套導入單元,但是我的興趣是變幻無常的,在完成之前我轉向其他東西。 Michael Kaplan's blog有時會談Uniscribe,所以這是另一個地方。

8

我可以回答你一半的問題,你可以得到的字體列表,當前的環境可以訪問從全局畫面對象的字符串列表

Listbox1.Items.AddStrings(Screen.Fonts); 
4

你可以看看在forms.pas源代碼中查看Codegear如何通過枚舉Windows字體來填充Screen.Fonts。返回的LOGFONT結構有一個字符集成員,但這並不提供簡單的「Unicode」確定。

據我所知,Windows無法明確地告訴你字體是否是'Unicode'。此外,如果您嘗試以「非Unicode」字體顯示Unicode文本,Windows可能會替換爲其他字體,因此很難說字體是否會顯示Unicode。例如,我有一個古代Arial黑色字體文件,其中不包含Unicode字形,但如果我使用此功能在D2009備忘錄中顯示日語文本,則日語會在Arial中正確顯示,其餘的在Arial Black中顯示。在其他例子中,通常的空方塊可能會出現。