Udostępnij przez


Tworzenie prostej kontrolki niestandardowej

W tym artykule przedstawiono sposób tworzenia niestandardowej kontrolki formularzy systemu Windows. Prosta kontrolka opracowana w tym artykule wyświetla kontrolkę Text po lewej stronie, w środku lub po prawej stronie kontrolki. Można zmienić wyrównanie tekstu. Ta kontrolka nie zgłasza ani nie obsługuje zdarzeń.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • Dodaj właściwość i pole, aby obsłużyć ustawienie poziomego wyrównania tekstu.
  • Użyj OnTextChanged polecenia , aby unieważnić kontrolkę.
  • Podaj kod w metodzie OnPaint , aby narysować tekst na powierzchni kontrolki.

Dodawanie kontrolki niestandardowej

Pierwszym krokiem jest dodanie niestandardowej kontrolki do projektu.

  1. W programie Visual Studio znajdź okno Eksplorator rozwiązań . Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj>nowy element.

    Obraz programu Visual Studio. W oknie Eksplorator rozwiązań projekt został kliknięty prawym przyciskiem myszy z wyświetlonym menu. Wyróżnione w menu jest element menu

  2. Wyszukaj kontrolkę niestandardową i wybierz ją.

  3. Ustaw nazwę pliku na FirstControl i wybierz pozycję Dodaj.

  4. Jeśli tryb projektowania kontrolki jest widoczny, przejdź do widoku kodu. Naciśnij F7 lub wybierz link przełączenia do widoku kodu .

    Wskazówka

    Możesz również kliknąć prawym przyciskiem myszy plik w oknie Eksplorator rozwiązań i wybrać polecenie Wyświetl kod.

Teraz należy przyjrzeć się kodowi źródłowemu dla kontrolki niestandardowej, która wygląda podobnie do poniższego fragmentu kodu:

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

Dodawanie właściwości

Utwórz nową właściwość kontrolki o nazwie TextAlignment. Ta właściwość dostosuje miejsce malowania tekstu na kontrolce. FirstControl W klasie wykonaj następujące kroki:

  1. Dodaj pole o nazwie _textAlignment typu HorizontalAlignment.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. Owiń pole we właściwości o nazwie TextAlignment. Podczas ustawiania właściwości wywołaj metodę Invalidate , aby wymusić przemalowanie kontrolki.

    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. Dodaj następujące atrybuty do właściwości, aby zintegrować ją z oknem Właściwości w programie Visual Studio.

    • Category— kategoria zastosowana do właściwości .

    • Description— opis właściwości.

    • DefaultValue— wartość domyślna właściwości.

      Wartość domyślna umożliwia zresetowanie właściwości przez projektanta. Pomaga również określić, kiedy właściwość powinna być serializowana w kodzie, ponieważ wartości domyślne nie są serializowane.

    [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
    

Obsługa zmienionego tekstu

Właściwość TextAlignment wywołuje Invalidate, aby kontrolka sama się przerysowywała. Dzięki temu poprawne wyrównanie jest natychmiast używane podczas renderowania Text kontrolki. Jednak jeśli właściwość Text ulegnie zmianie, nic nie zostanie zaktualizowane, ponieważ Text nie wywołuje Invalidate. Właściwość wprawdzie wywołuje metodę OnTextChanged, którą można przesłonić, aby za pomocą wywołania Invalidate wymusić, by kontrolka sama się przemalowała.

FirstControl W klasie wykonaj następujące kroki:

  1. Zastąp metodę OnTextChanged.
  2. Wywołaj base.OnTextChanged, aby zdarzenie TextChanged zostało zgłoszone zgodnie z oczekiwaniami odbiorców kontrolki.
  3. Wywołaj metodę , Invalidate aby wymusić przemalowanie.

Kod powinien wyglądać podobnie do następującego fragmentu kodu:

protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
    MyBase.OnTextChanged(e)
    Invalidate()
End Sub

Malowanie kontrolki

Ostatnią częścią kontrolki niestandardowej jest malowanie. FirstControl W klasie wykonaj następujące kroki:

  1. Znajdź metodę OnPaint wygenerowaną przez szablon. Jeśli go brakuje, przesłoń go z klasy bazowej.

  2. Utwórz nową StringFormat zmienną o nazwie style.

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

    Typ System.Drawing.StringFormat hermetyzuje informacje o układzie tekstowym i zapewnia dostęp do wyrównania.

  3. TextAlignmentNa podstawie parametru style.Alignment ustaw właściwość na odpowiednią wartość.

    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. Narysuj właściwość Text za pomocą Graphics.DrawString polecenia.

    // 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
    

    Ważne

    Metoda Graphics.DrawString używa Brush do koloru tekstu. Brushes należy usunąć po użyciu.

    Metoda Graphics.DrawString używa tekstu, czcionki, koloru i opcji formatowania, aby narysować ciąg.

  5. Wywołaj base.OnPaint, aby upewnić się, że zdarzenie Paint jest zgłaszane.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. Zapisz plik kodu i skompiluj projekt. Po skompilowaniu projektu program Visual Studio dodaje kontrolkę niestandardową do okna Przybornik po otwarciu projektanta wizualnego.

Kod powinien wyglądać podobnie do następującego fragmentu kodu:

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