Condividi tramite


Che cos'è un controllo personalizzato?

Questo articolo presenta i controlli personalizzati e descrive come sono diversi dai controlli utente. I controlli personalizzati non forniscono un'area di progettazione visiva e si basano sul codice fornito dall'utente per disegnare autonomamente. Questo è diverso dai controlli utente che forniscono un'area di progettazione visiva per raggruppare più controlli in una singola unità riutilizzabile.

I controlli personalizzati vengono usati quando un controllo esistente o un controllo utente non si avvicina a fornire l'interfaccia utente o l'interattività necessaria. Richiedono più impegno da parte dell'utente per implementare completamente. La gestione della tastiera e del mouse è ancora fornita da Windows Form, ma tutti i comportamenti vengono lasciati all'utente per implementare. Non esiste un'area di progettazione fornita con un controllo personalizzato, perché tutto il disegno viene eseguito tramite il codice nel OnPaint metodo . I componenti, ad esempio , Timerpossono comunque essere aggiunti tramite l'area di progettazione non visiva.

Classe base

Quando si crea un controllo personalizzato, è possibile scegliere tra due classi di base:

  • System.Windows.Forms.Control

    Si tratta della stessa classe di base usata da altri controlli Windows Form. È possibile controllare direttamente l'input e l'output del controllo.

  • System.Windows.Forms.ScrollableControl

    Alcuni controlli Windows Form usano questa classe di base. Questa classe si estende Control aggiungendo la possibilità di scorrere il contenuto.

A meno che non sia necessario scorrere il contenuto del controllo personalizzato, usare Control come classe di base.

Funzionalità ereditate

Poiché la classe base di un controllo personalizzato è Control, si ereditano automaticamente le funzionalità di Windows Form condivise da tutti i controlli. Ecco alcune delle funzionalità disponibili con un controllo personalizzato:

  • Input da tastiera e da mouse.
  • Comportamenti del layout, ad esempio ancoraggio e agganciamento.
  • Supporto per la tabulazione.
  • Restrizioni minime e massime delle dimensioni.

Pittura

Pittura, che significa disegnare l'elemento visivo del controllo, viene realizzata tramite l'override del metodo OnPaint. Per altre informazioni sul modo in cui i controlli eseguono il disegno, vedere Disegno e disegno sui controlli.

Quando si crea un controllo personalizzato usando i modelli di Visual Studio, il OnPaint metodo viene sottoposto automaticamente a override. Il modello esegue questa operazione perché è necessario scrivere il codice per disegnare il controllo. Ecco un esempio di ciò che il modello genera:

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

Un controllo personalizzato viene disegnato con il OnPaint metodo . Il singolo argomento di questo metodo è un PaintEventArgs oggetto , che fornisce tutte le informazioni e le funzionalità necessarie per eseguire il rendering del controllo. PaintEventArgs fornisce due proprietà che vengono utilizzate per il rendering del tuo controllo:

  • PaintEventArgs.ClipRectangle— Rappresenta la parte del controllo che deve essere ridisegnata. Può trattarsi dell'intero controllo o parte del controllo.

  • Graphics— Rappresenta la superficie grafica del controllo. Fornisce diversi oggetti e metodi orientati alla grafica che forniscono la funzionalità necessaria per disegnare il controllo.

Il OnPaint metodo viene chiamato ogni volta che il controllo viene disegnato o aggiornato sullo schermo e l'oggetto PaintEventArgs.ClipRectangle rappresenta il rettangolo in cui viene eseguito il disegno. Se l'intero controllo deve essere aggiornato, PaintEventArgs.ClipRectangle rappresenta le dimensioni dell'intero controllo. Se è necessario aggiornare solo parte del controllo, rappresenta solo l'area che deve essere ridisegnata. Un esempio di questo caso sarebbe quando un controllo è parzialmente nascosto da un altro controllo nell'interfaccia utente e che un altro controllo viene spostato, la parte appena esposta del controllo sottostante deve essere ridisegnata.

Il codice nel OnPaint metodo di un controllo viene eseguito quando il controllo viene disegnato per la prima volta e ogni volta che viene invalidato. Per assicurarsi che il controllo venga ridisegnato ogni volta che viene ridimensionato, aggiungere la riga seguente al costruttore del controllo:

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

Esempio

Il frammento di codice seguente è un controllo personalizzato che esegue il rendering di più rettangoli colorati attorno al bordo del controllo.

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

Il codice precedente crea un controllo simile all'immagine seguente:

Controllo personalizzato sottoposto a rendering in Visual Studio. Il controllo è una casella vuota con colori diversi che lo delimita. Ogni colore è insetto da un singolo pixel.

Sfondo

Si noti che lo sfondo del controllo viene disegnato con il SystemColors.Control colore, anche se il OnPaint codice non cancella o riempie il controllo con un colore. Lo sfondo viene effettivamente disegnato dal OnPaintBackground(PaintEventArgs) metodo prima OnPaint di essere chiamato. Eseguire l'override OnPaintBackground per gestire il disegno dello sfondo del controllo. L'implementazione predefinita di questo metodo consiste nel disegnare il colore e l'immagine impostati rispettivamente dalle proprietà BackColor e BackgroundImage.