Est ce possible ?
Et bien sur, si oui, comment faire ?
A+
bruno
--
http://perso.club-internet.fr/bdafonse
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 :
A+
bruno
--
http://perso.club-internet.fr/bdafonse
"Laurent Longre" <laurent...@free.fr> a écrit dans le message news:
3A74CB07...@free.fr...
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
--
http://perso.club-internet.fr/bdafonse
"Laurent Longre" <laurent...@free.fr> a écrit dans le message news:
3A755822...@free.fr...
'===========================================
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!
A+
Bruno
--
http://perso.club-internet.fr/bdafonse
Laurent Longre <laurent...@free.fr> a écrit dans le message :
3A75B3B0...@free.fr...