사용자가 그린 컨트롤

.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 개체를 사용하는 방법을 보여 줍니다. 이미 그래픽 표현(예: UserControl 또는 Button)이 있는 클래스에서 상속하고 해당 표현을 렌더링에 통합하지 않으려는 경우 기본 클래스의 OnPaint 메서드를 호출해서는 안 됩니다.

컨트롤의 OnPaint 메서드 코드는 컨트롤을 처음 그릴 때와 컨트롤을 새로 고칠 때마다 실행됩니다. 크기를 조정할 때마다 컨트롤을 다시 그리려면 컨트롤의 생성자에 다음 줄을 추가합니다.

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

참고

Control.Region 속성을 사용하여 직사각형이 아닌 컨트롤을 구현합니다.

참고 항목