IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Exemple de création d'un contrôle : le splitter

Le 08 juillet 2002

Par Romain Puyfoulhoux

Code source du splitter

Propriétés, méthodes, et évènements du splitter

Comment va fonctionner notre contrôle du point de vue du programmeur qui l'utilisera ? Voici les propriétés, méthodes, et évènements exposés par le contrôle :

Propriétés
Position indique ou spécifie la position du séparateur
 
Méthodes
AddControl (ctl as Control, Droite as Boolean) ajoute au splitter le volet gauche ou droit qui sera redimensionné
 
Evènements
PositionChanged (PanneauGauche As Integer, PanneauDroit As Integer) A lieu lorsque la position du séparateur a changé. Permet au programmeur d'écrire le code qui redimensionnera les deux volets.


Déclarations préalables

Pour que la largeur du séparateur soit facilement modifiable, nous allons la déclarer sous la forme d'une constante, dans la partie Déclarations. Ajoutons dès maintenant, dans cette même partie, la variable privée qui contiendra la position du séparateur, c'est-à-dire la distance entre le bord gauche de l'image et le bord gauche du contrôle utilisateur.

Private Const LargeurSeparateur As Integer = 60
Private m_Position As Integer


L'initialisation du contrôle

La largeur du contrôle image doit être égale à celle du séparateur. Nous devons donc lui donner sa valeur au moment de l'initialisation du contrôle, c'est-à-dire dans la procédure de l'évènement Initialize.

Private Sub UserControl_Initialize()
splitV.Width = LargeurSeparateur
End Sub


La méthode privée ResizePanes()

Cette procédure sera exécutée à chaque fois que l'on voudra réactualiser la position du séparateur. Le redimensionnement des 2 volets étant géré par le programmeur, nous n'avons qu'une chose à faire dans cette procédure : modifier la position du contrôle image.

Private Function ResizePanes()
splitV.Left = m_Position
End Function


L'événement PositionChanged

Cet évènement sera accessible au programmeur qui utilisera notre contrôle. Il pourra le sélectionner dans la liste des évènements du splitter, et écrire le code de sa procédure correspondante, ceci afin de redimensionner la largeur des deux volets. Nous ajoutons notre évènement dans la partie Déclarations, avec le mot-clé Public, pour qu'il soit accessible de l'extérieur. Nous verrons bientôt comment le déclencher.

Public Event PositionChanged (PanneauGauche As Integer, PanneauDroit As Integer)


La propriété Position

Cette propriété donne la possibilité de modifier la position du séparateur, que ce soit en mode création, avec la fenêtre des propriétés, ou à l'exécution.

Property Get Position() As Integer

'Renvoie la valeur de m_Position
Position = m_Position

End Property


Property Let Position(x As Integer)

If (x < 800) Then
    m_Position = 800
ElseIf (x > Width - LargeurSeparateur - 800) Then
    m_Position = Width - LargeurSeparateur - 800
Else
    m_Position = x
End If

ResizePanes
RaiseEvent PositionChanged(m_Position, Width - m_Position - LargeurSeparateur)

End Property


La procédure Property Get renvoie la position du séparateur. La procédure Property Let permet de la modifier. Détaillons cette dernière. Tout d'abord nous modifions la valeur privée m_Position, en s'assurant que ni la taille du volet gauche, ni celle du volet droit ne soit inférieure à 800 (valeur bien sûr arbitraire). Ensuite nous appelons la procédure ResizePanes pour repositionner l'image splitV. La dernière ligne lance l'évènement PositionChanged, qui avertira le programme utilisant le splitter que la position du séparateur a été modifiée. La procédure de l'événement prend en argument la largeur du volet gauche et celle du volet droit.

La méthode AddControl()

Cette méthode a pour rôle de positionner et dimensionner les 2 contrôles situés de part et d'autre du séparateur. Pour écrire son code source, nous avons besoin d'une fonction interne de Windows, présente dans le fichier user32.dll : il s'agit de SetParent. Pour pouvoir l'utiliser, nous devons ajouter cette ligne dans la partie Déclarations :

Private Declare Function SetParent Lib "user32"(ByVal hWndChild As Long, ByVal hWndParent As Long) As Long


Cette fonction permet de préciser le conteneur d'une fenêtre fille. Les paramètres à lui passer sont respectivement l'identifiant de la fenêtre fille et celui du conteneur. Cet identifiant, nommé handle, est obtenu grâce à la propriété hWnd.

Public Function AddControl(ctl As Control, Droite As Boolean)

'le splitter devient le conteneur du contrôle à ajouter
SetParent ctl.hWnd, hWnd

'place et dimensionne le contrôle fils
ctl.Top = 0
ctl.Height = Height
If Droite Then
    ctl.Left = m_Position + LargeurSeparateur
    ctl.Width = Width - ctl.Left
Else
    ctl.Left = 0
    ctl.Width = m_Position
End If

End Function


Redimensionnement du splitter

Interessons nous maintenant au comportement de notre splitter lors de son redimensionnement. Cet évènement peut avoir lieu aussi bien en mode création qu'exécution. En mode création, nous allons replacer le séparateur au milieu du contrôle. Mais à l'exécution, nous laisserons au programmeur le soin de gérer cet évènement. Comment pouvons-nous connaître le mode dans lequel nous sommes ? Avec la propriété UserMode, qui nous renvoie True si nous sommes dans la phase d'exécution, et False sinon.

Private Sub UserControl_Resize()

'actualise la hauteur de l'image et du PictureBox.
splitV.Height = Height
picSplitv.Height = Height
'le séparateur est placé au milieu, si l'on est en mode création.
If Not Ambient.UserMode Then Position = Int((Width - LargeurSeparateur) / 2)

End Sub


Page précédente     Page suivante