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



附件:

  ttc2ttf.rar

posted @ 2011-03-26 11:11  祭天  阅读(9342)  评论(11编辑  收藏  举报