Menu contextuel sur listview

Résolu
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009 - 1 oct. 2006 à 02:43
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Derniè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 ... :(

Merci de votre aide.

12 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
3
geobasic Messages postés 69 Date d'inscription jeudi 6 novembre 2003 Statut Membre Derniè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.
3
geobasic Messages postés 69 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 3 octobre 2006
2 oct. 2006 à 01:01
Petite erreur:

Dim Item as MSComctlLib.ListItem
3
geobasic Messages postés 69 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 3 octobre 2006
3 oct. 2006 à 15:11
Désolé encore une erreur, j'ai oublié le Set:

Set Item = ListView1.HitTest(X, Y)
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
1 oct. 2006 à 12:13
hmm la c'est un peu idiot mais j'arrive pas à sélectionner la liste avec le clic gauche, je n'ai aucune surbrillance de l'item............
0
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
1 oct. 2006 à 12:17
0
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
1 oct. 2006 à 13:28
0
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
1 oct. 2006 à 13:29
!!!!!!! Codes-Sources a complètement déconné... :o
Bref j'ai réussi, merci encore
0
geobasic Messages postés 69 Date d'inscription jeudi 6 novembre 2003 Statut Membre Derniè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.
0
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
1 oct. 2006 à 23:16
concrètement tu l'utilises comment ?
0
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
3 oct. 2006 à 15:09
J'obtiens une erreur 91 (Variable object ou variable bloc With non définie) au niveau de "Item = ListView1.HitTest(X, Y)"..
0
Vedlen Messages postés 360 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 7 septembre 2009
3 oct. 2006 à 15:14
Impeccable !

Merci geobasic
0
Rejoignez-nous