Freigeben über


Was ist ein benutzerdefiniertes Steuerelement?

In diesem Artikel werden benutzerdefinierte Steuerelemente vorgestellt und beschrieben, wie sie sich von Benutzersteuerelementen unterscheiden. Benutzerdefinierte Steuerelemente bieten keine visuelle Entwurfsoberfläche und verlassen sich auf vom Benutzer bereitgestellten Code, um sich selbst zu zeichnen. Dies unterscheidet sich von Benutzersteuerelementen, die eine visuelle Entwurfsoberfläche bieten, um mehrere Steuerelemente in einer einzigen wiederverwendbaren Einheit zu gruppieren.

Benutzerdefinierte Steuerelemente werden verwendet, wenn ein vorhandenes Steuerelement oder Benutzersteuerelement nicht in der Nähe der Benutzeroberflächen- oder Interaktivität liegt, die Sie benötigen. Sie erfordern mehr Aufwand, um sie vollständig zu implementieren. Die Tastatur- und Mausbehandlung wird weiterhin von Windows Forms bereitgestellt, aber es liegt an Ihnen, die Verhaltensweisen zu implementieren. Es gibt keine Entwurfsoberfläche, die mit einem benutzerdefinierten Steuerelement bereitgestellt wird, da die gesamte Zeichnung über Code in der OnPaint Methode erfolgt. Komponenten, z. B. eine Timer, können weiterhin über die nichtvisuale Entwurfsoberfläche hinzugefügt werden.

Basisklasse

Beim Erstellen eines benutzerdefinierten Steuerelements stehen zwei Basisklassen zur Auswahl:

  • System.Windows.Forms.Control

    Dies ist die gleiche Basisklasse, die von anderen Windows Forms-Steuerelementen verwendet wird. Sie steuern die Eingabe und Ausgabe des Steuerelements direkt.

  • System.Windows.Forms.ScrollableControl

    Einige Windows Forms-Steuerelemente verwenden diese Basisklasse. Diese Klasse erweitert Control durch die Fähigkeit zum Scrollen des Inhalts.

Wenn Sie den Inhalt des benutzerdefinierten Steuerelements nicht scrollen müssen, verwenden Sie Control als Basisklasse.

Geerbte Funktionen

Da die Basisklasse eines benutzerdefinierten Steuerelements lautet Control, erben Sie automatisch die Von allen Steuerelementen freigegebene Windows Forms-Funktionalität. Hier sind einige der Funktionen, die Sie mit einem benutzerdefinierten Steuerelement erhalten:

  • Tastatur- und Mauseingabe.
  • Layoutverhalten, z. B. Verankern und Andocken.
  • Unterstützung für Tabulatoren.
  • Minimale und maximale Größenbeschränkungen.

Gemälde

Das Zeichnen, was bedeutet, dass das Visuelle des Steuerelements gezeichnet wird, wird durch Überschreiben der OnPaint Methode erreicht. Weitere Informationen darüber, wie Steuerelemente malen, finden Sie unter Malen und Zeichnen auf Steuerelementen.

Wenn Sie ein benutzerdefiniertes Steuerelement mithilfe der Visual Studio-Vorlagen erstellen, wird die OnPaint Methode automatisch überschrieben. Die Vorlage tut dies, damit Sie den Code schreiben können, um Ihr Steuerelement zu zeichnen. Hier ist ein Beispiel dafür, was die Vorlage generiert:

public partial class CustomControl1 : Control
{
    public CustomControl1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }
}
Public Class CustomControl1

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

        'Add your custom paint code here
    End Sub

End Class

Zum Zeichnen einer benutzerdefinierten Kontrolle wird die OnPaint Methode verwendet. Das einzelne Argument dieser Methode ist ein PaintEventArgs Objekt, das alle Informationen und Funktionen bereitstellt, die zum Rendern des Steuerelements erforderlich sind. PaintEventArgs stellt zwei Eigenschaften bereit, die beim Rendern Ihres Steuerelements verwendet werden.

  • PaintEventArgs.ClipRectangle– Stellt den Teil des Steuerelements dar, der neu gezeichnet werden muss. Dies kann das gesamte Steuerelement oder ein Teil des Steuerelements sein.

  • Graphics– Stellt die grafische Oberfläche des Steuerelements dar. Es stellt mehrere grafikorientierte Objekte und Methoden bereit, die die zum Zeichnen des Steuerelements erforderlichen Funktionen bereitstellen.

