Daniel Vielle 3 Programmation DotNET
Avec les Windows Forms du framework .NET, la boucle de messages est encapsulée dans la méthode
Application.Run(). Chaque séquence de traitement est décrite dans une fonction. Cette fonction est
enregistrée dans les propriétés de l'objet source d'événement par un intermédiaire qui porte le nom de
délégué. Un délégué dans le langage C# est analogue à un pointeur de fonction.
Un exemple : gestion de l'événement Paint
L'événement Paint est généré par le système Windows à chaque fois que tout ou partie de la zone
client d'une fenêtre (d'un formulaire) doit être redessinée. La séquence de traitement est standard pour
tous les composants graphiques disponibles (boutons, listes, …) elle est donc dans ce cas facultative
sauf si on souhaite "retoucher" le composant. Pour personnaliser un formulaire, on spécifie la
séquence d'instructions de dessin dans une méthode que l'on enregistre par l'intermédiaire d'un
"délégué" de l'événement Paint.
L'événement Paint est un objet de classe System.Windows.Forms.Control.Paint. Chaque
composant graphique (formulaire, controle, ...) possède un événement Paint accessible par une
propriété C#. Comme tous les autres événements Windows Forms, il dispose de la surcharge
d'opérateur += qui permet d'ajouter un nouveau gestionnaire pour traiter cet événement. La syntaxe
générique qui permet d'enregistrer (d'abonner) une méthode gestionnaire à un événement, est :
objetSource.événement += new délégué( méthode);
Le nom du délégué est imposé, le nom de la méthode est libre (c'est une différence avec les écouteurs
d'événements du langage Java). Un délégué en C# correspond à un pointeur de fonction en C ou en
C++ et n'existe pas en Java, il fait le lien avec la véritable méthode de traitement de l'événement,
appelée gestionnaire d'événement (un écouteur en Java).
On utilise l'opérateur += parce que, de manière générale, on peut abonner plusieurs gestionnaires à
un même événement : lors du déclenchement de l'événement, l'appel du délégué par toute la chaîne
Windows répercute l'appel à toutes les fonctions vers lesquelles il pointe.
On utilise l'opérateur new car un délégué est un objet. Le délégué et la méthode gestionnaire ont le
même prototype (sauf le nom de la méthode qui est libre).
Pour l'événement Paint, le délégué se nomme PaintEventHandler :
delegate void PaintEventHandler( Object source, PaintEventArgs pea);
static void méthode( Object source, PaintEventArgs pea);
Le second paramètre du délégué ou de la méthode de traitement de l'événement est un objet contenant
les caractéristiques de l'événement (un PaintEventArgs dans cet exemple).
Pour redéfinir, par exemple, la méthode de dessin d'un formulaire principal form1 par la méthode
PaintPrincipal(), on écrit :
form1.Paint += new PaintEventHandler( PaintPrincipal);
public static void PaintPrincipal( Object form, PaintEventArgs pea)
{
Graphics g = pea.Graphics;
g.Clear(Color.Coral);
}
form1.Paint est la propriété Paint du formulaire, c'est un objet de type Control.Paint on
l'appelle tout simplement l'événement Paint
PaintEventHandler est le délégué de l'événement Paint (nom et prototype imposés)