[R] Menu contextuel avec icônes

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] Menu contextuel avec icônes

#1

Message par jpascal »

Bonjour,


J'ai récupéré l'UDF de cette page qui permet de créer des menus contextuels avec icônes :
https://www.autoitscript.com/forum/topi ... nt-1205045

Il fonctionne correctement.


Mon problème est que je souhaite afficher un menu lorsque je clique sur un item de listview.

Pour l'instant, j'utilise une fonction WM_NOTIFY avec ce code :
Case $hWndListView
         Switch $iCode
            Case $NM_RCLICK
               ContextMenu($tInfo)
               ;Return 1 ; not to allow the default processing
               Return 0 ; allow the default processing
         EndSwitch
La fonction ContextMenu contient tous les éléments du menu et les actions correspondantes.

Si je modifie les fonctions de base (_GUICtrlMenu_CreatePopup, _GUICtrlMenu_AddMenuItem, ...) par celles de l'UDF, l'interface freeze lors du clic droit sur l'item de la listview.
Le problème vient sûrement du fait que j'affiche le menu à partir de la fonction WM_NOTIFY de la même façon que lorsqu'on utilise la fonction _ArrayDisplay.
En effet, si je le crée ailleurs cela fonctionne mais je perds l'intérêt du WM_NOTIFY qui est de récupérer le numéro d'item sélectionné ($tInfo)


Pensez-vous qu'il y a ait une solution pour intégrer un menu contextuel avec des icônes à une listwiew ?
Modifié en dernier par jpascal le mar. 05 juin 2018 17:03, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Menu contextuel avec icônes

#2

Message par walkson »

Bonjour,
J'ai récupéré un code sur le forum US que j'ai bidouillé avec ModernMenuRaw.au3
#NoTrayIcon
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include ".\modern_menu_1\ModernMenuRaw.au3"
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

Global $hGUI, $hListView, $hContextMenu, $Call, $hmsg, $sItemTxt
$hGUI = GUICreate("Phonebook (right clic)", 250, 300)
GUISetIcon(@SystemDir & "\SHELL32.dll", 310, $hGUI)
$hListView = GUICtrlCreateListView("Name                        |Number", 5, 5, 240, 290)
GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)

$HelpContext = GUICtrlCreateContextMenu($hListView)
_SetMenuIconBkColor(0x99EE99)
_SetMenuTextColor(0xFF0000)
$sidemenu = _CreateSideMenu($HelpContext)
_SetSideMenuText($sidemenu, "Menu")
_SetSideMenuBkColor($sidemenu, 0xFF5050)
_SetSideMenuBkGradColor($sidemenu, 0xFFFFFF)

Global $HelpWWW = _GUICtrlCreateODMenuItem("Website", $HelpContext, "shell32.dll",  - 26)
_GUICtrlCreateODMenuItem("", $HelpContext)
_GUICtrlCreateODMenuItem("", $HelpContext)
Global $HelpWWW1 = _GUICtrlCreateODMenuItem("Website_1", $HelpContext, "shell32.dll",  - 23)

For $a = 100 To 110
    GUICtrlCreateListViewItem("Name" & $a & "|" & $a, $hListView)
Next
GUISetState()

While 1
    $hmsg = GUIGetMsg()
    Switch $hmsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $HelpWWW
            MsgBox(64,">> 1","TEST valeur "& $sItemTxt)
      Case $HelpWWW1
         MsgBox(64,">> 2","TEST valeur "& $sItemTxt)
    EndSwitch

WEnd


Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Select
        Case $wParam = $hlistview
            Select
                Case $event = $NM_RCLICK
                    $avSel = _GUICtrlListView_GetSelectedIndices($hListView, 1)
                    If IsArray($avSel) And $avSel[0] > 0 Then
                        $sItemTxt = _GUICtrlListView_GetItemText($hListView, $avSel[1], 1)
                  _GUICtrlODMenuItemSetText($HelpWWW, "Call valeur " & $sItemTxt)
                    EndIf
            EndSelect
    EndSelect
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
EndFunc   ;==>WM_Notify_Events
Ne pas oublier le chemin de l'include à adapter !
Je rectifie ce que j'ai écrit, WM_Notify_Events fonctionne bien mais la particularité de GUICtrlCreateContextMenu() est de réagir que sur les clics droits
Vous avez un code similaire ici https://www.autoitscript.fr/forum/viewt ... 58#p102358
Je rajoute l'include où j'ai du commenter 5 lignes qui sont en doublons avec un autre include
Fichiers joints
ModernMenuRaw.au3
(96.12 Kio) Téléchargé 265 fois
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Menu contextuel avec icônes

#3

Message par walkson »

Une autre possibilité est d'utiliser une ImageList qui alimentera une Listview et le ContextMenu
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <EditConstants.au3>
#include ".\modern_menu_1\ModernMenuRaw.au3"
; ========================================================================
; Global variables
; ========================================================================
Global $aHit, $hListView

; ========================================================================
; Main
; ========================================================================

