使用者自訂描繪控制項

.NET Framework 可讓您輕鬆地開發自己的控制項。 您可以建立使用者控制項,這是一組由程式碼繫結的標準控制項,也可以從頭開始設計自己的控制項。 您甚至可以使用繼承來建立從現有控制項繼承的控制項並新增其固有功能。 無論您使用何種方法,.NET Framework 都會提供功能,為您建立的任何控制項繪製自訂圖形化介面。

控制項的繪製是透過在控制項的 OnPaint 方法中執行程式碼來完成。 OnPaint 方法的單一引數是 PaintEventArgs 物件,可提供轉譯控制項所需的所有資訊和功能。 PaintEventArgs 提供兩個將用於轉譯控制項的主要物件的屬性:

  • ClipRectangle 物件 - 代表要繪製之控制項部分的矩形。 這可以是整個控制項,或控制項的一部分,取決於控制項的繪製方式。

  • 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 屬性來實作非矩形控制項。

另請參閱