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 graphics library)를 사용 하 여 렌더링 합니다.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

기본 클래스 ControlPaint 이벤트를 통해 그리기 기능을 제공 합니다.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 이벤트에 대 한 이벤트 데이터 클래스는 컨트롤을 그리는 데 필요한 데이터, 즉 그래픽 개체에 대 한 핸들과 그릴 영역을 나타내는 사각형 개체를 보유 합니다. PaintEventArgsThe 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 있는 geometry의 설명에 설명 된 대로 컨트롤의 속성을 사용 하 여를 계산할 수 있습니다.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및에 전달 된 PaintEventArgs 인스턴스의 속성을통해그릴사각형및그래픽개체에대한액세스를가져옵니다.ClipRectangle GraphicsOnPaint 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 Paint 클래스의 메서드는 그리기 기능을 구현 하지 않지만 단순히 이벤트에 등록 된 이벤트 대리자를 호출 합니다. ControlThe 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 e제공 된 인수에 따라 컨트롤이 화면 영역의 일부 또는 전체를 다시 그립니다. InvalidateThe 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.

에는 이벤트와 유사한 명명법이 있고 OnPaint 메서드와 동일한 인수를 사용 하지만 OnPaintBackground 는 진정한 이벤트 메서드가 아닙니다. OnPaintBackgroundWhile OnPaintBackground has an event-like nomenclature and takes the same argument as the OnPaint method, OnPaintBackground is not a true event method. 이벤트는 없으며 PaintBackground이벤트대리자 를호출하지않습니다.OnPaintBackgroundThere 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 의 속성은 사용자 화면에서 컨트롤에 사용할 수 있는 사각형 영역을 지정 하는 반면의 PaintEventArgs 속성 ClipRectangle 은 실제로 그려지는 영역을 지정 합니다.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 PaintEventArgs ClipRectangle 를 인수로 사용 하는의 오버 로드 된 버전은 해당 인수를 사용 하 여의 속성을 생성 합니다. RegionThe 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