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.