Windows Forms 컨트롤 렌더링Rendering a Windows Forms Control

렌더링을 사용자의 화면에 시각적 표현을 만드는 프로세스를 가리킵니다.Rendering refers to the process of creating a visual representation on a user's screen. Windows Forms 렌더링을 위한 GDI (새 Windows 그래픽 라이브러리)을 사용합니다.Windows Forms uses GDI (the new Windows graphics library) for rendering. GDI에 대 한 액세스를 제공 하는 관리 되는 클래스에는 System.Drawing 네임 스페이스 및 해당 하위 네임 스페이스입니다.The managed classes that provide access to GDI are in the System.Drawing namespace and its subnamespaces.

컨트롤 렌더링에는 다음 요소가 관련 됩니다.The following elements are involved in control rendering:

  • 기본 클래스에서 제공 하는 그리기 기능 System.Windows.Forms.Control합니다.The drawing functionality provided by the base class System.Windows.Forms.Control.

  • GDI 그래픽 라이브러리의 필수 요소입니다.The essential elements of the GDI graphics library.

  • 기 하 도형 그리기 영역입니다.The geometry of the drawing region.

  • 그래픽 리소스를 해제 하기 위한 절차입니다.The procedure for freeing graphics resources.

컨트롤에서 제공 하는 그리기 기능Drawing Functionality Provided by Control

기본 클래스 Control 그리기 기능을 통해 제공 해당 Paint 이벤트입니다.The base class Control provides drawing functionality through its Paint event. 컨트롤을 발생 시킵니다는 Paint 표시를 업데이트 해야 할 때마다 이벤트입니다.A control raises the Paint event whenever it needs to update its display. .NET Framework의 이벤트에 대 한 자세한 내용은 참조 하세요. 이벤트 처리 및 발생합니다.For more information about events in the .NET Framework, see Handling and Raising Events.

이벤트 데이터 클래스를 Paint 이벤트 PaintEventArgs, 필요한 컨트롤을 그리기 위한 데이터가 들어-그래픽 개체와를 그릴 영역을 나타내는 사각형 개체에 대 한 핸들입니다.The event data class for the Paint event, PaintEventArgs, holds the data needed for drawing a control — a handle to a graphics object and a rectangle object that represents the region to draw in. 이러한 개체에 표시 됩니다 다음 코드 조각에서 굵게 표시 합니다.These objects are shown in bold in the following code fragment.

Public Class PaintEventArgs  
   Inherits EventArgs  
   Implements IDisposable  
  
   Public ReadOnly Property ClipRectangle() As System.Drawing.Rectangle  
      ...  
   End Property  
  
   Public ReadOnly Property Graphics() As System.Drawing.Graphics  
      ...  
   End Property  
   ' Other properties and methods.  
   ...  
End Class  
public class PaintEventArgs : EventArgs, IDisposable {  
public System.Drawing.Rectangle ClipRectangle {get;}  
public System.Drawing.Graphics Graphics {get;}  
// Other properties and methods.  
...  
}  

Graphics 이 항목의 뒷부분에 나오는 GDI의 토론에 설명 된 대로 그리기 기능을 캡슐화 하는 관리 되는 클래스입니다.Graphics is a managed class that encapsulates drawing functionality, as described in the discussion of GDI later in this topic. ClipRectangle 의 인스턴스는 Rectangle 구조 및 컨트롤을 그릴 수 있는 사용 가능한 영역을 정의 합니다.The ClipRectangle is an instance of the Rectangle structure and defines the available area in which a control can draw. 컨트롤 개발자를 계산할 수 있습니다 합니다 ClipRectangle 를 사용 하 여는 ClipRectangle 이 항목의 뒷부분에 기 하 도형에 대 한 설명에 설명 된 대로 컨트롤의 속성입니다.A control developer can compute the ClipRectangle using the ClipRectangle property of a control, as described in the discussion of geometry later in this topic.

컨트롤을 재정의 하 여 렌더링 논리를 제공 해야 합니다 OnPaint 에서 상속 하는 메서드 Control합니다.A control must provide rendering logic by overriding the OnPaint method that it inherits from Control. OnPaint 액세스 graphics 개체를 통해를 그릴 사각형을 가져옵니다는 GraphicsClipRectangle 의 속성을 PaintEventArgs 인스턴스에 전달 합니다.OnPaint gets access to a graphics object and a rectangle to draw in through the Graphics and the ClipRectangle properties of the PaintEventArgs instance passed to it.

Protected Overridable Sub OnPaint(pe As PaintEventArgs)  
protected virtual void OnPaint(PaintEventArgs pe);  

