DBCS 环境下字体、显示和打印的考虑因素

使用为 SBCS 字符设计的字体时,Windows 的 DBCS 版本不会正确显示 DBCS 字符。使用 Visual Basic 英语版本或其它 SBCS 语言版本开发允许 DBCS 的应用程序时,需要改变 Font 对象的 Name 属性。Name 属性决定控件中显示文本的字体、运行时图片中的字体和打印操作中的字体。该属性的缺省值是 Visual Basic 英语版本中的 MS Sans Serif。为在 DBCS 环境中正确显示文本,将设置值改成应用程序在 DBCS 环境下运行时适当的字体。也可能需要通过改变 Font 对象的 Size 属性来改变字体大小。通常,在大字数东亚平台上,应用程序中的文本最好以 9 磅字体显示,而欧洲平台上典型的是 8 磅字体。

同样,通过应用程序打印 DBCS 字符时,也应考虑这些因素。

如何避免改变字体设定值

如果没有允许 DBCS 的字体,或者不知道那一种字体适合于目标平台,可用一些选项来解决这些字体问题。

在 Windows 的繁体汉语、简体汉语和朝鲜语版本中,有一称为字体关联的系统功能。例如,朝鲜语 Windows 中,字体关联自动地将应用程序中的英语字体映射成朝鲜语字体。因此,即使是应用程序使用英语字体,仍然能够显示朝鲜语字符。关联的字体由运行平台的系统注册表中的 \HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\fontassoc
\Associated DefaultFonts 的设置决定。由于有系统支持的字体关联,可以不用改变任何字体设置,而在汉语或朝鲜语平台上运行英语应用程序。其它平台如日语 Windows 没有字体关联。

另一选项是使用 System 字体或 FixedSys 字体。每个平台都可使用这些字体。注意 System 字体和 FixedSys 字体大小不能改变。如果在设计时设置的任何一种字体大小(用 Font 对象的 Size 属性)与使用机器上的字体大小不匹配,则忽略设置值、截断显示文本。

运行时改变字体的操作方法

虽然有上述选项,这些解决方法仍有限制。下面的示例是应用程序在运行时,使用全局解决方法改变其中的字体。下面的代码可在 Windows 的任何语言版本上运行,它决定驻留在系统中的字体,应用程序将在该系统下运行,将适当的字体应用到参数中指定的 Font 对象。

Private Const DEFAULT_CHARSET = 1
Private Const SYMBOL_CHARSET = 2
Private Const SHIFTJIS_CHARSET = 128
Private Const HANGEUL_CHARSET = 129
Private Const CHINESEBIG5_CHARSET = 136
Private Const CHINESESIMPLIFIED_CHARSET = 134
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long

Public Sub SetProperFont(obj As Object)
    On Error GoTo ErrorSetProperFont
    Select Case GetUserDefaultLCID
    Case &H404 ' 繁体中文
        obj.Charset = CHINESEBIG5_CHARSET
        obj.Name = ChrW(&H65B0) + ChrW(&H7D30) + ChrW(&H660E) _
         + ChrW(&H9AD4)   'New Ming-Li
        obj.Size = 9
    Case &H411 ' 日语
        obj.Charset = SHIFTJIS_CHARSET
        obj.Name = ChrW(&HFF2D) + ChrW(&HFF33) + ChrW(&H20) + _
         ChrW(&HFF30) + ChrW(&H30B4) + ChrW(&H30B7) + ChrW(&H30C3) + _
         ChrW(&H30AF)
        obj.Size = 9
    Case &H412 '朝鲜 UserLCID
        obj.Charset = HANGEUL_CHARSET
        obj.Name = ChrW(&HAD74) + ChrW(&HB9BC)
        obj.Size = 9
    Case &H804 ' 简体中文
        obj.Charset = CHINESESIMPLIFIED_CHARSET
        obj.Name = ChrW(&H5B8B) + ChrW(&H4F53)
        obj.Size = 9
    Case Else   ' 其他国家/地区
        obj.Charset = DEFAULT_CHARSET
        obj.Name = ""   ' 获得缺省 UI 字体。
        obj.Size = 8
    End Select
    Exit Sub
ErrorSetProperFont:
    Err.Number = Err

也可更改这个简单的示例代码将字体应用到其它字体设置上,如打印选项。