Visual Basic Concepts

Adding a Font Object to Your User Control

Although a UserControl object has a Font property, there are situations where you will need to implement a Font object of your own. For example, if you want to allow the end user of your control to select a font at run time, the standard Font property won't work.

Even though the Font property is exposed and can be set in the Properties window at design time or via code at run time, the font displayed on the user control doesn't change. This is because the control never receives notification that the property has changed; consequently, it never fires its Paint event.

To resolve this problem, you need to add your own StdFont object to the control. The StdFont object is exactly the same as the UserControl Font with one exception — it provides a FontChanged event. You need to declare it using the WithEvents keyword in order to expose the FontChanged event:

Private WithEvents mFont as StdFont

In the Initialize event of your user control, the following code creates an instance of the StdFont object and assigns it to the User Control's Font property:

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

To expose your Font to the outside world, you'll need a Property Let / Property Set pair:

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

Notice that this code uses With to set each property of the StdFont object individually: Simply assigning mnewFont to mFont would only change the default Name property.

You'll also need to add code in the FontChanged event to reassign the StdFont object and to force a Paint event:

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

Finally, in the Paint event you can add code to display text. The text will be displayed in the newly selected font.

Private Sub UserControl_Paint()
   Cls      ' Clear the display
   Print "Hello"
End Sub

Now the Font property of your user control can be set at either design time or at run time and the changes will immediately be visible.