Delen via


Een eenvoudig aangepast besturingselement maken

In dit artikel leert u hoe u een eigen Windows Forms-besturingselement te maken. Het eenvoudige besturingselement dat in dit artikel is ontwikkeld, drukt de Text besturingselementen links, midden of rechts van het besturingselement af. De uitlijning van de tekst kan worden gewijzigd. Met dit besturingselement worden gebeurtenissen niet gegenereerd of verwerkt.

In dit artikel leert u het volgende:

  • Voeg een eigenschap en veld toe om de horizontale uitlijningsinstelling van de tekst te verwerken.
  • Gebruik OnTextChanged om het besturingselement te invalideren.
  • Geef code op in de OnPaint methode om tekst op het oppervlak van het besturingselement te tekenen.

Een aangepaste controle toevoegen

De eerste stap is het toevoegen van een aangepast besturingselement aan uw project.

  1. Zoek in Visual Studio het Solution Explorer-venster . Klik met de rechtermuisknop op het project en kiesNieuw item>.

    Een afbeelding van Visual Studio. In het venster Solution Explorer werd het project met de rechtermuisknop geklikt met een menu. Gemarkeerd in het menu is het menu-item Toevoegen, dat wordt uitgevouwen met een submenu. In het submenu is het menu-item Nieuw item gemarkeerd.

  2. Zoek naar Aangepast besturingselement en selecteer het.

  3. Stel de bestandsnaam in op FirstControl en selecteer Toevoegen.

  4. Als de ontwerpmodus van het besturingselement zichtbaar is, schakelt u over naar de codeweergave. Druk op F7 of selecteer de koppeling naar de codeweergave .

    Aanbeveling

    U kunt ook met de rechtermuisknop op het bestand klikken in het Solution Explorer-venster en Code weergeven selecteren.

U moet nu de broncode voor het aangepaste besturingselement bekijken. Dit ziet er ongeveer als volgt uit:

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

Een eigenschap toevoegen

Maak een nieuwe eigenschap op het besturingselement met de naam TextAlignment. Met deze eigenschap wordt aangepast waar de tekst op het besturingselement wordt weergegeven. Voer met de FirstControl klasse de volgende stappen uit:

  1. Voeg een veld toe met de naam _textAlignment van het type HorizontalAlignment.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. Het veld inpakken in een eigenschap met de naam TextAlignment. Wanneer u de eigenschap instelt, roept u de Invalidate methode aan om af te dwingen dat het besturingselement zichzelf opnieuw tekent.

    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. Voeg de volgende kenmerken toe aan de eigenschap om deze te integreren met het venster Eigenschappen in Visual Studio.

    • Category— De categorie die is toegepast op de eigenschap.

    • Description— De beschrijving van de eigenschap.

    • DefaultValue— Een standaardwaarde voor de eigenschap.

      Met de standaardwaarde kan de eigenschap opnieuw worden ingesteld door de ontwerper. Het helpt ook bij het bepalen wanneer de eigenschap moet worden geserialiseerd naar de achterliggende code, aangezien standaardwaarden niet worden geserialiseerd.

    [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
    

Verwerkte tekst wijzigen

De TextAlignment eigenschap roept Invalidate op zodat het besturingselement zichzelf opnieuw tekent. Dit zorgt ervoor dat de juiste uitlijning direct wordt gebruikt bij het weergeven van het Text besturingselement. Als de Text eigenschap echter wordt gewijzigd, wordt er niets bijgewerkt omdat TextInvalidate deze niet aanroept. De eigenschap roept de OnTextChanged-methode aan, die u kunt overschrijven om Invalidate aan te roepen en het besturingselement te dwingen zichzelf opnieuw te tekenen.

Voer met de FirstControl klasse de volgende stappen uit:

  1. Overschrijf de methode OnTextChanged.
  2. Roep base.OnTextChanged op om de TextChanged gebeurtenis te genereren, zoals verwacht door de gebruikers van het besturingselement.
  3. Roep de Invalidate methode aan om opnieuw te schilderen.

Uw code moet eruitzien als het volgende codefragment:

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

Het besturingselement schilderen

Het laatste deel van de aangepaste besturing is schilderen. Voer met de FirstControl klasse de volgende stappen uit:

  1. Zoek de OnPaint methode die door de sjabloon is gegenereerd. Als deze ontbreekt, overschrijft u deze uit de basisklasse.

  2. Maak een nieuwe StringFormat variabele met de naam style.

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

    Het System.Drawing.StringFormat type bevat informatie over de tekstindeling en biedt toegang tot uitlijning.

  3. Stel op basis van TextAlignment de eigenschap style.Alignment in op de juiste waarde.

    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. Teken de Text eigenschap met 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
    

    Belangrijk

    De Graphics.DrawString methode gebruikt een Brush voor de kleur van de tekst. Brushes moet na gebruik worden verwijderd.

    De Graphics.DrawString methode maakt gebruik van tekst, een lettertype, kleur en opmaakopties om een tekenreeks te tekenen.

  5. Roep base.OnPaint op om ervoor te zorgen dat de Paint gebeurtenis wordt getriggerd.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. Sla het codebestand op en compileer het project. Nadat het project is gecompileerd, voegt Visual Studio het aangepaste besturingselement toe aan de Werkset wanneer u de Visuele Ontwerper opent.

Uw code moet eruitzien als het volgende codefragment:

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