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. Questa progettazione è diversa dai controlli utente, che forniscono un'area di progettazione visiva per raggruppare più controlli in una singola unità riutilizzabile.

Usa controlli personalizzati quando un controllo o un controllo utente esistente non si avvicina a fornire l'interfaccia utente o l'interattività necessaria. Richiedono più impegno da parte dell'utente per implementare completamente. Windows Form fornisce ancora la gestione della tastiera e del mouse, ma è necessario implementare comportamenti specifici. Un controllo personalizzato non include un'area di progettazione perché tutto il disegno viene eseguito tramite il codice nel OnPaint metodo . È comunque possibile aggiungere componenti, ad esempio , Timertramite l'area di progettazione non visiva.

Classe base

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

  • System.Windows.Forms.Control

    Questa classe di base è la stessa usata da altri controlli Windows Form. È possibile controllare direttamente l'input e l'output del controllo.

  • System.Windows.Forms.ScrollableControl

    Questa classe di base viene utilizzata da alcuni controlli Windows Form. 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

Dipingere significa rappresentare visivamente il controllo. Per eseguire questa attività, si esegue 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, si esegue automaticamente l'override del OnPaint metodo . Il modello esegue questa operazione perché è necessario scrivere il codice che disegna il tuo 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

Si disegna un controllo personalizzato usando il OnPaint metodo . Questo metodo accetta un singolo argomento, 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 eseguire il rendering del controllo:

  • PaintEventArgs.ClipRectangle— Rappresenta la parte del controllo che deve essere ridisegnata. Questa parte può essere l'intero controllo o solo una sezione di esso.

  • Graphics— Rappresenta la superficie grafica del controllo. Fornisce diversi oggetti e metodi orientati alla grafica che offrono 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. Il OnPaintBackground(PaintEventArgs) metodo disegna lo sfondo prima di chiamare OnPaint. Eseguire l'override OnPaintBackground per gestire il disegno dello sfondo del controllo. L'implementazione predefinita di questo metodo disegna il colore e l'immagine impostati rispettivamente dalle proprietà BackColor e BackgroundImage.