Ajouter un menu dans un formulaire

Christophe WARIN

Ce support constitu un exemple d'agrémentation possible de vos formulaires et d'utilisation des fonctions de mesure de coordonnées de l'API Windows.

- Titre : Ajouter un menu dans un formulaire

- Auteur : Christophe WARIN

- Parution : 5 septembre 2005

- Licence : Copyright ® 2005 - 2010 WARIN Christophe. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Introduction

- 2. Création du formulaire

- 3. Création de la barre de menu

- 3-1. Créer une nouvelle barre

- 3-2. Personnaliser la barre

- 3-3. Code des boutons

- 3-4. Affectation du code aux boutons

- 4. Liens avec le formulaire

- 5. Conclusion

1 - Introduction

Le but de ce tutoriel est de vous fournir une astuce permettant d'inclure une barre de menu au sein d'un formulaire Access, au même titre que leurs homologues sous Visual Basic.

Pour cela, nous allons utiliser des barres de menu contextuels qui seront affichées en dessous d'une étiquette qui correspondra au titre du menu.

2 - Création du formulaire

Ici, il s'agit d'un formulaire tout simple, il ne sera lié à aucune donnée, il s'agit juste de montrer le principe de la barre de menu. La seule chose à faire est donc de déposer l'étiquette qui servira de titre au menu. L'exemple choisi est celui du menu Fichier.

Il est possible à ce stade de donner le style de votre choix à vos étiquettes de menu. Ici, en fixant la propriété Apparence à Ciselé, une ligne 3D est affichée en dessous du texte.

Pour que le résultat soit optimal lors de la visualisation, il est primordial de désactiver le sélecteur d'enregistrement du formulaire sans quoi, le menu ne sera pas aligné sur la gauche du formulaire.

3 - Création de la barre de menu

3-1 - Créer une nouvelle barre

Pour créer une barre de menu personnalisée, il suffit de réaliser un clic droit dans la barre de menu Access et sélectionner Personnaliser.

Une fenêtre s'ouvre et il est alors possible de créer une nouvelle barre de menu. La barre ainsi créée sera nommée MenuFichier. Son nom doit représenter son action afin de faciliter les opérations de maintenance

La barre de menu MenuFichier est rajoutée en bas de la liste et il est possible désormais d'éditer ses propriétés.

Le type de la barre correspond à son mode d'affichage. La valeur Fenêtre Indépendante correspond à un menu contextuel. Toutefois, il n'est pas intéressant de changer cette valeur lors de la phase de création du fait qu'une fois convertie, la barre disparaît de la liste. Pour y accéder de nouveau, il faut alors afficher les propriétés d'une autre barre, puis dans la liste déroulante figurant en haut de la page de propriété, vous devrez sélectionner MenuFichier et, enfin, la repasser en barre d'outils.

La conversion en barre de menu contextuel est donc en général réalisée une fois que l'ensemble de la barre est au point.

Dans un premier temps, il ne faut donc pas modifier ces propriétés. Vous pouvez donc fermer la fenêtre.

3-2 - Personnaliser la barre

Quelque part sur l'écran, est apparue votre nouvelle barre. Elle doit normalement ressembler à quelque chose proche de ceci :

En cliquant sur l'onglet Commande, de la fenêtre Personnalisation, il est possible de glisser et déposer des boutons vers votre nouvelle barre. Dans la majeure partie des cas, vous créerez un bouton personnalisé. En effet les autres boutons apparaissant dans la liste possèdent des actions prédéfinies par Access et qui pour la plupart ne sont pas très utiles. Vous remarquerez aisément qu'aucun bouton ne permet par exemple d'ouvrir le bloc-notes ou Internet Explorer (ce que malgré tout, nos boutons devront faire).

Il suffit alors de cliquer sur le bouton personnalisé et de le déposer sur votre barre.

