ユーザー描画コントロールUser-Drawn Controls

.NET Framework には、独自のコントロールを簡単に開発する機能が用意されています。The .NET Framework provides you with the ability to easily develop your own controls. コードによって連結された一連の標準コントロールであるユーザーコントロールを作成することも、独自のコントロールを最初からデザインすることもできます。You can create a user control, which is a set of standard controls bound together by code, or you can design your own control from the ground up. 継承を使用して、既存のコントロールから継承し、固有の機能に追加するコントロールを作成することもできます。You can even use inheritance to create a control that inherits from an existing control and add to its inherent functionality. どのような方法を使用する場合でも、.NET Framework は、作成するコントロールのカスタムグラフィカルインターフェイスを描画する機能を提供します。Whatever approach you use, the .NET Framework provides the functionality to draw a custom graphical interface for any control you create.

コントロールを描画するには、コントロールOnPaintのメソッドでコードを実行します。Painting of a control is accomplished by the execution of code in the control's OnPaint method. OnPaintメソッドの1つの引数PaintEventArgsは、コントロールを表示するために必要なすべての情報と機能を提供するオブジェクトです。The single argument of the OnPaint method is a PaintEventArgs object that provides all of the information and functionality required to render your control. PaintEventArgs 、コントロールのレンダリングで使用される2つのプリンシパルオブジェクトをプロパティとして提供します。The PaintEventArgs provides as properties two principal objects that will be used in the rendering of your control:

  • ClipRectangleobject-描画されるコントロールの部分を表す四角形。ClipRectangle object - the rectangle that represents the part of the control that will be drawn. コントロール全体、またはコントロールの描画方法に応じたコントロールの一部を指定できます。This can be the entire control, or part of the control depending on how the control is drawn.

  • Graphicsobject-コントロールを描画するために必要な機能を提供する複数のグラフィックス指向オブジェクトおよびメソッドをカプセル化します。Graphics object - encapsulates several graphics-oriented objects and methods that provide the functionality necessary to draw your control.

Graphicsオブジェクトとその使用方法の詳細については、「 方法:描画用のグラフィックスオブジェクトを作成します。For more information on the Graphics object and how to use it, see How to: Create Graphics Objects for Drawing.

イベントは、画面上でコントロールが描画またはリフレッシュされるたびに発生ClipRectangleし、オブジェクトは描画が行われる四角形を表します。 OnPaintThe OnPaint event is fired whenever the control is drawn or refreshed on the screen, and the ClipRectangle object represents the rectangle in which painting will take place. コントロール全体を更新する必要がある場合、 ClipRectangleはコントロール全体のサイズを表します。If the entire control needs to be refreshed, the ClipRectangle will represent the size of the entire control. ただし、コントロールの一部だけを更新する必要がある場合、 ClipRectangleオブジェクトは再描画する必要がある領域のみを表します。If only part of the control needs to be refreshed, however, the ClipRectangle object will represent only the region that needs to be redrawn. このような場合の例として、コントロールがユーザーインターフェイスの別のコントロールまたはフォームによって部分的に隠されている場合があります。An example of such a case would be when a control was partially obscured by another control or form in the user interface.

Controlクラスから継承する場合は、 OnPaintメソッドをオーバーライドし、内にグラフィックスレンダリングコードを提供する必要があります。When inheriting from the Control class, you must override the OnPaint method and provide graphics-rendering code within. ユーザーコントロールまたは継承されたコントロールにカスタムグラフィカルインターフェイスを提供する場合は、 OnPaintメソッドをオーバーライドすることによってもできます。If you want to provide a custom graphical interface to a user control or an inherited control, you can also do so by overriding the OnPaint method. 次に例を示します。An example is shown below:

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));  
   }
}  

前の例では、非常に単純なグラフィカル表示を使用してコントロールを表示する方法を示しています。The preceding example demonstrates how to render a control with a very simple graphical representation. 基底クラスのOnPaintメソッドを呼び出し、描画に使用するオブジェクトPenを作成します。最後に、コントロールのLocationSizeによって決定される四角形に楕円を描画します。It calls the OnPaint method of the base class, it creates a Pen object with which to draw, and finally draws an ellipse in the rectangle determined by the Location and Size of the control. ほとんどのレンダリングコードは、これよりもかなり複雑になりますが、この例でGraphicsは、 PaintEventArgsオブジェクト内に含まれるオブジェクトの使用方法を示しています。Although most rendering code will be significantly more complicated than this, this example demonstrates the use of the Graphics object contained within the PaintEventArgs object. UserControlまたOnPaintButtonのように、既にグラフィック表示を使用しているクラスから継承していて、レンダリングにその表現を組み込む必要がない場合は、基底クラスのb.Note that if you are inheriting from a class that already has a graphical representation, such as UserControl or Button, and you do not wish to incorporate that representation into your rendering, you should not call your base class's OnPaint method.

コントロールのOnPaintメソッドのコードは、コントロールが最初に描画されたときと、コントロールが更新されるたびに実行されます。The code in the OnPaint method of your control will execute when the control is first drawn, and whenever it is refreshed. コントロールがサイズ変更されるたびに再描画されるようにするには、コントロールのコンストラクターに次の行を追加します。To ensure that your control is redrawn every time it is resized, add the following line to the constructor of your control:

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

注意

四角形以外Control.Regionのコントロールを実装するには、プロパティを使用します。Use the Control.Region property to implement a non-rectangular control.

関連項目See also