用户绘制的控件

.NET Framework 使你能够轻松开发自己的控件。 可以创建一个用户控件,这是一组由代码绑定在一起的标准控件,也可以从头开始设计自己的控件。 甚至可以使用继承来创建从现有控件继承的控件并添加到其固有功能。 无论使用哪种方法,.NET Framework 都提供为创建的任何控件绘制自定义图形界面的功能。

控件的绘制是通过执行控件的 OnPaint 方法中的代码来完成的。 OnPaint 方法的单个参数是一个 PaintEventArgs 对象,它提供呈现控件所需的所有信息和功能。 PaintEventArgs 提供了两个将用于呈现控件的主要对象作为属性:

  • ClipRectangle 对象 - 表示将要绘制的控件部分的矩形。 这可以是整个控件,也可以是控件的一部分,具体取决于控件的绘制方式。

  • Graphics 对象 - 封装了几个提供绘制控件所需功能的面向图形的对象和方法。

有关 Graphics 对象及其使用方法的详细信息,请参阅如何:创建用于绘制的 Graphics 对象

每当在屏幕上绘制或刷新控件时都会触发 OnPaint 事件,并且 ClipRectangle 对象表示将在其中进行绘制的矩形。 如果需要刷新整个控件,ClipRectangle 将代表整个控件的大小。 但是,如果只需要刷新控件的一部分,则 ClipRectangle 对象将仅表示需要重绘的区域。 这种情况的一个例子是当一个控件被用户界面中的另一个控件或窗体部分遮挡时。

Control 类继承时,必须重写 OnPaint 方法并在其中提供图形呈现代码。 如果要为用户控件或继承的控件提供自定义图形界面,也可以通过重写 OnPaint 方法来实现。 下面显示了一个示例:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)  
   ' Call the OnPaint method of the base class.  
   MyBase.OnPaint(e)  
  
   ' Declare and instantiate a drawing pen.  
   Using myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)  
      ' Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))  
   End Using
End Sub  
protected override void OnPaint(PaintEventArgs e)  
{  
   // Call the OnPaint method of the base class.  
   base.OnPaint(e);  
  
   // Declare and instantiate a new pen.  
   using (System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua))  
   {
      // Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, new Rectangle(this.Location,
         this.Size));  
   }
}  

前面的示例演示了如何使用非常简单的图形表示形式来呈现控件。 它调用基类的 OnPaint 方法,创建一个用于绘制的 Pen 对象,最后在由控件的 LocationSize 确定的矩形中绘制一个椭圆。 尽管大多数呈现代码会比这复杂得多,但此示例演示了如何使用 PaintEventArgs 对象中包含的 Graphics 对象。 请注意,如果从已具有图形表示形式的类(例如 UserControlButton)继承,并且不希望将该表示形式合并到呈现中,则不应调用基类的 OnPaint 方法。

控件的 OnPaint 方法中的代码将在第一次绘制控件以及每次刷新该控件时执行。 若要确保在每次调整控件大小时都重新进行绘制,请将下面的行添加到控件的构造函数中:

SetStyle(ControlStyles.ResizeRedraw, True)  
SetStyle(ControlStyles.ResizeRedraw, true);  

注意

使用 Control.Region 属性实现非矩形控件。

另请参阅