Die OnPaint Methode wird aufgerufen, wenn das Steuerelement auf dem Bildschirm gezeichnet oder aktualisiert wird, und das PaintEventArgs.ClipRectangle Objekt stellt das Rechteck dar, in dem das Zeichnen stattfindet. Wenn das gesamte Steuerelement aktualisiert werden muss, PaintEventArgs.ClipRectangle stellt die Größe des gesamten Steuerelements dar. Wenn nur ein Teil des Steuerelements aktualisiert werden muss, stellt es nur die Region dar, die neu gezeichnet werden muss. Ein Beispiel für einen solchen Fall wäre, dass wenn ein Steuerelement teilweise von einem anderen Steuerelement auf der Benutzeroberfläche verdeckt wird und das andere Steuerelement wegbewegt wird, der neu freigelegte Teil des darunter liegenden Steuerelements neu gezeichnet werden muss.

Der Code in der OnPaint-Methode eines Steuerelements wird ausgeführt, wenn das Steuerelement zum ersten Mal dargestellt wird und wann immer es ungültig gemacht wird. Um sicherzustellen, dass das Steuerelement bei jeder größenänderung neu gezeichnet wird, fügen Sie dem Konstruktor Ihres Steuerelements die folgende Zeile hinzu:

SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)

Beispiel

Der folgende Codeausschnitt ist ein benutzerdefiniertes Steuerelement, das mehrere farbige Rechtecke um den Rand des Steuerelements rendert.

protected override void OnPaint(PaintEventArgs pe)
{
    Rectangle rect = this.ClientRectangle;

    // Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
    // Otherwise, it kind of overlaps the outside edge.
    rect.Width -= 1;
    rect.Height -= 1;

    Pen[] colorPens = new Pen[] { Pens.Blue, Pens.BlueViolet,
                                  Pens.AliceBlue, Pens.CornflowerBlue,
                                  Pens.Cyan, Pens.DarkCyan };

    foreach (Pen pen in colorPens)
    {
        pe.Graphics.DrawRectangle(pen, rect);
        rect.Inflate(-1, -1);
    }

    // Raise the Paint event so users can custom paint if they want.
    base.OnPaint(pe);
}
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

    Dim rect As Rectangle = Me.ClientRectangle

    'Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
    'Otherwise, it kind of overlaps the outside edge.
    rect.Width -= 1
    rect.Height -= 1

    Dim colorPens As Pen() = {Pens.Blue, Pens.BlueViolet,
                                Pens.AliceBlue, Pens.CornflowerBlue,
                                Pens.Cyan, Pens.DarkCyan}

    For Each curPen As Pen In colorPens

        e.Graphics.DrawRectangle(curPen, rect)
        rect.Inflate(-1, -1)

    Next

    'Raise the Paint event so users can custom paint if they want.
    MyBase.OnPaint(e)

End Sub

Der vorherige Code erstellt ein Steuerelement, das wie die folgende Abbildung aussieht:

Ein benutzerdefiniertes Steuerelement, das in Visual Studio gerendert wird. Das Steuerelement ist ein leeres Feld mit unterschiedlichen Farben, die es umgrenzen. Jede Farbe wird durch ein einzelnes Pixel festgelegt.

Hintergrund

Beachten Sie, dass der Hintergrund des Steuerelements mit der SystemColors.Control Farbe gezeichnet wird, auch wenn der OnPaint Code das Steuerelement nicht mit einer Farbe löscht oder ausfüllt. Der Hintergrund wird tatsächlich von der OnPaintBackground(PaintEventArgs) Methode gemalt, bevor OnPaint aufgerufen wird. Überschreiben Sie OnPaintBackground, um das Zeichnen des Hintergrunds Ihres Steuerelements zu behandeln. Die Standardimplementierung dieser Methode besteht darin, die Farbe und das Bild zu zeichnen, die von den Eigenschaften BackColor und BackgroundImage festgelegt werden.