다음을 통해 공유


간단한 사용자 지정 컨트롤 만들기

이 문서에서는 사용자 지정 Windows Forms 컨트롤을 만드는 방법을 설명합니다. 이 문서에서 개발한 간단한 컨트롤은 컨트롤의 Text 왼쪽, 가운데 또는 오른쪽에 인쇄합니다. 텍스트의 맞춤을 변경할 수 있습니다. 이 컨트롤은 이벤트를 발생하거나 처리하지 않습니다.

이 문서에서는 다음 방법을 알아봅니다.

  • 텍스트의 가로 맞춤 설정을 처리하는 속성과 필드를 추가합니다.
  • 컨트롤을 무효화하는 데 사용합니다 OnTextChanged .
  • 컨트롤의 OnPaint 화면에 텍스트를 그리는 메서드의 코드를 제공합니다.

사용자 지정 컨트롤 추가

첫 번째 단계는 프로젝트에 사용자 지정 컨트롤을 추가하는 것입니다.

  1. Visual Studio에서 솔루션 탐색기 창을 찾습니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고새 항목>를 선택합니다.

    Visual Studio의 이미지입니다. 솔루션 탐색기 창에서 프로젝트를 마우스 오른쪽 단추로 클릭하여 메뉴를 표시했습니다. 메뉴에서 강조 표시된 '추가' 메뉴 항목은 하위 메뉴를 표시하여 확장됩니다. 하위 메뉴에서 '새 항목' 메뉴 항목이 강조 표시됩니다.

  2. 사용자 지정 컨트롤을 검색하고 선택합니다.

  3. 파일 이름을 FirstControl 로 설정하고 추가를 선택합니다.

  4. 컨트롤의 디자인 모드가 표시되면 코드 보기로 전환합니다. 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 다음 단계를 수행합니다.

  1. 형식의 이름을 가진 _textAlignment 필드를 추가합니다 HorizontalAlignment.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. 라는 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
    
  3. 속성에 다음 특성을 추가하여 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 다음 단계를 수행합니다.

  1. OnTextChanged 메서드를 재정의합니다.
  2. base.OnTextChanged를 호출하여 컨트롤의 TextChanged 이벤트가 소비자가 기대한 대로 발생하도록 합니다.
  3. 메서드를 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 다음 단계를 수행합니다.

  1. 템플릿에서 OnPaint 생성된 메서드를 찾습니다. 누락된 경우 기본 클래스에서 재정의합니다.

  2. StringFormat라는 새 style 변수를 만듭니다.

    StringFormat style = new();
    
    Dim style As New StringFormat
    

    이 형식은 System.Drawing.StringFormat 텍스트 레이아웃 정보를 캡슐화하고 맞춤에 대한 액세스를 제공합니다.

  3. 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
    
  4. 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 텍스트, 글꼴, 색 및 서식 옵션을 사용하여 문자열을 그립니다.

  5. base.OnPaint 이벤트가 발생하도록 Paint에 호출하십시오.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. 코드 파일을 저장하고 프로젝트를 컴파일합니다. 프로젝트가 컴파일되면 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