Dela via


Skapa en enkel anpassad kontroll

I den här artikeln lär du dig hur du skapar anpassad Windows Forms-kontroll. Den enkla kontroll som utvecklats i den här artikeln skriver ut kontrollens Text till vänster, i mitten eller till höger. Justeringen av texten kan ändras. Den här kontrollen genererar eller hanterar inte händelser.

I den här artikeln lär du dig hur du:

  • Lägg till en egenskap och ett fält för att hantera den vågräta justeringsinställningen för texten.
  • Använd OnTextChanged för att ogiltigförklara kontrollen.
  • Ange kod i OnPaint metoden för att rita text på kontrollens yta.

Lägga till en anpassad kontroll

Det första steget är att lägga till en anpassad kontroll i projektet.

  1. Leta reda på Solution Explorer-fönstret i Visual Studio. Högerklicka på projektet och välj Lägg till>nytt objekt.

    En bild av Visual Studio. I Solution Explorer-fönstret högerklickades projektet med en meny. Markerad i menyn är menyalternativet Lägg till, som expanderas och visar en undermeny. Menyalternativet

  2. Sök efter anpassad kontroll och välj den.

  3. Ange filnamnet till FirstControl och välj Lägg till.

  4. Om kontrollens designläge är synligt växlar du till kodvyn. Tryck på F7 eller välj länken växla till kodvy .

    Tips/Råd

    Du kan också högerklicka på filen i Solution Explorer-fönstret och välja Visa kod.

Nu bör du titta på källkoden för den anpassade kontrollen, som liknar följande kodfragment:

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

Lägga till en egenskap

Skapa en ny egenskap på kontrollen med namnet TextAlignment. Den här egenskapen justerar var texten målas på kontrollen. Utför följande steg med FirstControl klassen:

  1. Lägg till ett fält med namnet _textAlignment av typen HorizontalAlignment.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. Omslut fältet i en egenskap med namnet TextAlignment. När du ställer in egenskapen anropar Invalidate du metoden för att tvinga kontrollen att måla om sig själv.

    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. Lägg till följande attribut i egenskapen för att integrera den med fönstret Egenskaper i Visual Studio.

    • Category– Den kategori som tillämpas på egenskapen.

    • Description—Beskrivningen av egendomen.

    • DefaultValue– Ett standardvärde för egenskapen.

      Standardvärdet gör att egenskapen kan återställas av designern. Den hjälper också till att avgöra när egenskapen ska serialiseras till koden bakom, eftersom standardvärdena inte serialiseras.

    [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
    

Hantera ändrad text

Egenskapen TextAlignment anropar Invalidate så att kontrollen ommålar sig själv. Detta säkerställer att rätt justering omedelbart används vid återgivning av Text av kontrollen. Men om egenskapen Text ändras uppdateras ingenting eftersom Text inte anropar Invalidate. Egenskapen anropar faktiskt OnTextChanged-metoden, som du kan åsidosätta för att kalla på Invalidate och tvinga kontrollen att rita om sig.

Utför följande steg med FirstControl klassen:

  1. Åsidosätt metoden OnTextChanged.
  2. Anropa base.OnTextChanged för att höja händelsen TextChanged, som förväntat av dem som använder kontrollen.
  3. Invalidate Anropa metoden för att framtvinga ommålning.

Koden bör se ut som följande kodfragment:

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

Måla kontrollen

Den sista delen av den anpassade kontrollen är målning. Utför följande steg med FirstControl klassen:

  1. Leta upp den OnPaint metod som genereras av mallen. Om den saknas, skriv över den från basklassen.

  2. Skapa en ny StringFormat variabel med namnet style.

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

    Typen System.Drawing.StringFormat kapslar in textlayoutinformation och ger åtkomst till justering.

  3. Baserat på TextAlignment, ställ in style.Alignment-egenskapen till lämpligt värde.

    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. Rita egenskapen Text med 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
    

    Viktigt!

    Metoden Graphics.DrawString använder en Brush för textens färg. Brushes måste kasseras efter användning.

    Metoden Graphics.DrawString använder text, teckensnitt, färg och formateringsalternativ för att rita en sträng.

  5. Anropa base.OnPaint för att säkerställa att händelsen Paint har aktiverats.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. Spara kodfilen och kompilera projektet. När projektet har kompilerats lägger Visual Studio till den anpassade kontrollen i fönstret Verktygslåda när du öppnar Visual Designer.

Koden bör se ut som följande kodfragment:

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