Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
-
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:
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.
Contenuti correlati
.NET Desktop feedback