Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article vous présente les contrôles personnalisés et explique comment ils sont différents des contrôles utilisateur. Les contrôles personnalisés n'offrent pas de surface de conception visuelle et s'appuient sur le code fourni par l'utilisateur pour se représenter eux-mêmes. Cette conception diffère des contrôles utilisateur, qui fournissent une surface de conception visuelle pour regrouper plusieurs contrôles en une seule unité réutilisable.
Utilisez des contrôles personnalisés lorsqu’un contrôle existant ou un contrôle utilisateur n’est pas proche de fournir l’interface utilisateur ou l’interactivité dont vous avez besoin. Ils nécessitent davantage d’efforts de votre part pour mettre entièrement en œuvre. Windows Forms fournit toujours la gestion du clavier et de la souris, mais vous devez implémenter des comportements spécifiques. Un contrôle personnalisé n’inclut pas de surface de conception, car tout le dessin est effectué dans la méthode OnPaint via du code. Vous pouvez toujours ajouter des composants, tels qu’un Timer, par le biais de l’aire de conception nonvisuelle.
Classe de base
Lors de la création d’un contrôle personnalisé, choisissez parmi deux classes de base :
-
Cette classe de base est la même que celle utilisée par d’autres contrôles Windows Forms. Vous contrôlez directement l’entrée et la sortie du contrôle.
System.Windows.Forms.ScrollableControl
Cette classe de base est utilisée par certains contrôles Windows Forms. Il s’étend
Controlen ajoutant la possibilité de faire défiler le contenu.
Sauf si vous avez besoin de faire défiler le contenu du contrôle personnalisé, utilisez-le Control comme classe de base.
Fonctionnalités héritées
Étant donné que la classe de base d’un contrôle personnalisé est Control, vous héritez automatiquement des fonctionnalités Windows Forms partagées par tous les contrôles. Voici quelques-unes des fonctionnalités que vous obtenez avec un contrôle personnalisé :
- Saisie du clavier et de la souris.
- Comportements de disposition, tels que l’ancrage et l’amarrage.
- Prise en charge des tabulations.
- Restrictions de taille minimale et maximale.
Peinture
La peinture signifie dessiner le visuel du contrôle. Vous effectuez cette tâche en remplaçant la OnPaint méthode. Pour plus d’informations sur la façon dont les contrôles effectuent la peinture, consultez Peinture et dessin sur les contrôles.
Lorsque vous créez un contrôle personnalisé à l’aide des modèles Visual Studio, vous remplacez automatiquement la OnPaint méthode. Le modèle effectue cette opération, car vous devez écrire le code qui dessine votre contrôle. Voici un exemple de ce que le modèle génère :
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
Vous peindrez un contrôle personnalisé à l’aide de la méthode OnPaint. Cette méthode prend un seul argument, un PaintEventArgs objet, qui fournit toutes les informations et fonctionnalités dont vous avez besoin pour afficher votre contrôle.
PaintEventArgs fournit deux propriétés que vous utilisez dans le rendu de votre contrôle :
PaintEventArgs.ClipRectangle— Représente la partie du contrôle qui doit être redessinée. Cette partie peut être l’intégralité du contrôle ou simplement une section de celui-ci.
Graphics— Représente l’aire graphique de votre contrôle. Il fournit plusieurs objets et méthodes orientés graphiques qui vous donnent les fonctionnalités nécessaires pour dessiner votre contrôle.
La OnPaint méthode est appelée chaque fois que le contrôle est dessiné ou actualisé à l’écran, et l’objet PaintEventArgs.ClipRectangle représente le rectangle dans lequel la peinture a lieu. Si l’ensemble du contrôle doit être actualisé, PaintEventArgs.ClipRectangle représente la taille de l’ensemble du contrôle. Si seule une partie du contrôle doit être actualisée, elle représente uniquement la région à redessiner. Un exemple de tel cas serait qu’un contrôle est partiellement masqué par un autre contrôle dans l’interface utilisateur et que d’autres contrôles sont déplacés, la partie nouvellement exposée du contrôle sous-jacent doit être redessinée.
Le code dans la OnPaint méthode d’un contrôle s’exécute lorsque le contrôle est dessiné pour la première fois et chaque fois qu’il est invalidé. Pour vous assurer que votre contrôle est redessiné chaque fois qu’il est redimensionné, ajoutez la ligne suivante au constructeur de votre contrôle :
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)
Exemple :
L’extrait de code suivant est un contrôle personnalisé qui affiche plusieurs rectangles colorés autour du bord du contrôle.
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
Le code précédent crée un contrôle qui ressemble à l’image suivante :
Contexte
Notez que l’arrière-plan du contrôle est peint avec la SystemColors.Control couleur, même si le OnPaint code n’efface pas ou ne remplit pas le contrôle avec une couleur. La OnPaintBackground(PaintEventArgs) méthode peint l’arrière-plan avant d’appeler OnPaint. Remplacez OnPaintBackground la gestion du dessin de l’arrière-plan de votre contrôle. L’implémentation par défaut de cette méthode dessine respectivement la couleur et l’image définies par les BackColor propriétés BackgroundImage .
Contenu connexe
.NET Desktop feedback