이 문서에서는 사용자 지정 Windows Forms 컨트롤을 만드는 방법을 설명합니다. 이 문서에서 개발한 간단한 컨트롤은 컨트롤의 Text 왼쪽, 가운데 또는 오른쪽에 인쇄합니다. 텍스트의 맞춤을 변경할 수 있습니다. 이 컨트롤은 이벤트를 발생하거나 처리하지 않습니다.
이 문서에서는 다음 방법을 알아봅니다.
- 텍스트의 가로 맞춤 설정을 처리하는 속성과 필드를 추가합니다.
- 컨트롤을 무효화하는 데 사용합니다
OnTextChanged
. - 컨트롤의
OnPaint
화면에 텍스트를 그리는 메서드의 코드를 제공합니다.
사용자 지정 컨트롤 추가
첫 번째 단계는 프로젝트에 사용자 지정 컨트롤을 추가하는 것입니다.
Visual Studio에서 솔루션 탐색기 창을 찾습니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고새 항목>를 선택합니다.
사용자 지정 컨트롤을 검색하고 선택합니다.
파일 이름을 FirstControl 로 설정하고 추가를 선택합니다.
컨트롤의 디자인 모드가 표시되면 코드 보기로 전환합니다. F7 키를 누르거나 코드 보기 링크로의 전환을 선택합니다.
팁 (조언)
솔루션 탐색기 창에서 파일을 마우스 오른쪽 단추로 클릭하고 코드 보기를 선택할 수도 있습니다.
이제 다음 코드 조각과 유사한 사용자 지정 컨트롤의 소스 코드를 확인해야 합니다.
public partial class FirstControl : Control
{
public FirstControl()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class FirstControl
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
속성 추가
라는 컨트롤에 새 속성을 만듭니다 TextAlignment
. 이 속성은 텍스트가 컨트롤에 그려지는 위치를 조정합니다. 클래스를 사용하여 FirstControl
다음 단계를 수행합니다.
형식의 이름을 가진
_textAlignment
필드를 추가합니다HorizontalAlignment
.private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
라는
TextAlignment
속성에 필드를 래핑합니다. 속성을 설정할 때 메서드를Invalidate
호출하여 컨트롤을 강제로 다시 칠합니다.public HorizontalAlignment TextAlignment { get => _textAlignment; set { _textAlignment = value; Invalidate(); } }
Public Property TextAlignment As HorizontalAlignment Get Return _textAlignment End Get Set(value As HorizontalAlignment) _textAlignment = value Invalidate() End Set End Property
속성에 다음 특성을 추가하여 Visual Studio의 속성 창과 통합합니다.
Category
- 속성에 적용된 범주입니다.Description
- 속성에 대한 설명입니다.DefaultValue
- 속성의 기본값입니다.기본값을 사용하면 디자이너에서 속성을 다시 설정할 수 있습니다. 또한 기본값은 serialize되지 않기 때문에, 속성이 클래스 파일에 언제 serialize되어야 하는지를 결정하는 데 도움이 됩니다.
[System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)] public HorizontalAlignment TextAlignment
<System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)> Public Property TextAlignment As HorizontalAlignment
변경된 텍스트 처리
TextAlignment
속성은 컨트롤이 자체적으로 다시 그려지도록 Invalidate
를 호출합니다. 이렇게 하면 해당 컨트롤의 Text
를 렌더링할 때 올바른 맞춤이 즉시 적용됩니다. 그러나 Text
속성이 변경되더라도 Text
이(가) 업데이트되지 않는 이유는 Invalidate
이(가) 호출되지 않기 때문입니다. 이 속성은 OnTextChanged
메서드를 호출하지만, 이를 재정의하여 Invalidate
메서드를 호출하고, 컨트롤이 다시 칠하도록 강제할 수 있습니다.
클래스를 사용하여 FirstControl
다음 단계를 수행합니다.
-
OnTextChanged
메서드를 재정의합니다. -
base.OnTextChanged
를 호출하여 컨트롤의TextChanged
이벤트가 소비자가 기대한 대로 발생하도록 합니다. - 메서드를
Invalidate
호출하여 강제로 다시 칠합니다.
코드는 다음 코드 조각과 같습니다.
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
컨트롤 그리기
사용자 지정 컨트롤의 마지막 부분은 그리기입니다. 클래스를 사용하여 FirstControl
다음 단계를 수행합니다.
템플릿에서
OnPaint
생성된 메서드를 찾습니다. 누락된 경우 기본 클래스에서 재정의합니다.StringFormat
라는 새style
변수를 만듭니다.StringFormat style = new();
Dim style As New StringFormat
이 형식은 System.Drawing.StringFormat 텍스트 레이아웃 정보를 캡슐화하고 맞춤에 대한 액세스를 제공합니다.
TextAlignment
에 따라style.Alignment
속성을 적절한 값으로 설정합니다.style.Alignment = TextAlignment switch { // Map the HorizontalAlignment enum to the StringAlignment enum HorizontalAlignment.Left => StringAlignment.Near, HorizontalAlignment.Right => StringAlignment.Far, HorizontalAlignment.Center => StringAlignment.Center, // Default to Near alignment _ => StringAlignment.Near };
'Map the HorizontalAlignment enum to the StringAlignment enum Select Case TextAlignment Case HorizontalAlignment.Left style.Alignment = StringAlignment.Near Case HorizontalAlignment.Right style.Alignment = StringAlignment.Far Case HorizontalAlignment.Center style.Alignment = StringAlignment.Center End Select
Text
를 사용하여Graphics.DrawString
속성을 그립니다.// Create the brush and automatically dispose it. using SolidBrush foreBrush = new(ForeColor); // Call the DrawString method to write text. // Text, Font, and ClientRectangle are inherited properties. pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
'Create the brush and automatically dispose it. Using foreBrush As New SolidBrush(ForeColor) 'Call the DrawString method to write text. 'Text, Font, and ClientRectangle are inherited properties. e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style) End Using
중요합니다
메서드는 텍스트의 색상을 나타내기 위해
Graphics.DrawString
을(를) 사용합니다.Brushes
는 사용 후 삭제해야 합니다.이 메서드는 Graphics.DrawString 텍스트, 글꼴, 색 및 서식 옵션을 사용하여 문자열을 그립니다.
base.OnPaint
이벤트가 발생하도록Paint
에 호출하십시오.base.OnPaint(pe);
MyBase.OnPaint(e)
코드 파일을 저장하고 프로젝트를 컴파일합니다. 프로젝트가 컴파일되면 Visual Studio는 Visual Designer를 열 때 도구 상자 창에 사용자 지정 컨트롤을 추가합니다.
코드는 다음 코드 조각과 같습니다.
public partial class FirstControl : Control
{
private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
[System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)]
public HorizontalAlignment TextAlignment
{
get => _textAlignment;
set
{
_textAlignment = value;
Invalidate();
}
}
public FirstControl()
{
InitializeComponent();
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
StringFormat style = new();
style.Alignment = TextAlignment switch
{
// Map the HorizontalAlignment enum to the StringAlignment enum
HorizontalAlignment.Left => StringAlignment.Near,
HorizontalAlignment.Right => StringAlignment.Far,
HorizontalAlignment.Center => StringAlignment.Center,
// Default to Near alignment
_ => StringAlignment.Near
};
// Create the brush and automatically dispose it.
using SolidBrush foreBrush = new(ForeColor);
// Call the DrawString method to write text.
// Text, Font, and ClientRectangle are inherited properties.
pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
base.OnPaint(pe);
}
}
Public Class FirstControl
Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
<System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)>
Public Property TextAlignment As HorizontalAlignment
Get
Return _textAlignment
End Get
Set(value As HorizontalAlignment)
_textAlignment = value
Invalidate()
End Set
End Property
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim style As New StringFormat
'Map the HorizontalAlignment enum to the StringAlignment enum
Select Case TextAlignment
Case HorizontalAlignment.Left
style.Alignment = StringAlignment.Near
Case HorizontalAlignment.Right
style.Alignment = StringAlignment.Far
Case HorizontalAlignment.Center
style.Alignment = StringAlignment.Center
End Select
'Create the brush and automatically dispose it.
Using foreBrush As New SolidBrush(ForeColor)
'Call the DrawString method to write text.
'Text, Font, and ClientRectangle are inherited properties.
e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style)
End Using
MyBase.OnPaint(e)
End Sub
End Class
관련 콘텐츠
.NET Desktop feedback