En réalisant un clic droit sur le bouton créé dans votre barre de menu, vous constaterez qu'il est possible de modifier chacune de ses propriétés. En particulier son image. Par exemple, réalisez une copie d'écran de votre menu Démarrer section Accessoires et retravailler l'image afin de ne garder que l'icône du bloc-notes. Copier ensuite l'image dans le presse-papier puis dans le menu contextuel figurant sur votre bouton, cliquez sur Coller l'image du bouton.

Dans les propriétés du bouton, vous pouvez ensuite définir sa légende (ce qui sera affiché).

Répétez ensuite l'action pour chaque bouton à créer.

3-3 - Code des boutons

Les boutons utilisés sur la barre de menu étant des boutons personnalisés, ils ne sont affectés à aucune action. Il est donc nécessaire d'écrire les traitements auxquels ils sont destinés. L'utilisation des macros étant trés restreinte, il sera bon de privilégier des fonctions écrites en VBA (langage qui offre bien plus de possibilités et de robustesse).
De plus, afin de faciliter les opérations de maintenance, il est conseillé de consacrer un module par barre (ou par groupe) de menu.

Créez un nouveau module et nommez le mduMenuFichier. Saisissez alors la fonction permettant d'ouvrir le bloc-notes :

Public Function LancerBlocNote()
Shell "Notepad.exe"
End Function

Répétez l'opération pour chaque bouton en écrivant le code adéquat.

3-4 - Affectation du code aux boutons

Vous devez revenir à l'invite de personnalisation de votre barre d'outils (clic droit dessus puis Personnaliser). Dans les propriétés de vos boutons, vous avez peut être remarqué le champ Action. Cela correspond à l'action à effectuer lors du clic sur le bouton. C'est ici qu'il faut faire référence à vos fonctions VBA.

La syntaxe est simple :

=NomFonction()

La barre est maintenant opérationnelle, il est désormais possible de la convertir en menu contextuel.

4 - Liens avec le formulaire

Il est malheureusement impossible d'utiliser le principe d'affichage des menus contextuels sur le clic droit. En effet, ici, la barre doit réagir à un clic gauche sur l'étiquette Fichier.

Il existe cependant un moyen simple d'afficher une barre de menu contextuel en VBA :

CommandBars("MenuFichier").ShowPopup X,Y

Où X et Y correspondent à la position en pixel où doit être affiché le menu. Mais, second souci, Access ne délivre jamais de coordonnées en pixel mais uniquement en twips. Le salut viendra des fonctions de l'API Windows qui nous permettront de récupérer ces coordonnées via quelques conversions (notamment 1 twips = 1/1440 pouces).

Voici les déclarations de l'API à placer dans un nouveau module nommé mduAPI :

Public Type POINTAPI
X As Long
Y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Puis enfin, sur l'événement Souris Appuyée (MouseDown) de l'étiquette Fichier, il suffira de placer le code suivant :

Private Sub lblFichier_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim pt As POINTAPI
Dim NbPointParPouceX As Long, NbPointParPouceY As Long
'récupère la position de la souris
GetCursorPos pt
'Récupère le nombre de pixel par pouce
NbPointParPouceX = GetDeviceCaps(GetDC(0), 88)
NbPointParPouceY = GetDeviceCaps(GetDC(0), 90)
'Affiche la barre de menu à l'endroit souhaité
CommandBars("MenuFichier").ShowPopup pt.X - (X / (1440 / NbPointParPouceX)), pt.Y + (lblFichier.Height - Y) / (1440 / NbPointParPouceY)
End Sub

Le formulaire ressemble assez à ce que l'on pourrait attendre :

5 - Conclusion

Certes, le résultat n'est pas totalement conforme aux menus VB, toutefois, cela peut rendre d'énormes services dans le cas de formulaires surchargés.

Il serait aussi possible via des moyens plutôt compliqués de changer la couleur et l'aspect de l'étiquette de titre Fichier. Toutefois, ceux-ci étant peu fiables, je n'ai pas désiré pas m'étendre sur leur sujet.