이 문서에서는 사용자 지정 컨트롤을 소개하고 사용자 정의 컨트롤과 어떻게 다른지 설명합니다. 사용자 지정 컨트롤은 시각적 디자인 화면을 제공하지 않으며 사용자가 제공한 코드를 사용하여 직접 그립니다. 이는 여러 컨트롤을 재사용 가능한 단일 단위로 그룹화하기 위한 시각적 디자인 화면을 제공하는 사용자 컨트롤과 다릅니다.
사용자 지정 컨트롤은 기존 컨트롤 또는 사용자 정의 컨트롤이 필요한 UI 또는 대화형 작업을 제공하는 데 가까이 오지 않을 때 사용됩니다. 완전히 구현하려면 더 많은 노력이 필요합니다. 키보드 및 마우스 처리는 여전히 Windows Forms에서 제공되지만 구현할 동작은 사용자에게 맡깁니다. 사용자 지정 컨트롤에는 디자인 표면이 제공되지 않습니다. 이는 모든 그리기가 OnPaint 메서드의 코드를 통해 수행되기 때문입니다. 이와 같은 Timer구성 요소는 여전히 비비전 디자인 화면을 통해 추가할 수 있습니다.
기본 클래스
사용자 지정 컨트롤을 만들 때 선택할 수 있는 두 가지 기본 클래스가 있습니다.
-
이는 다른 Windows Forms 컨트롤에서 사용하는 것과 동일한 기본 클래스입니다. 컨트롤의 입력 및 출력을 직접 제어합니다.
System.Windows.Forms.ScrollableControl
일부 Windows Forms 컨트롤은 이 기본 클래스를 사용합니다. 이 클래스는
Control콘텐츠를 스크롤하는 기능을 추가하여 확장됩니다.
사용자 지정 컨트롤의 내용을 스크롤해야 하는 경우가 아니면 기본 클래스로 사용합니다 Control .
상속된 기능
사용자 지정 컨트롤의 기본 클래스이므로 Control모든 컨트롤에서 공유하는 Windows Forms 기능을 자동으로 상속합니다. 다음은 사용자 지정 컨트롤을 사용하여 얻을 수 있는 몇 가지 기능입니다.
- 키보드 및 마우스 입력.
- 고정 및 도킹과 같은 레이아웃 동작
- 탭을 지원합니다.
- 최소 및 최대 크기 제한.
그리기
컨트롤의 시각적 요소를 그리는 것을 의미하는 페인팅은 OnPaint 메서드를 재정의하여 수행됩니다. 컨트롤에서 페인팅하는 방법에 대한 자세한 내용을 보려면 컨트롤의 페인팅 및 도면을 참조하세요.
Visual Studio 템플릿을 사용하여 사용자 지정 컨트롤을 만들면 OnPaint 메서드가 자동으로 재정의됩니다. 컨트롤을 그리기 위해 코드를 작성해야 하므로 템플릿에서 이 작업을 수행합니다. 템플릿에서 생성하는 예제는 다음과 같습니다.
public partial class CustomControl1 : Control
{
public CustomControl1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class CustomControl1
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
사용자 지정 컨트롤은 OnPaint 메서드를 사용하여 그려집니다. 이 메서드의 유일한 인수는 개체로, 컨트롤을 렌더링하는 데 필요한 모든 정보와 기능을 제공합니다.
PaintEventArgs 에서는 컨트롤을 렌더링하는 데 사용되는 두 가지 속성을 제공합니다.
PaintEventArgs.ClipRectangle- 다시 그려야 하는 컨트롤의 부분을 나타냅니다. 전체 컨트롤 또는 컨트롤의 일부일 수 있습니다.
Graphics- 컨트롤의 그래픽 표면을 나타냅니다. 컨트롤을 그리는 데 필요한 기능을 제공하는 여러 그래픽 지향 개체 및 메서드를 제공합니다.
이 메서드는 OnPaint 화면에서 컨트롤을 그리거나 새로 고칠 때마다 호출되며 PaintEventArgs.ClipRectangle 개체는 그리기 작업이 진행되는 사각형을 나타냅니다. 전체 컨트롤을 새로 고쳐 PaintEventArgs.ClipRectangle 야 하는 경우 전체 컨트롤의 크기를 나타냅니다. 컨트롤의 일부만 새로 고쳐야 하는 경우 다시 그려야 하는 지역만 나타냅니다. 이러한 경우의 예는 컨트롤이 사용자 인터페이스의 다른 컨트롤에 의해 부분적으로 가려지고 다른 컨트롤이 멀리 이동되면 해당 컨트롤 아래에 새로 노출된 부분을 다시 그려야 하는 경우입니다.
컨트롤 메서드의 OnPaint 코드는 컨트롤을 처음 그릴 때와 무효화될 때마다 실행됩니다. 컨트롤의 크기가 조정될 때마다 다시 그려지도록 하려면 컨트롤의 생성자에 다음 줄을 추가합니다.
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)
예시
다음 코드 조각은 컨트롤의 가장자리 주위에 여러 색 사각형을 렌더링하는 사용자 지정 컨트롤입니다.
protected override void OnPaint(PaintEventArgs pe)
{
Rectangle rect = this.ClientRectangle;
// Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
// Otherwise, it kind of overlaps the outside edge.
rect.Width -= 1;
rect.Height -= 1;
Pen[] colorPens = new Pen[] { Pens.Blue, Pens.BlueViolet,
Pens.AliceBlue, Pens.CornflowerBlue,
Pens.Cyan, Pens.DarkCyan };
foreach (Pen pen in colorPens)
{
pe.Graphics.DrawRectangle(pen, rect);
rect.Inflate(-1, -1);
}
// Raise the Paint event so users can custom paint if they want.
base.OnPaint(pe);
}
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim rect As Rectangle = Me.ClientRectangle
'Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
'Otherwise, it kind of overlaps the outside edge.
rect.Width -= 1
rect.Height -= 1
Dim colorPens As Pen() = {Pens.Blue, Pens.BlueViolet,
Pens.AliceBlue, Pens.CornflowerBlue,
Pens.Cyan, Pens.DarkCyan}
For Each curPen As Pen In colorPens
e.Graphics.DrawRectangle(curPen, rect)
rect.Inflate(-1, -1)
Next
'Raise the Paint event so users can custom paint if they want.
MyBase.OnPaint(e)
End Sub
이전 코드는 다음 이미지와 같은 컨트롤을 만듭니다.
배경
코드 SystemColors.Control가 컨트롤을 지우거나 색으로 채우지 않더라도, 컨트롤의 배경은 OnPaint 색으로 그려집니다. 백그라운드는 OnPaintBackground(PaintEventArgs) 메서드에 의해 실제로 그려진 후 OnPaint가 호출됩니다. 컨트롤의 배경을 그리는 작업을 처리하기 위해 OnPaintBackground를 재정의하십시오. 이 메서드의 기본적으로 구현은 BackColor 속성에 의해 설정된 색과 BackgroundImage 속성에 의해 설정된 이미지를 각각 표시하는 것입니다.
관련 콘텐츠
.NET Desktop feedback