OnPaint 메서드는 기본 Control 클래스는 그리기 기능을 구현 하지 않습니다 하지만 단순히 등록 된 이벤트 대리자를 호출 합니다 Paint 이벤트입니다.The OnPaint method of the base Control class does not implement any drawing functionality but merely invokes the event delegates that are registered with the Paint event. 재정의 하는 경우 OnPaint, 일반적으로 호출 해야 합니다 OnPaint 대리자를 등록 하는 기본 클래스의 메서드를 수신 합니다 Paint 이벤트입니다.When you override OnPaint, you should typically invoke the OnPaint method of the base class so that registered delegates receive the Paint event. 하지만 해당 전체 화면을 그리는 컨트롤 기본 클래스를 호출 하지 않아야 OnPaint처럼 깜박임을 도입 되었습니다.However, controls that paint their entire surface should not invoke the base class's OnPaint, as this introduces flicker. 재정의 하는 예는 OnPaint 이벤트에 참조를 방법: 진행률을 보여 주는 Windows Forms 컨트롤 만들기합니다.For an example of overriding the OnPaint event, see the How to: Create a Windows Forms Control That Shows Progress.

참고

호출 하지 마십시오 OnPaint 직접 프로그램 컨트롤에서 대신 호출 합니다 Invalidate 메서드 (에서 상속 Control) 또는 일부 다른 메서드를 호출 하는 Invalidate합니다.Do not invoke OnPaint directly from your control; instead, invoke the Invalidate method (inherited from Control) or some other method that invokes Invalidate. 합니다 Invalidate 메서드 호출 OnPaint합니다.The Invalidate method in turn invokes OnPaint. 합니다 Invalidate 메서드 오버 로드 하 고 제공 된 인수에 따라 Invalidate e, 일부 또는 전체 화면 영역의 컨트롤을 다시 그립니다.The Invalidate method is overloaded, and, depending on the arguments supplied to Invalidate e, a control redraws either some or all of its screen area.

기본 Control 그리기에 대 한 유용한 다른 메서드를 정의 하는 클래스-는 OnPaintBackground 메서드.The base Control class defines another method that is useful for drawing — the OnPaintBackground method.

Protected Overridable Sub OnPaintBackground(pevent As PaintEventArgs)  
protected virtual void OnPaintBackground(PaintEventArgs pevent);  

OnPaintBackground 배경을 그리는 (함으로써 셰이프) 창의 하는 동안 빠른 되도록 보장 하 고 OnPaint 세부 정보를 그리는 및 개별 그리기 요청을 하나로 결합 됩니다 때문에 속도가 느려질 수 있습니다 Paint 되어야 하는 모든 영역을 포함 하는 이벤트 다시 그려집니다.OnPaintBackground paints the background (and thereby the shape) of the window and is guaranteed to be fast, while OnPaint paints the details and might be slower because individual paint requests are combined into one Paint event that covers all areas that have to be redrawn. 호출 하는 것이 좋습니다는 OnPaintBackground 예를 들어, 컨트롤의 배경 그라데이션 색을 그리는 하려는 경우.You might want to invoke the OnPaintBackground if, for instance, you want to draw a gradient-colored background for your control.

하는 동안 OnPaintBackground 이벤트와 같은 용어는 있고와 동일한 인수를 사용 합니다 OnPaint 메서드를 OnPaintBackground true 이벤트 메서드가 아닙니다.While OnPaintBackground has an event-like nomenclature and takes the same argument as the OnPaint method, OnPaintBackground is not a true event method. 방법이 없는 PaintBackground 이벤트 및 OnPaintBackground 이벤트 대리자를 호출 하지 않습니다.There is no PaintBackground event and OnPaintBackground does not invoke event delegates. 재정의 하는 경우는 OnPaintBackground 메서드를 파생된 클래스는 호출할 필요가 없습니다를 OnPaintBackground 기본 클래스의 메서드.When overriding the OnPaintBackground method, a derived class is not required to invoke the OnPaintBackground method of its base class.

GDI + 기본 사항GDI+ Basics

Graphics 클래스는 메서드 원, 삼각형, 원호 및 타원과 같은 다양 한 도형을 그리는 데 뿐만 아니라 텍스트를 표시 하기 위한 메서드를 제공 합니다.The Graphics class provides methods for drawing various shapes such as circles, triangles, arcs, and ellipses, as well as methods for displaying text. System.Drawing 네임 스페이스 및 해당 하위 네임 스페이스 (원, 사각형, 원호 및 기타) 셰이프, 색, 글꼴, 브러시, 등과 같은 그래픽 요소를 캡슐화 하는 클래스를 포함 합니다.The System.Drawing namespace and its subnamespaces contain classes that encapsulate graphics elements such as shapes (circles, rectangles, arcs, and others), colors, fonts, brushes, and so on. GDI에 대 한 자세한 내용은 참조 하세요. 관리 되는 그래픽 클래스를 사용 하 여입니다.For more information about GDI, see Using Managed Graphics Classes. GDI의 essentials에도 나와 방법: 진행률을 보여 주는 Windows Forms 컨트롤 만들기합니다.The essentials of GDI are also described in the How to: Create a Windows Forms Control That Shows Progress.

기 하 도형 그리기 영역의Geometry of the Drawing Region

