在用户控件中添加 Font 对象

尽管 UserControl 对象有一个 Font 属性,但是在某些方案中,有必要实现一个自己的 Font 对象。例如,如果希望控件的最终用户能够在程序运行时选择一种字体,那么标准的 Font 属性将是无能为力的。

即使 Font 属性已经被显露,而且能够在设计时在“属性”窗口中进行设置,或者在运行时通过代码进行设置,用户控件上显示出来的字体也将是保持不变的。这是因为,控件永远不会接收到关于该属性已经被修改的消息;所以它永远不会为此而触发它的 Paint 事件。

为了解决这个问题,需要在控件中添加一个自己的 StdFont 对象。StdFont 对象与 UserControl 的 Font 几乎是完全相同的,只有一点区别:它提供了一个 FontChanged 事件。要显露 FontChanged 事件,需要使用 WithEvents 关键字声明它:

Private WithEvents mFont as StdFont

在用户控件的 Initialize 事件中,下列代码创建了 StdFont 对象的一个实例,并把它赋给用户控件的 Font 属性:

Private Sub UserControl_Initialize()
   Set mFont = New StdFont
   Set UserControl.Font = mFont
End Sub

如果需要向外界显露 Font,需要使用一对 Property Let / Property Set 过程:

Public Property Get Font() as StdFont
   Set Font = mFont
End Property

Public Property Set Font (mnewFont as stdFont)
   With mFont
      .Bold = mnewFont.Bold
      .Italic = mnewFont.Italic
      .Name = mnewFont.Name
      .Size = mnewFont.Size
   End With
   PropertyChanged "Font"
End Property

请注意,上面的代码使用 With 分别设置了 StdFont 对象的每一个属性:如果简单地将 mnewFont 赋值给 mFont,那么被修改的将只是缺省的 Name 属性。

另外还需要在 FontChanged 事件中添加代码,重新赋值 StdFont 对象并强制触发一个 Paint 事件:

Private Sub mFont_FontChanged(ByVal PropertyName As String)
   Set UserControl.Font = mFont
   Refresh
End Sub

最后可以在 Paint 事件添加用于显示文本的代码。该文本将按照最新选择的字体进行显示。

Private Sub UserControl_Paint()
   Cls      ' 清除原来显示的内容
   Print "Hello"
End Sub

这样,用户控件的 Font 属性既可以在运行时设置,也可以在设计时设置,而且这些设置将立即起作用。