[R]menu contextuel listview

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
serpafi
Niveau 3
Niveau 3
Messages : 40
Enregistré le : ven. 25 oct. 2019 21:19
Status : Hors ligne

[R]menu contextuel listview

#1

Message par serpafi »

Bonjours a tous,
Je cherche à avoir le menu context (click droit) sur 2 différents listviews du même gui.
en gros pouvoir sélectionner (en multiple) puis supprimer, Medianfo ou autres dans un menu context...
PS:ce n'est que pour des fichiers audios ou video.
via koda j'ai:
$Form2 = GUICreate("Form2", 1065, 869, 443, 166, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_TABSTOP), BitOR($WS_EX_ACCEPTFILES,$WS_EX_TRANSPARENT,$WS_EX_WINDOWEDGE))
GUISetFont(8, 800, 0, "MS Sans Serif")
GUISetBkColor(0x000000)


$ListView2 = GUICtrlCreateListView("", 312, 376, 737, 196, BitOR($LVS_REPORT,$LVS_NOCOLUMNHEADER,$LVS_NOSORTHEADER,$LVS_SORTASCENDING,$LVS_NOLABELWRAP,$WS_VSCROLL), 0)
GUICtrlSetFont(-1, 9, 400, 0, "Russo One")
GUICtrlSetBkColor(-1, 0xFFFBF0)
$ListView2context = GUICtrlCreateContextMenu($ListView2)
$MenuItem4 = GUICtrlCreateMenuItem("supprimer", $ListView2context)
$MenuItem3 = GUICtrlCreateMenuItem("MediaInfo", $ListView2context)
$ListView1 = GUICtrlCreateListView("", 312, 152, 737, 196, BitOR($LVS_REPORT,$LVS_NOCOLUMNHEADER,$LVS_NOSORTHEADER,$LVS_SORTASCENDING,$LVS_NOLABELWRAP,$WS_VSCROLL), 0)
GUICtrlSetFont(-1, 9, 400, 0, "Russo One")
GUICtrlSetBkColor(-1, 0xFFFBF0)
$ListView1context = GUICtrlCreateContextMenu($ListView1)
$MenuItem1 = GUICtrlCreateMenuItem("supprimer", $ListView1context)
$MenuItem2 = GUICtrlCreateMenuItem("MediaInfo", $ListView1context)
(-1, 0x0066CC)
Hormis le code de Gary Frost qui exclu le système menucontext de koda je ne vois pas d'autres solutions et je n'arrive même pas a l'inclure à mes 2 listviews.
voici celui de Gary Frost
$ListView1 = GUICtrlCreateListView("", 312, 376, 737, 196, BitOR($LVS_REPORT,$LVS_NOCOLUMNHEADER,$LVS_NOSORTHEADER,$LVS_SORTASCENDING,$LVS_NOLABELWRAP,$WS_VSCROLL), 0)
GUICtrlSetFont(-1, 9, 400, 0, "Russo One")
GUICtrlSetBkColor(-1, 0xFFFBF0)
        _GUICtrlListView_InsertColumn($ListView2, 0, "Column 1", 140)
        _GUICtrlListView_AddItem($ListView2, "Ligne 0", 0)
        _GUICtrlListView_AddItem($ListView2, "Ligne 1", 1)
        _GUICtrlListView_AddItem($ListView2, "Ligne 2", 2)


Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $ListView1
    If Not IsHWnd($ListView1) Then $hWndListView = GUICtrlGetHandle($ListView1)

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
                Case $hWndListView
                        Switch $iCode
                                Case $NM_RCLICK
                                        HBases_LVRClick(_GUICtrlListView_GetSelectedIndices($ListView1))
                        EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
Donc si une âme charitable pouvais m'aider.
Je vous remercie d'avance :bisou:
Modifié en dernier par serpafi le ven. 01 nov. 2019 13:21, modifié 1 fois.
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: menu contextuel listview

#2

Message par franco »

Salut.

Je pense, si j'ai bien saisi ton souci, que tu fais un poil compliqué.


Personnellement, si je dois créer un menu contextuel sur une listview, à sélection multiple, je ferais autrement...

Car, quand il s'agit de sélection multiple, je préfère utiliser une listview à case à cocher...
Ca simplifie grandement le code.

Un exemple avec une listview.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

Global $Form1 = GUICreate("Form1", 615, 437, 192, 124)

$listview = GUICtrlCreateListView("Fichier", 0, 0, 400, 400, -1, $LVS_EX_CHECKBOXES + $WS_EX_CLIENTEDGE)
GUICtrlSendMsg($listview, 4126, 0, 100)
GUICtrlCreateListViewItem('Fichier1', $listview)
GUICtrlCreateListViewItem('Fichier2', $listview)