ClientRectangle 사용자의 화면에서 컨트롤에 사용할 수 있는 사각형 영역을 지정 하는 컨트롤의 속성 동안 합니다 ClipRectangle 의 속성 PaintEventArgs 그리고 실제로 있는 영역을 지정 합니다.The ClientRectangle property of a control specifies the rectangular region available to the control on the user's screen, while the ClipRectangle property of PaintEventArgs specifies the area that is actually painted. (그리기 수행 되도록 해야 합니다 Paint 이벤트 메서드를는 PaintEventArgs 인수로 인스턴스).(Remember that painting is done in the Paint event method that takes a PaintEventArgs instance as its argument). 컨트롤의 표시 변경의 경우 때 작은 섹션에서 사용 가능한 영역의 부분만 그릴 컨트롤을 해야 합니다.A control might need to paint only a portion of its available area, as is the case when a small section of the control's display changes. 이러한 상황에서는 컨트롤 개발자 그리고에 전달 하 여 실제 사각형을 계산 해야 Invalidate합니다.In those situations, a control developer must compute the actual rectangle to draw in and pass that to Invalidate. 오버 로드 된 버전의 Invalidate 사용 하는 Rectangle 또는 Region 인수로 사용 하 여 인수에 지정 된 생성 합니다 ClipRectangle 속성의 PaintEventArgs합니다.The overloaded versions of Invalidate that take a Rectangle or Region as an argument use that argument to generate the ClipRectangle property of PaintEventArgs.

다음 코드 조각 표시 하는 방법을 FlashTrackBar 사용자 지정 컨트롤 그릴 사각형 영역을 계산 합니다.The following code fragment shows how the FlashTrackBar custom control computes the rectangular area to draw in. 합니다 client 변수 나타냅니다는 ClipRectangle 속성입니다.The client variable denotes the ClipRectangle property. 전체 샘플을 참조 하세요. 방법: 진행률을 보여 주는 Windows Forms 컨트롤 만들기합니다.For a complete sample, see How to: Create a Windows Forms Control That Shows Progress.

Rectangle invalid = new Rectangle(
    client.X + min, 
    client.Y, 
    max - min, 
    client.Height);

Invalidate(invalid);
Dim invalid As Rectangle = New Rectangle( _
    client.X + lmin, _
    client.Y, _
    lmax - lmin, _
    client.Height)

Invalidate(invalid)

그래픽 리소스를 해제합니다.Freeing Graphics Resources

그래픽 개체는 시스템 리소스를 사용 하기 때문에 비용이 많이 드는입니다.Graphics objects are expensive because they use system resources. 이러한 개체의 인스턴스를 포함 합니다 System.Drawing.Graphics 클래스의 인스턴스 뿐만 아니라 System.Drawing.Brush, System.Drawing.Pen, 및 기타 그래픽 클래스입니다.Such objects include instances of the System.Drawing.Graphics class as well as instances of System.Drawing.Brush, System.Drawing.Pen, and other graphics classes. 필요 하 고 해제 하는 경우에 그래픽 리소스를 만들어야 하는 해당 사용을 마친 후 즉시 합니다.It is important that you create a graphics resource only when you need it and release it soon as you are finished using it. 구현 하는 형식을 만드는 경우 합니다 IDisposable 인터페이스를 호출 해당 Dispose 완료 했으면이 사용 하 여 리소스를 확보 하기 위해 메서드.If you create a type that implements the IDisposable interface, call its Dispose method when you are finished with it in order to free resources.

다음 코드 조각 표시 하는 방법을 FlashTrackBar 사용자 지정 컨트롤을 만들고 릴리스를 Brush 리소스입니다.The following code fragment shows how the FlashTrackBar custom control creates and releases a Brush resource. 전체 소스 코드를 참조 하세요. 방법: 진행률을 보여 주는 Windows Forms 컨트롤 만들기합니다.For the complete source code, see How to: Create a Windows Forms Control That Shows Progress.

private Brush baseBackground = null;
Private baseBackground As Brush
base.OnPaint(e);
if (baseBackground == null) {
    if (showGradient) {
        baseBackground = new LinearGradientBrush(new Point(0, 0),
                                                 new Point(ClientSize.Width, 0),
                                                 StartColor,
                                                 EndColor);
    }
    else if (BackgroundImage != null) {
        baseBackground = new TextureBrush(BackgroundImage);
    }
    else {
        baseBackground = new SolidBrush(BackColor);
    }
}
MyBase.OnPaint(e)

If (baseBackground Is Nothing) Then

    If (myShowGradient) Then
        baseBackground = New LinearGradientBrush(New Point(0, 0), _
                                                 New Point(ClientSize.Width, 0), _
                                                 StartColor, _
                                                 EndColor)
    ElseIf (BackgroundImage IsNot Nothing) Then
        baseBackground = New TextureBrush(BackgroundImage)
    Else
        baseBackground = New SolidBrush(BackColor)
    End If

End If
protected override void OnResize(EventArgs e) {
    base.OnResize(e);
    if (baseBackground != null) {
        baseBackground.Dispose();
        baseBackground = null;
    }
}
Protected Overrides Sub OnResize(ByVal e As EventArgs)
    MyBase.OnResize(e)
    If (baseBackground IsNot Nothing) Then
        baseBackground.Dispose()
        baseBackground = Nothing
    End If
End Sub

참고자료See also