Partager via


Développement d'un contrôle Windows Forms simple

Cette section décrit les étapes essentielles de la création d'un contrôle Windows Forms personnalisé. Le contrôle simple développé à l'aide de cette procédure permet de modifier l'alignement de sa propriété Text. Il ne déclenche ou ne gère aucun événement.

Pour créer un contrôle personnalisé simple

  1. Définissez une classe qui dérive de System.Windows.Forms.Control.

    Public Class FirstControl
       Inherits Control
       ...
    End Class
    [C#]
    public class FirstControl:Control{...}
    
  2. Définissez les propriétés. (Vous n'êtes pas obligé de définir les propriétés, car un contrôle hérite de nombreuses propriétés de la classe Control, mais la plupart des contrôles personnalisés définissent généralement des propriétés supplémentaires.) Le fragment de code suivant définit une propriété appelée TextAlignment qui utilise FirstControl pour mettre en forme l'affichage de la propriété Text héritée de Control. Pour plus d'informations sur la définition des propriétés, consultez Vue d'ensemble des propriétés.

    ' ContentAlignment is an enumeration defined in the System.Drawing
    ' namespace that specifies the alignment of content on a drawing 
    ' surface.
    Private alignment As ContentAlignment = ContentAlignment.MiddleLeft
    
    Public Property TextAlignment() As ContentAlignment
      Get
         Return alignment
      End Get
      Set
         alignment = value
         ' The Invalidate method invokes the OnPaint method described 
         ' in step 3.
         Invalidate()
      End Set
    End Property
    [C#]
    // ContentAlignment is an enumeration defined in the System.Drawing
    // namespace that specifies the alignment of content on a drawing 
    // surface.
    private ContentAlignment alignment = ContentAlignment.MiddleLeft;
    
    public ContentAlignment TextAlignment {
       get {
          return alignment;
       }
       set {
          alignment = value;
          // The Invalidate method invokes the OnPaint method described 
          // in step 3.
          Invalidate(); 
       }
    }
    

    Lorsque vous définissez une propriété qui modifie l'affichage visuel du contrôle, vous devez appeler la méthode Invalidate pour redessiner le contrôle. Invalidate est défini dans la classe de base Control.

  3. Substituez la méthode OnPaint protégée héritée de Control afin de fournir une logique de rendu à votre contrôle. Si vous ne substituez pas OnPaint, votre contrôle est incapable de se dessiner. Dans le fragment de code suivant, la méthode OnPaint affiche la propriété Text héritée de Control avec un alignement par défaut.

    Public Class FirstControl
       Inherits Control
    
       Public Sub New()
          ...
       End Sub
    
       Protected Overrides Sub OnPaint(e As PaintEventArgs)
          MyBase.OnPaint(e)
          e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), RectangleF.op_Implicit(ClientRectangle), style)
       End Sub
    End Class
    [C#]
    public class FirstControl : Control{
       public FirstControl() {...}
       protected override void OnPaint(PaintEventArgs e) {
          base.OnPaint(e);
          e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);
       } 
    }
    

    Le code précédent affiche le texte avec l'alignement par défaut. L'exemple de code situé à la fin de cette rubrique montre comment modifier l'alignement de Text de la manière spécifiée par la propriété TextAlignment, définie à l'étape 2 décrite précédemment dans cette section.

  4. Fournissez des attributs pour votre contrôle. Les attributs permettent à un concepteur visuel d'afficher correctement votre contrôle ainsi que ses propriétés et événements au moment du design. Le fragment de code suivant applique des attributs à la propriété TextAlignment. Dans un concepteur tel que Microsoft Visual Studio .NET, l'attribut Category (repris dans le fragment de code) entraîne l'affichage de la propriété sous une catégorie logique. L'attribut Description entraîne l'affichage d'une chaîne descriptive en bas de la fenêtre Propriétés lorsque la propriété TextAlignment est sélectionnée. Pour plus d'informations sur les attributs, consultez Attributs en mode design pour les composants.

    <Category("Alignment"), _
    Description("Specifies the alignment of text.")> _  
    Public Property TextAlignment() As ContentAlignment
       ...
    End Class
    [C#]
    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    public ContentAlignment TextAlignment {...}
    
  5. (facultatif) Fournissez des ressources pour votre contrôle. Vous pouvez fournir une ressource, telle qu'une bitmap, pour votre contrôle en utilisant une option de compilateur (/res pour C#) pour empaqueter des ressources avec votre contrôle. Au moment de l'exécution, la ressource peut être extraite à l'aide des méthodes de la classe System.Resources.ResourceManager. Pour plus d'informations sur la création et l'utilisation des ressources, consultez le Didacticiel de démarrage rapide Exemples .NET - Procédure : ressources.

  6. Compilez et déployez votre contrôle. Pour compiler et déployer FirstControl, exécutez les étapes suivantes :

    1. Enregistrez le code de l'exemple suivant dans un fichier source (tel que FirstControl.cs ou FirstControl.vb).

    2. Compilez le code source dans un assembly et enregistrez-le dans le répertoire de votre application. Dans ce but, exécutez la commande suivante à partir du répertoire qui contient le fichier source.

      vbc /t:library /out:[chemin d'accès du répertoire de votre application]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.vb

      csc /t:library /out:[chemin d'accès du répertoire de votre application]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.cs

      L'option de compilateur /t:library indique au compilateur que l'assembly que vous créez est une bibliothèque (et non un exécutable). L'option /out spécifie le chemin d'accès et le nom de l'assembly. L'option /r fournit le nom des assemblys référencés par votre code. Dans cet exemple, vous créez un assembly privé que seules vos applications peuvent utiliser. Vous devez donc l'enregistrer dans le répertoire de votre application. Pour plus d'informations sur l'empaquetage et le déploiement d'un contrôle pour la distribution, consultez Déploiement d'applications .NET Framework.

L'exemple suivant montre le code pour FirstControl. Le contrôle est inséré dans l'espace de noms CustomWinControls. Un espace de noms fournit un regroupement logique des types connexes. Vous pouvez créer votre contrôle dans un nouvel espace de noms ou dans un espace de noms existant. Dans C#, la déclaration using (dans Visual Basic, Imports) permet d'accéder aux types à partir d'un espace de noms sans utiliser le nom qualifié complet du type. Dans l'exemple suivant, la déclaration using permet au code d'accéder à la classe Control à partir de System.Windows.Forms en utilisant simplement Control plutôt que de devoir employer le nom qualifié complet System.Windows.Forms.Control.

Option Explicit
Option Strict

Imports System
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Drawing

Namespace CustomWinControls
   Public Class FirstControl
      Inherits Control
      Private alignment As ContentAlignment = ContentAlignment.MiddleLeft

      <Category("Alignment"), _
      Description("Specifies the alignment of text.")> _
      Public Property TextAlignment() As ContentAlignment
         Get
            Return alignment
         End Get
         Set
            alignment = value
            ' The Invalidate method invokes the OnPaint method.
            Invalidate()
         End Set
      End Property
      
      ' OnPaint aligns text, as specified by the 
      ' TextAlignment property, by passing a parameter
      ' to the DrawString method of the System.Drawing.Graphics object.
      Protected Overrides Sub OnPaint(e As PaintEventArgs)
         MyBase.OnPaint(e)
         Dim style As New StringFormat()
         style.Alignment = StringAlignment.Near
         Select Case alignment
            Case ContentAlignment.MiddleLeft
               style.Alignment = StringAlignment.Near
            Case ContentAlignment.MiddleRight
               style.Alignment = StringAlignment.Far
            Case ContentAlignment.MiddleCenter
               style.Alignment = StringAlignment.Center
         End Select
         ' Call the DrawString method of the System.Drawing class to write   
         ' text. Text and ClientRectangle are properties inherited from
         ' Control.
         e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), RectangleF.op_Implicit(ClientRectangle), style)
      End Sub
   End Class
End Namespace
[C#]
namespace CustomWinControls {
   using System;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Drawing;
   public class FirstControl : Control {
      private ContentAlignment alignment = ContentAlignment.MiddleLeft;
      
      [
       Category("Alignment"),
       Description("Specifies the alignment of text.")
      ]
      public ContentAlignment TextAlignment {
         get {
            return alignment;
         }
         set {
            alignment = value;
            // The Invalidate method invokes the OnPaint method.
            Invalidate();
         }
      }

      // OnPaint aligns text, as specified by the 
      // TextAlignment property, by passing a parameter
      // to the DrawString method of the System.Drawing.Graphics object.
      protected override void OnPaint(PaintEventArgs e) {
         base.OnPaint(e);
         StringFormat style = new StringFormat();
         style.Alignment = StringAlignment.Near;
         switch (alignment) {
            case ContentAlignment.MiddleLeft:
               style.Alignment = StringAlignment.Near;
               break;
            case ContentAlignment.MiddleRight:
               style.Alignment = StringAlignment.Far;
               break;
            case ContentAlignment.MiddleCenter:
               style.Alignment = StringAlignment.Center;
               break;
         }
         // Call the DrawString method of the System.Drawing class to write   
         // text. Text and ClientRectangle are properties inherited from
         // Control.
         e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);
      }
   }
}

Utilisation du contrôle personnalisé dans un formulaire

L'exemple suivant montre un formulaire simple qui utilise FirstControl. Il crée trois instances de FirstControl, chacune possédant une valeur différente pour la propriété TextAlignment.

Pour compiler et exécuter cet exemple

  1. Enregistrez le code de l'exemple suivant dans un fichier source (SimpleForm.cs ou SimpleForms.vb).

  2. Compilez le code source dans un assembly exécutable en lançant la commande suivante à partir du répertoire qui contient le fichier source.

    vbc /r:CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll SimpleForm.vb

    csc /r:CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll SimpleForm.cs

    CustomWinControls.dll est l'assembly qui contient la classe FirstControl. Cet assembly doit se trouver dans le même répertoire que le fichier source du formulaire qui y accède (SimpleForm.cs ou SimpleForms.vb).

  3. Exécutez SimpleForm.exe à l'aide de la commande suivante.

    SimpleForm

Option Explicit
Option Strict

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports CustomWinControls

Class SimpleForm
   Inherits Form
   Private leftControl As FirstControl
   Private centerControl As FirstControl
   Private rightControl As FirstControl
   
   Protected Overloads Overrides Sub Dispose(disposing as Boolean)
      MyBase.Dispose(disposing)
   End Sub
   
   
   Public Sub New()
      leftControl = New FirstControl()
      With leftControl
         .Text = "Left"
         .Location = New Point(50, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(leftControl)
      
      centerControl = New FirstControl()
      With centerControl
         .TextAlignment = ContentAlignment.MiddleCenter
         .Text = "Center"
         .Location = New Point(125, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(centerControl)
      
      rightControl = New FirstControl()
      With rightControl
         .TextAlignment = ContentAlignment.MiddleRight
         .Text = "Right"
         .Location = New Point(200, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(rightControl)
   End Sub

   <STAThread()> _
   Public Shared Sub Main()
      Dim myForm As New SimpleForm()
      myForm.Text = "Uses FirstControl"
      myForm.Size = New Size(400, 150)
      Application.Run(myForm)
   End Sub
End Class
[C#]
using System;
using System.Windows.Forms;
using System.Drawing;
using CustomWinControls;

class SimpleForm : Form {
   private FirstControl left;
   private FirstControl center;
   private FirstControl right;
   
   protected override void Dispose(bool disposing) {
      base.Dispose(disposing);
   }

   public SimpleForm() : base() {
      left = new FirstControl();
      left.Text = "Left";
      left.Location = new Point(50, 50);
      left.Size = new Size(50, 50);
      Controls.Add(left);
      
      center = new FirstControl();
      center.TextAlignment = ContentAlignment.MiddleCenter;
      center.Text = "Center";
      center.Location = new Point(125, 50);
      center.Size = new Size(50, 50);
      Controls.Add(center);
      
      right = new FirstControl();
      right.TextAlignment = ContentAlignment.MiddleRight;
      right.Text = "Right";
      right.Location = new Point(200, 50);
      right.Size = new Size(50, 50);
      Controls.Add(right);
   }
   
   [STAThread]
   public static void Main(string[] args) {
      Form form = new SimpleForm();
      form.Text = "Uses FirstControl";
      form.Size = new Size(400, 150);
      Application.Run(form);
   }
}

Voir aussi

Propriétés dans les contrôles Windows Forms | Événements dans les contrôles Windows Forms