Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Menu contextuel dans userform

65 views
Skip to first unread message

Bruno -- bdf

unread,
Jan 28, 2001, 6:48:57 PM1/28/01
to
Bonsoir,
Je souhaite affecter un menu contextuel, donc appel par le bouton droit de
la souris, à un user form et/ou à un objet d'un user form. Et ensuite pour
chacune des options de ce menu appeler une procédure que j'aurais écrite de
mes petits doigts graciles.
Mais je n'ai pas trouvé d'évènement du genre UserForm1_RightClick()

Est ce possible ?
Et bien sur, si oui, comment faire ?

A+
bruno

--
http://perso.club-internet.fr/bdafonse


Laurent Longre

unread,
Jan 28, 2001, 8:44:39 PM1/28/01
to

Salut Bruno,

Private Sub UserForm_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 2 Then MsgBox "Clic droit."
End Sub

Laurent

Bruno -- bdf a écrit :

Bruno -- bdf

unread,
Jan 29, 2001, 4:12:12 AM1/29/01
to
Je te remercie Laurent,
mais pour le menu contextuel je fait comment ?
Est ce seulement possible ?

A+
bruno

--
http://perso.club-internet.fr/bdafonse


"Laurent Longre" <laurent...@free.fr> a écrit dans le message news:
3A74CB07...@free.fr...

Laurent Longre

unread,
Jan 29, 2001, 6:46:42 AM1/29/01
to

Bruno -- bdf a écrit :
>
> Je te remercie Laurent,
> mais pour le menu contextuel je fait comment ?
> Est ce seulement possible ?

Sous Excel 2000, tu disposes du "Microsoft Toolbar Control". Pas bien
souple à utiliser, et ça n'a pas vraiment la tronche d'un menu
contextuel. Si tu essaies ça, il faudrait que tu gères son affichage
(Visible = True, forcément à l'intérieur du UserForm) à l'endroit où le
clic droit a été fait, et le masquage automatique du contrôle après un
clic extérieur.

Sinon tu peux aussi créer un menu de toutes pièces par fonctions API. Un
peu galère, je pense. Si ça t'intéresse vraiment, je peux essayer de te
construire un exemple.

Laurent

Bruno -- bdf

unread,
Jan 29, 2001, 7:36:04 AM1/29/01
to
Encore merci Laurent
mais ne te prends pas la tête, je vais essayer Microsoft Toolbar Control, on
ne sais jamais, je vais peut être m'en sortir comme ça.

bruno

--
http://perso.club-internet.fr/bdafonse


"Laurent Longre" <laurent...@free.fr> a écrit dans le message news:

3A755822...@free.fr...

Laurent Longre

unread,
Jan 29, 2001, 1:17:20 PM1/29/01
to

Je viens d'essayer avec l'API, et ça donne un résultat assez
satisfaisant:

'===========================================

Private Type POINTAPI
x As Long
y As Long
End Type

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function GetMenuItemRect Lib "User32" _
(ByVal hWnd As Long, ByVal hMenu As Long, ByVal uItem As Long, _
lprcItem As RECT) As Boolean

Private Declare Function CreatePopupMenu Lib "User32" () As Long

Private Declare Function CreateMenu Lib "User32" () As Long

Private Declare Function DestroyMenu Lib "User32" _
(ByVal hMenu As Long) As Long

Private Declare Function TrackPopupMenuEx Lib "User32" _
(ByVal hMenu As Long, ByVal un As Long, ByVal n1 As Long, _
ByVal n2 As Long, ByVal hWnd As Long, _
ByVal lpTPMParams As Long) As Boolean

Private Declare Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetCursorPos Lib "User32" _
(lpPoint As POINTAPI) As Long

Private Declare Function AppendMenuA Lib "User32" _
(ByVal hMenu As Long, ByVal wFlags As Long, _
ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long

Dim hMenu As Long, hWnd As Long
Dim H As Long, W As Long

Private Sub ContextMenu_Click(Num As Integer)
MsgBox "Elément " & Num & " du menu contextuel activé."
End Sub

Private Sub UserForm_Initialize()
Dim Elt, Cmd As CommandBar, I As Integer
Dim hMenu2 As Long, Rc As RECT, WTemp As Long
hWnd = FindWindowA(vbNullString, Me.Caption)
hMenu = CreatePopupMenu
hMenu2 = CreateMenu
AppendMenuA hMenu2, 0, 0, "Toto"
GetMenuItemRect hWnd, hMenu2, 0, Rc
H = Rc.Bottom - Rc.Top
For Each Elt In Array("Premier", "Deuxième", "Troisième", _
"Quatrième", "Cinquième")
I = I + 1
AppendMenuA hMenu2, 0, I, Elt
AppendMenuA hMenu, 0, I, Elt
GetMenuItemRect hWnd, hMenu2, I, Rc
WTemp = Rc.Right - Rc.Left + 45
If WTemp > W Then W = WTemp
Next Elt
DestroyMenu hMenu2
End Sub

Private Sub UserForm_MouseDown(ByVal Button As Integer, _

ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
Dim P1 As POINTAPI, P2 As POINTAPI
If Button <> 2 Then Exit Sub
GetCursorPos P1
TrackPopupMenuEx hMenu, 2, P1.x, P1.y, hWnd, 0
GetCursorPos P2
If Int((P2.x - P1.x) / W) = 0 Then _
ContextMenu_Click (P2.y - P1.y) \ H + 1
End Sub

Private Sub UserForm_Terminate()
DestroyMenu hMenu
End Sub

'===========================================

Cet exemple crée un menu contextuel au niveau du UserForm, avec 5
éléments de menu. Il peut être adapté à n'importe quel contrôle. Quand
le menu est activé par clic droit et qu'un élément est sélectionné, la
procédure ContextMenu_Click est exécutée, avec comme paramètre le numéro
de l'élément.

Problème: à cause d'une limite des fonctions API concernant les
UserForms (impossible d'intercepter des messages Windows envoyés au
UserForm à partir de VBA) j'ai utilisé une bidouille qui entraîne une
légère approximation à partir de 6 éléments. Si tu essaies de mettre
plus de 5 éléments dans le menu contextuel, tu verras que si tu actives
le 6ème en mettant la souris à la limite de sa bordure supérieure, la
procédure ContextMenu_Click croira que c'est le 5ème élément qui est
sélectionné.

D'autre part, cet exemple ne permet pas d'insérer des lignes de
séparation, des sous-menus, etc. dans ce menu contextuel. Quand j'aurai
le temps, j'essaierai de faire un système plus performant!

Bruno -- bdf

unread,
Jan 29, 2001, 3:53:14 PM1/29/01
to
Yeahh
Super ça fonctionne super terrible, même avec les *imperfections*, t'es
encore plus perfectionniste que moi et tu me fais rire avec ton *assez
satisfaisant*
Maintenant faut que j'étudie comment tu as fais, mais petit à petit grâce à
toi, je progresses dans les API.

A+
Bruno

--
http://perso.club-internet.fr/bdafonse


Laurent Longre <laurent...@free.fr> a écrit dans le message :
3A75B3B0...@free.fr...

0 new messages