Classe de gestion d'un PopupDate de publication : 24 mai 2008
Par
Anthony DE DECKER (Accueil)
Ce tutoriel présente la création d'une classe permettant l'affichage en Popup de n'importe
quel type de Control de maniére complétement transparente pour celui-ci.
I. Introduction
I-A. Préalables
I-B. Objectifs
II. Réalisation
II-A. Définition de la classe de "Popupification"
II-A-1. Qu'est réellement notre classe ?
II-A-2. Illustration
I. Introduction
Dans un tutoriel précédent (
Création d'un popup
) nous avons vu comment nous pouvions créer et utiliser un Popup.
Toutefois, le but de ce tutoriel étant plus de présenter les différentes notions
nécessaires, il n'avait pas pour vocation de fournir une solution générique
à l'implémentation d'un popup, le composant "popupifier" n'étant pas libéré
complètement de la gestion de l'ouverture et de la fermeture du Popup.
Combler cette lacune est l'objectif du présent tutoriel.
Dans celui-ci je vous propose donc de créer une classe qui encapsulera
l'intégralité des tâches propres à la gestion de l'ouverture et de la
fermeture du Popup, indépendamment de son contenu.
I-A. Préalables
Dans ce tutoriel, nous utiliserons des notions et des classes déjà présentées
dans les tutoriels suivants :
Une lecture même succincte de ceux-ci ne pourra que faciliter la compréhension.
I-B. Objectifs
Notre objectif est de permettre à un composant de s'afficher en tant que Popup,
sans avoir à gérer les différentes tâches inhérentes à un l'affichage d'un Popup.
Partant du principe que la majorité des composants visuels héritent de la
classe Control, nous allons nous limiter à des composants de ce type.
Quelles sont les tâches que devra assurer notre classe que j'appellerai
de " Popupification " ?
Elle doit :
- Positionner le control et l'afficher dans une fenêtre,
- Activer ou non cette fenêtre (par exemple la DropDownList d'un
Combobox n'est pas activée alors qu'un Popup de saisie de texte dans
un Propertygrid l'est)
- Fermer cette fenêtre en cas :
- De click en dehors de sa zone d'affichage,
- Sur désactivation de la form parente du control ayant initié son affichage en cas de non activation,
- Sur sa désactivation si elle a était activée,
- Sur perte du focus du control ayant initié son affichage dans le cas où celui à gardé l'activité.
II. Réalisation
II-A. Définition de la classe de "Popupification"
II-A-1. Qu'est réellement notre classe ?
Notre classe est une classe d'encapsulation d'un control qui devra
"garder un oeil" sur différents messages destinés à ce control
(perte d'activation par exemple).
Cela signifie donc qu'elle devra "subclasser" ce control.
Un objet facilitateur du subclassing est la classe
System.Windows.Forms.NativeWindow, qui dispose d'une
méthode AssignHandle permettant de définir le Handle dont les messages
seront interceptés.
Cette classe constituera donc un moyen simple d'effectuer le subclassing du
control mis en Popup.
II-A-2. Illustration
Créons une classe SubClassWithNativeWindow héritant de NativeWindow
dont l'objectif est de détecter le click gauche de la souris sur un bouton.
Pour ce faire, nous demandons aux instanciateurs de cette classe de fournir
dans le constructeur le bouton concerné.
Ensuite, il nous suffit d'assigner le handle du bouton à notre classe
et de gérer le message WM_LBUTTONDOWN.
Exemple de subclassing - SubClassWithNativeWindow |
Public Class SubClassWithNativeWindow
Inherits System. Windows . Forms . NativeWindow
Public Sub New (ByVal b As Button)
MyBase. AssignHandle (b. Handle )
End Sub
Private Const WM_LBUTTONDOWN As Integer = & H201
Protected Overrides Sub WndProc (ByRef m As Message)
MyBase. WndProc (m)
If m. Msg = WM_LBUTTONDOWN Then
System. Windows . Forms . MessageBox . Show (" J'ai vu le click ! " )
End If
End Sub
End Class
|
Créons une Form "FormSubClass" avec un Button "Button1"
dont nous demandons la " surveillance " par une instance de la classe
SubClassWithNativeWindow :
Exemple de subclassing - FormSubClass |
Public Class FormSubClass
Public Sub New ()
InitializeComponent ()
Dim scwnw As New SubClassWithNativeWindow (Me. Button1 )
End Sub
End Class
|
Un click gauche de la souris entraînera l'affichage du message "J'ai vu le click !".
|