Winform字体统一方案
在 Winform 程序开发中,要求统一整个UI的字体,否则这个地方是“宋体”,那个地方是“楷体”,感觉很杂乱。
还有一个原因是,当在不同语言环境下,字体名称也会有所不同,就用“mingliu.ttc”作例子,在“中文(PRC)”下为“MingLiU、PMingLiU”;在“中文(香港特别行政区)”下为“細明體、新細明體”。
如果你在“中文(PRC)”下将字体设置为“PMingLiU”,那在“中文(香港特别行政区)”下,则会因为找不到该字体,继而启用系统默认字体,这是很糟糕的事情,因为这种情况下,你程序中 Label 的文本可能会显示不完全或变长覆盖了后面的控件。
同时,考虑到客户端系统中,可能无开发中使用的字体,以及分发安装时的便携性,我采用了附带字体文件,并使用 PrivateFontCollection 类读取字体文件。
一开始我使用 PrivateFontCollection 读取字体文件,然后用 FontFamily 数组的 Index 确定使用哪一个字体,但是在使用中发现了问题:
“中文(PRC)”使用 PrivateFontCollection 读取它后,FontFamily 数组为:
0: MingLiU
1: PMingLiU
“中文(香港特别行政区)”使用 PrivateFontCollection 读取它后,FontFamily 数组为:
0: 新細明體
1: 細明體
你发现了没?序号反了,这样就无法用序号确定用哪一个字体。所以我就用 ttc2ttf 将其分离成单独的 ttf 文件,只用需要的那一个。(工具在最下面有提供下载)
下面是具体实现:
1、Config 文件加入:
<appSettings> <add key="FontFileName" value ="pmingliu.ttf"/> </appSettings>
2、在一个公用文件中加入:
私有全局变量:
Private Shared _pfc As System.Drawing.Text.PrivateFontCollection
静态构造函数:
Shared Sub New() Try _pfc = New System.Drawing.Text.PrivateFontCollection() Dim fontFileName As String = ConfigHelper.GetString("FontFileName") _pfc.AddFontFile(System.IO.Path.Combine(Application.StartupPath, fontFileName)) ClientConfig.MyFont = New Font(_pfc.Families(0), 9.0!) Catch MyFont = System.Drawing.SystemFonts.DefaultFont End Try End Sub
3、顶级父窗体构造函数中加入:
Me.Font = ClientConfig.MyFont
4、清除所有控件的字体格式,如果有设置特殊格式(如大小、加粗等等),则用代码实现。
附 ConfigHelper :
Public Class ConfigHelper Public Shared Function GetString(ByVal key As String) As String Return System.Configuration.ConfigurationManager.AppSettings(key) End Function Public Shared Function GetInteger(ByVal key As String) As Integer Dim value As Integer If (Integer.TryParse(GetString(key), value)) Then Return value Else Return 0 End If End Function Public Shared Function GetDecimal(ByVal key As String) As Decimal Dim value As Decimal If (Decimal.TryParse(GetString(key), value)) Then Return value Else Return 0D End If End Function Public Shared Function GetBoolean(ByVal key As String) As Boolean Dim value As Boolean If (Boolean.TryParse(GetString(key), value)) Then Return value Else Return False End If End Function End Class
附件: