ユーザー描画コントロール

.NET Framework には、独自のコントロールを簡単に開発する機能が用意されています。 コードによって結び付けられた標準コントロールのセットであるユーザー コントロールを作成することも、独自のコントロールを最初からデザインすることもできます。 継承を使用することで、既存のコントロールから継承してコントロールを作成し、固有の機能を追加することもできます。 どの方法を使用する場合でも、.NET Framework により、作成するコントロール用のカスタム グラフィカル インターフェイスを描画するための機能が提供されます。

コントロールの描画は、コントロールの OnPaint メソッドでコードを実行することによって実現されます。 OnPaint メソッドの 1 つの引数である PaintEventArgs オブジェクトを使用して、コントロールをレンダリングするために必要なすべての情報と機能を提供します。 PaintEventArgs で、コントロールのレンダリングで使用される 2 つのプリンシパル オブジェクトをプロパティとして提供します。

  • 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 プロパティを使用します。

関連項目