Vad är en anpassad kontroll?

I den här artikeln beskrivs anpassade kontroller och hur de skiljer sig från användarkontroller. Anpassade kontroller har ingen visuell designyta och ritar sig själva med kod som användaren tillhandahåller. Den här designen skiljer sig från användarkontroller, vilket ger en visuell designyta för att gruppera flera kontroller i en enda återanvändbar enhet.

Använd anpassade kontroller när en befintlig kontroll eller användarkontroll inte är i närheten av att tillhandahålla det användargränssnitt eller interaktivitet som du behöver. De kräver mer arbete från din sida för att implementera dem fullt ut. Windows Forms tillhandahåller fortfarande tangentbords- och mushantering, men du måste implementera specifika beteenden. En anpassad kontroll innehåller inte någon designyta eftersom all ritning görs via kod i OnPaint metoden. Du kan fortfarande lägga till komponenter, till exempel en Timer, via den icke-visualiska designytan.

Basklass

När du skapar en anpassad kontroll väljer du mellan två basklasser:

  • System.Windows.Forms.Control

    Den här basklassen är samma som används av andra Windows Forms-kontroller. Du styr kontrollens indata och utdata direkt.

  • System.Windows.Forms.ScrollableControl

    Den här basklassen används av vissa Windows Forms-kontroller. Det utökas Control genom att lägga till möjligheten att skrolla innehållet.

Om du inte behöver rulla innehållet i den anpassade kontrollen använder Control du som basklass.

Ärvda funktioner

Eftersom basklassen för en anpassad kontroll är Controlärver du automatiskt Windows Forms-funktioner som delas av alla kontroller. Här följer några av de funktioner som du får med en anpassad kontroll:

  • Tangentbords- och musinmatning.
  • Layoutbeteenden, till exempel förankring och dockning.
  • Stöd för tabbning.
  • Begränsningar för minsta och högsta storlek.

Målning

Målning innebär att rita kontrollens visuella representation. Du utför den här uppgiften genom att åsidosätta metoden OnPaint. Mer information om hur kontroller målar finns i Måla och rita på kontroller.

När du skapar en anpassad kontroll med hjälp av Visual Studio-mallarna åsidosätter OnPaint du metoden automatiskt. Mallen gör detta eftersom du måste skriva den kod som ritar ditt kontrollelement. Här är ett exempel på vad mallen genererar:

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

Du målar en anpassad kontroll med hjälp av metoden OnPaint. Den här metoden tar ett enda argument, ett PaintEventArgs -objekt, som innehåller all information och funktionalitet som du behöver för att återge din kontroll. PaintEventArgs innehåller två egenskaper som du använder för att återge kontrollen:

  • PaintEventArgs.ClipRectangle— Representerar den del av kontrollen som måste ritas om. Den här delen kan vara hela kontrollelementet eller bara en del av det.

  • Graphics— Representerar kontrollens grafiska yta. Den innehåller flera grafikorienterade objekt och metoder som ger dig de funktioner som krävs för att dra din kontroll.

Metoden OnPaint anropas när kontrollen ritas eller uppdateras på skärmen och PaintEventArgs.ClipRectangle objektet representerar den rektangel där målningen äger rum. Om hela kontrollen behöver uppdateras PaintEventArgs.ClipRectangle representerar storleken på hela kontrollen. Om endast en del av kontrollen behöver uppdateras representerar den bara den region som behöver ritas om. Ett exempel på ett sådant fall skulle vara när en kontroll delvis döljs av en annan kontroll i användargränssnittet, och att andra kontroller flyttas bort, den nyligen exponerade delen av kontrollen under måste ritas om.

Koden i OnPaint-metoden hos en kontroll körs när kontrollen först ritas och när den blir ogiltigförklarad. För att säkerställa att kontrollen ritas om varje gång storleken ändras, lägger du till följande rad i kontrollens konstruktor:

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

Exempel

Följande kodfragment är en anpassad kontroll som återger flera färgade rektanglar runt kontrollens kant.

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

Föregående kod skapar en kontroll som ser ut som följande bild:

En anpassad kontroll som återges i Visual Studio. Kontrollen är en tom ruta med olika färger som gränsar till den. Varje färg är inset av en enda pixel.

Bakgrund

Observera att kontrollens bakgrund är målad med SystemColors.Control färgen, även om OnPaint koden inte rensar eller fyller kontrollen med en färg. Metoden OnPaintBackground(PaintEventArgs) målar upp bakgrunden innan den anropar OnPaint. Åsidosätt OnPaintBackground för att hantera bakgrundsritningen för kontrollen. Standardimplementeringen av den här metoden ritar färgen som anges av BackColor-egenskapen och bilden som anges av BackgroundImage-egenskapen.