Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres

Classe de gestion d'un Popup

Date 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 !".

Le source de cet exemple est disponible ici : SubClassingExample.zip



Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com