尽管 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 属性既可以在运行时设置,也可以在设计时设置,而且这些设置将立即起作用。