$hGUI = GUICreate('Context Menu Demo (right Click)', 400, 400)
$Edit = GUICtrlCreateEdit("",0, 280,400, 130, $ES_WANTRETURN)
$iListView = GUICtrlCreateListView("", 2, 2, 394, 268)
GUICtrlSetBkColor(-1, 0xB9D1EA)
$hListView = GUICtrlGetHandle($iListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_TRACKSELECT))
Global $ContextMenu = GUICtrlCreateContextMenu($iListView)
_SetMenuIconBkColor(0x99EE99)
_SetMenuTextColor(0xFF0000)
$sidemenu = _CreateSideMenu($ContextMenu)
_SetSideMenuText($sidemenu, "Menu")
_SetSideMenuBkColor($sidemenu, 0xFF3030)
_SetSideMenuBkGradColor($sidemenu, 0xFFDDDD)

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Load images
$hImage = _GUIImageList_Create(32,32,5) ; 16x16 Use a 32 bit DIB section
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 131);0
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 132);1
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 250);2
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 137);3
_GUIImageList_AddBitmap($hImage, @SystemDir & "\migwiz\PostMigRes\Web\base_images\WindowsOutlookExpress.bmp");4
_GUIImageList_AddBitmap($hImage, @SystemDir & "\migwiz\PostMigRes\Web\base_images\WindowsMail.bmp");5
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 32, 32));6
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 32, 32));7
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add menu items
   Local $hIcon0 = _GUIImageList_GetIcon( $hImage, 1 )
   Local $hIcon1 = _GUIImageList_GetIcon( $hImage, 0 )
   Local $hIcon2 = _GUIImageList_GetIcon( $hImage, 2 )
   Global $Ren = _GUICtrlCreateODMenuItem( "Rename", $ContextMenu , $hIcon0, 0 )
   Global $Del = _GUICtrlCreateODMenuItem( "Dell", $ContextMenu , $hIcon1, 0 )
   Global $AddCtx = _GUICtrlCreateODMenuItem( "Add", $ContextMenu , $hIcon2, 0 )
; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1",3)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1,4)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2, 5)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 6)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1,7)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 3)


GUISetState()

; Loop until user exits
While 1
$msg = GUIGetMsg()
Switch $msg
   Case   $GUI_EVENT_CLOSE
      Exit
   Case $AddCtx
   Local $inputb = InputBox('Nouveau', "nom de l'item")
    If not @error Then
        _GUICtrlListView_AddItem ($hListView, $inputb, Random(0,7,1))
    EndIf
   Case $Ren
      $s_text = "Renommer Item : " & $aHit[0] &"-"& $aHit[1]
      _DebugPrint($s_text,@ScriptLineNumber)
      $itemimage = _GUICtrlListView_GetItemImage ( $hListView, $aHit[0],$aHit[1]) ;récupère l'image
      If $itemimage = - 1 Then $itemimage = Random(0,7,1)
      Local $inputb = InputBox('Renommer', "nom de l'item")
      If not @error Then
         _GUICtrlListView_SetItem ($hListView, $inputb, $aHit[0],$aHit[1], $itemimage)
      EndIf
   Case $Del
      $s_text = "Supprimer Item : " & $aHit[0] &"-"& $aHit[1]
      _DebugPrint($s_text,@ScriptLineNumber)


EndSwitch

WEnd

Func ListView_RClick($rep)


    If $rep >= 0 Then ;ajout impossible

      GUICtrlSetState($AddCtx, $GUI_DISABLE)
      GUICtrlSetState($Ren, $GUI_ENABLE)
      GUICtrlSetState($Del, $GUI_ENABLE)

   Else ;clic hors items ajout possible

      GUICtrlSetState($AddCtx, $GUI_ENABLE)
      GUICtrlSetState($Ren, $GUI_DISABLE)
      GUICtrlSetState($Del, $GUI_DISABLE)
    EndIf

EndFunc   ;==>ListView_RClick


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
   ; $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
            Case $NM_RCLICK
               $aHit = _GUICtrlListView_SubItemHitTest($hListView) ;item et subitem
               $rep = $aHit[0]
                    ListView_RClick($rep)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    GUICtrlSetData($Edit,  _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
   GUICtrlSetFont($Edit,12)
EndFunc   ;==>_DebugPrint
Ce qui nous donne en image
Sans titre.png
A noter que ModernMenuRaw.au3 fonctionne avec les ID et non avec les Handles d'où l'obligation d'utiliser GUICtrlCreateContextMenu()
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Menu contextuel avec icônes

#4

Message par jpascal »

Bonjour walkson,

Désolé pour ma réponse tardive mais j'étais pris par le travail. :(

J'avais finalement trouvé la même solution que toi à savoir créer le menu hors de la fonction WM_NOTIFY.
J'avais également modifié le fichier ModernMenuRaw.au3 en commentant un certain nombre de lignes redondantes avec APIShellExConstants.au3

J'ai testé ton premier exemple mais la fonction WM_Notify_Events ne semble pas fonctionner (les menus ne sont pas modifiés).
Le second est sympa et l'idée de l'ImageList intéressante.

Encore merci pour le temps passé à m'apporter une solution. :)
Fichiers joints
ModernMenuRaw.au3
(96.25 Kio) Téléchargé 243 fois
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre