使用者自訂描繪控制項

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

控制項小畫家是透過在 控制項 OnPaint 的 方法中執行程式碼來完成。 方法的單 OnPaintPaintEventArgs 引數是 物件,提供轉譯控制項所需的所有資訊和功能。 PaintEventArgs提供 做為屬性兩個主體物件,這些物件將用於控制項的轉譯:

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

  • Graphics object - 封裝數個圖形導向的物件和方法,以提供繪製控制項所需的功能。

如需物件及其使用方式的詳細資訊 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 要繪製的物件,最後在由 和 Size 控制項決定 Location 的矩形中繪製橢圓形。 雖然大部分的轉譯程式碼會比這個複雜得多,但此範例示範 Graphics 如何使用 物件中包含的 PaintEventArgs 物件。 請注意,如果您繼承自已經有圖形表示的類別,例如 UserControlButton ,而且您不想將該標記法併入轉譯中,則不應該呼叫基類的 OnPaint 方法。

控制項方法中的 OnPaint 程式碼會在第一次繪製控制項時執行,每當重新整理時就會執行。 若要確保您的控制項每次調整大小都會重新繪製,請將下列這一行新增至控制項的建構函式:

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

注意

Control.Region使用 屬性來實作非矩形控制項。

另請參閱