Building Controls That Draw Themselves Building Nonrectangular Controls

234 Figure 5-33. Using a custom control

5.6.2 Building Controls That Draw Themselves

Adding constituent controls to a user control is just one way to make a custom control. Another way is to draw the user interface of the control directly onto the controls surface. Ex am ple 5- 6 shows the definition of a control that draws its own albeit simple user interface. Figur e 5- 34 shows the control after it has been placed on a form in design mode in the Windows Forms Designer. Example 5-6. A control that renders itself Public Class MyControl Inherits UserControl Protected Overrides Sub OnPaintByVal e As PaintEventArgs e.Graphics.FillEllipseNew SolidBrushMe.ForeColor, _ Me.ClientRectangle End Sub Public Sub New Me.ResizeRedraw = True End Sub End Class Figure 5-34. The MyControl control as it appears on a form in the Windows Forms Designer The control in this example overrides the OnPaint method declared in the Control class. Windows invokes the OnPaint method whenever the control needs repainting. The PaintEventArgs object passed to the OnPaint method provides information useful within the OnPaint method. The PaintEventArgs type was discussed in detail in Chapt er 4 under Sect ion 4.6 . The OnPaint method in Ex am ple 5- 6 draws an ellipse sized to fill the client area of the control. Setting the controls ResizeRedraw property to True causes the OnPaint method to be called whenever the control is resized. Because the appearance of the control in Ex am ple 5- 6 depends on 235 the size of the control, the controls constructor sets the ResizeRedraw property to True . When ResizeRedraw is False the default, resizing the control does not cause the OnPaint method to be called. Although the code in Ex am ple 5- 6 was built by hand, the OnPaint method can also be added by hand to the code built by the Windows Forms Designer. In addition, the techniques of using constituent controls and drawing directly on the user control can both be used within the same user control.

5.6.3 Building Nonrectangular Controls

User controls are rectangular by default, but controls having other shapes can be made by setting the controls Region property. The Region property accepts a value of type Region defined in the System.Drawing namespace. Objects of type Region define complex areas and are commonly used for window clipping. Consider again Ex am ple 5- 6 and Figur e 5- 34 . Notice in Figur e 5- 34 that the grid dots on the form do not show through the background of the control. Ex am ple 5- 7 shows how to clip the area of the control to match the ellipse being drawn in the OnPaint method. It is based on Ex am ple 5- 6 , with new code shown in bold. Example 5-7. Clipping the area of a control Assumes Imports System.Drawing.Drawing2D Public Class MyControl Inherits UserControl Private Function CreateRegion As Region Dim gp As New GraphicsPath gp.AddEllipseMe.ClientRectangle Dim rgn As New Regiongp Return rgn End Function Protected Overrides Sub OnResizeByVal e As EventArgs Me.Region = Me.CreateRegion End Sub Protected Overrides Sub OnPaintByVal e As PaintEventArgs e.Graphics.FillEllipseNew SolidBrushMe.ForeColor, _ Me.ClientRectangle End Sub Public Sub New Me.ResizeRedraw = True End Sub End Class The CreateRegion method in Ex am ple 5- 7 creates a region in the shape of an ellipse sized to fill the client area of the control. To create nonrectangular regions, you must instantiate a GraphicsPath object, use the drawing methods of the GraphicsPath class to define a complex shape within the GraphicsPath object, and then instantiate a Region object, initializing it from the GraphicsPath object. Ex am ple 5- 7 calls the GraphicsPath classs AddEllipse method to create an ellipse within the GraphicsPath object. Additional methods could be called to add more shapes including line-drawn shapes to the GraphicsPath object. The OnResize method in Ex am ple 5- 7 ensures that the controls Region property is reset every time the control is resized. Figur e 5- 35 shows the control after it has been placed on a form in design mode in the Windows Forms Designer. Note that the grid dots now show through the corners of the control. This clipped area is no longer considered part of the control. If the user clicks on this area, the click passes through to the object underneath the control in this case, the form. 236 Figure 5-35. A control with its Region property set to clip everything outside of the ellipse

5.7 Summary