Vedlen
Messages postés360Date d'inscriptionmardi 14 octobre 2003StatutMembreDernière intervention 7 septembre 2009
-
1 oct. 2006 à 02:43
Vedlen
Messages postés360Date d'inscriptionmardi 14 octobre 2003StatutMembreDernière intervention 7 septembre 2009
-
3 oct. 2006 à 15:14
Bonjour,
je souhaiterai simplement effectuer des clic droits avec menu contextuel sur les items d'un listview. Je sais que c'est pas bien compliqué mais ça ne s'invente pas quand on sait pas ... :(
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 1 oct. 2006 à 03:36
Salut
Le click-droit en lui même n'est pas difficile à gérer (grace à MenuPopup), mais la difficulté avec les ListView, c'est que lors d'un click droit, l'item situé sous la souris ne prend pas le focus. Il faut donc simuler un click gauche avant.
Voici un exemple dans une de mes applis qui consiste à faire apparaitre un menu proposant la suppression de l'item.
Si tu n'as pas besoin de sélectionner l'item avant apparition du menu, tu n'auras besoin que de la ligne qui est soulignée.
-1- Crée un module et place ce code dedans :
Option Explicit
' Module pour la gestion du click-droit dans les listes
Public Type POINTAPI
x As Long
y As Long
End Type
Public Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute move
Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down
Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up
Public Const MOUSEEVENTF_MOVE = &H1 ' mouse move
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20
Public Const MOUSEEVENTF_MIDDLEUP = &H40
Public Const MOUSEEVENTF_RIGHTDOWN = &H8
Public Const MOUSEEVENTF_RIGHTUP = &H10
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal cButtons As Long, _
ByVal dwExtraInfo As Long)
Public Declare Function GetMessageExtraInfo Lib "user32" () As Long
Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Const SM_CXSCREEN = 0 'X Size of screen
Public Const SM_CYSCREEN = 1 'Y Size of Screen
-2- Dans le MouseDown de ta ListView :
Private Sub maListView_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim lpPoint As POINTAPI
Dim Temp As String
If Button And vbRightButton Then
' On simule un click gauche avant d'afficher le menu
Call GetCursorPos(lpPoint)
' Transforme en coordonnées absolues
lpPoint.x = lpPoint.x * (&HFFFF& / GetSystemMetrics(SM_CXSCREEN))
lpPoint.y = lpPoint.y * (&HFFFF& / GetSystemMetrics(SM_CYSCREEN))
' Place la souris sur ce point
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, _
lpPoint.x, lpPoint.y, 0, GetMessageExtraInfo()
' Mouse Down
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo()
' Mouse Up
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo()
DoEvents
Temp = lstMatières.SelectedItem.Text
' et modifie le texte du popup
mnuSupprimer.Caption = "&Supprimer '" & Temp & "'"
' Affiche le menu de proposition de suppression
PopupMenu mnuzSupprimer, vbPopupMenuRightAlign
End If
End Sub
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
geobasic
Messages postés69Date d'inscriptionjeudi 6 novembre 2003StatutMembreDernière intervention 3 octobre 2006 2 oct. 2006 à 00:14
Petit exemple avec ListView1, un menu Menu1 et un sous-menu mn_item1:
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Item as MSComctlLib.ListView
Item = ListView1.HitTest(X, Y)
If Not Item Is Nothing and Button = 2 Then
mn_item1.Caption = Item.Text
PopupMenu Menu1
End If
End Sub
Dans cet exemple on récupère l'item qui est sous le curseur et on recopie son texte dans le caption d'un sous-menu. Fait le test , tu verra ça marche trés bien.
geobasic
Messages postés69Date d'inscriptionjeudi 6 novembre 2003StatutMembreDernière intervention 3 octobre 2006 1 oct. 2006 à 22:10
Oh la la ! Il beaucoup plus simple que ça ! La Methode HitTest du ListView permet de récupérer l'item qui est sous les coordonnées X et Y du curseur, il suffit de l'appeller dans l'évenement MouseDown du ListView.