$menu = GUICtrlCreateContextMenu($listview)
$suppr = GUICtrlCreateMenuItem("Supprimer la sélection", $menu)

GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit

      Case $suppr
         For $a = 0 To _GUICtrlListView_GetItemCount($listview) - 1
            If _GUICtrlListView_GetItemChecked($listview, $a) = True Then MsgBox(0, '', _GUICtrlListView_GetItemText($listview, $a, 0))
         Next

   EndSwitch
WEnd
Comme tu peux le voir :
- j'ai créé le menu directement avec la variable $listview : tu peux donc faire de même avec d'autres listviews.
- j'ai créé une entrée ($suppr) et j'ai encore utiliser la variable $listview , dans la boucle for, pour détecter les "fichiers cochés". Tu peux donc en créer d'autre, quelque soit la listview.


A toi donc d'adapter.


A moins que j'ai mal compris ce que tu cherches à faire.


++
L'entraide, c'est mon dada ;)
serpafi
Niveau 3
Niveau 3
Messages : 40
Enregistré le : ven. 25 oct. 2019 21:19
Status : Hors ligne

Re: menu contextuel listview

#3

Message par serpafi »

Merci beaucoup Franco,
Grâce à toi j'ai pu faire un code 100% fonctionnel sur les 2 listviews.
Je me suis beaucoup inspiré de ton code qui pourrait m’être utile ultérieurement.

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>


$Form3 = GUICreate("Form3", 452, 405, 311, 318)
$ListView1 = GUICtrlCreateListView("", 16, 24, 186, 334, BitOR($LVS_REPORT,$LVS_NOCOLUMNHEADER,$LVS_SHOWSELALWAYS,$LVS_NOSCROLL), 0)
$ListView1context = GUICtrlCreateContextMenu($ListView1)
$MenuItem1 = GUICtrlCreateMenuItem("Supprimer la sélection", $ListView1context)
$MenuItem2 = GUICtrlCreateMenuItem("MediaInfo", $ListView1context)

$ListView2 = GUICtrlCreateListView("", 248, 24, 186, 334, BitOR($LVS_REPORT,$LVS_NOCOLUMNHEADER,$LVS_SHOWSELALWAYS,$LVS_NOSCROLL), 0)
$ListView2context = GUICtrlCreateContextMenu($ListView2)
$MenuItem3 = GUICtrlCreateMenuItem("Supprimer la sélection", $ListView2context)
$MenuItem4 = GUICtrlCreateMenuItem("MediaInfo", $ListView2context)
GUISetState(@SW_SHOW)

_GUICtrlListView_AddColumn($ListView1, "fichier", 200,"",2)
_GUICtrlListView_AddColumn($ListView2, "fichier", 200,"",2)
;~ GUICtrlSendMsg($ListView1, 4126, 0, 100)
GUICtrlCreateListViewItem('Fichier1', $ListView1)
GUICtrlCreateListViewItem('Fichier2', $ListView1)
GUICtrlCreateListViewItem('Fichier3', $ListView1)
GUICtrlCreateListViewItem('Fichier4', $ListView1)
GUICtrlCreateListViewItem('Fichier5', $ListView1)
GUICtrlCreateListViewItem('Fichier6', $ListView1)

GUICtrlCreateListViewItem('Fichier1', $ListView2)
GUICtrlCreateListViewItem('Fichier2', $ListView2)
GUICtrlCreateListViewItem('Fichier3', $ListView2)
GUICtrlCreateListViewItem('Fichier4', $ListView2)
GUICtrlCreateListViewItem('Fichier5', $ListView2)
GUICtrlCreateListViewItem('Fichier6', $ListView2)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

                Case $MenuItem1
                        For $a = 0 To _GUICtrlListView_GetItemCount($ListView1) -1
                        _GUICtrlListView_DeleteItemsSelected ( $ListView1 )
                        Next
            Case $MenuItem2
                        For $a = 0 To _GUICtrlListView_GetItemCount($ListView1) - 1
                                        If _GUICtrlListView_GetItemSelected ( $ListView1, $a ) = True Then MsgBox(0, '','MediaInfo')
                  Next
            Case $MenuItem3
                        For $a = 0 To _GUICtrlListView_GetItemCount($ListView2) -1
                        _GUICtrlListView_DeleteItemsSelected ( $ListView2 )
                        Next
            Case $MenuItem4
                        For $a = 0 To _GUICtrlListView_GetItemCount($ListView2) - 1
                                         If _GUICtrlListView_GetItemSelected ( $ListView2, $a ) = True Then MsgBox(0, '','MediaInfo')
                        Next


        EndSwitch
WEnd
Répondre