Página 1 de 1

Mostrar menú cuando clic derecho solo en Listview item

Publicado: 22 May 2014, 23:00
por yasmany
Hola a todos, habrá la posibilidad de hacer clic derecho únicamente sobre un ítem del Listview aparezca el menú con la opción abrir y de acuerdo al ítem seleccionado abra el valor que indica la primera columna, hasta el momento no lo he conseguido, espero vuestra ayuda.

Código: Seleccionar todo

#NoTrayIcon
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <GuiTab.au3>
#include <GuiListView.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
#include <ListviewConstants.au3>
Global $tab, $lista, $contextmenu, $buttoncontext, $btnSalir

$interfaz = GUICreate("Avy", 620, 405, -1, -1, -1, $ws_ex_acceptfiles)
$btnSalir = GUICtrlCreateButton("&Salir", 550, 355, 60, 25)

$tab = GUICtrlCreateTab(10, 100, 600, 250, $WS_MAXIMIZEBOX, $WS_EX_APPWINDOW)
$itemRegistroDeSucesos = GUICtrlCreateTabItem("Registro de sucesos")

$lista = GUICtrlCreateListView("Deteccion |Tipo |Estado ", 18, 150, 575, 190, -1);;
GUICtrlSetState($lista, $GUI_SHOW)
GUICtrlCreateListViewItem("C:\Windows  |Datos|Datos", $lista)
GUICtrlCreateListViewItem("C:\Program Files  |Datos|Datos", $lista)
GUICtrlCreateListViewItem("C:\Usuarios  |Datos|Datos", $lista)

Local $contextmenu = GUICtrlCreateContextMenu()
Local $buttoncontext = GUICtrlCreateContextMenu($lista)
GUICtrlCreateMenuItem("Abrir", $buttoncontext)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg

		Case $GUI_EVENT_CLOSE, $btnSalir
			Exit
	EndSwitch

WEnd

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 15:15
por yasmany
Bueno he intentado algo muy cercano a lo que quería pero aun no cumple mi expectativa.
Solo aparece el menuContextual cuando hago clic derecho en el ListView y ListViewItem pero solo abre el fichero cuando existe un item seleccionado.
Como podría obviar que no aparezca el menuContextual al dar clic derecho en el ListView para que solo cuando se dé clic derecho en un item aparesca el menu.?

Código: Seleccionar todo

#NoTrayIcon
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <GuiTab.au3>
#include <GuiListView.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
#include <ListviewConstants.au3>
Global $tab, $lista, $contextmenu, $btnSalir, $index,$ruta
Local $a, $i,  $contextmenu

$interfaz = GUICreate("Avy", 620, 405, -1, -1, -1, $ws_ex_acceptfiles)
$btnSalir = GUICtrlCreateButton("&Salir", 550, 355, 60, 25)

$tab = GUICtrlCreateTab(10, 100, 600, 250, $WS_MAXIMIZEBOX, $WS_EX_APPWINDOW)
$itemRegistroDeSucesos = GUICtrlCreateTabItem("Registro de sucesos")

$lista = GUICtrlCreateListView("Deteccion |Tipo |Estado ", 18, 150, 575, 190, -1);;
GUICtrlSetState($lista, $GUI_SHOW)
GUICtrlCreateListViewItem("C:\Windows  |principal|sistema", $lista)
GUICtrlCreateListViewItem("C:\Program Files  |carpeta|programas", $lista)
GUICtrlCreateListViewItem("C:\Users  |Usuarios|Windows", $lista)
GUICtrlCreateListViewItem("C:\Users\Admin\Desktop\pruebita  |Escritorio|borrable", $lista)
Local $buttoncontext = GUICtrlCreateContextMenu($lista)
Local $abrirRutaDeRegistro = GUICtrlCreateMenuItem("Abrir elemento", $buttoncontext)
Local $excluir = GUICtrlCreateMenuItem("Agregar a la lista de exclusiones", $buttoncontext)

GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $btnSalir
			Exit
		Case $abrirRutaDeRegistro
			For $i = 0 To _GUICtrlListView_GetItemCount($lista) - 1
				If _GUICtrlListView_GetItemSelected($lista, $i) = True Then
					$ruta = _GUICtrlListView_GetItemText($lista, $i)
					If FileExists($ruta) = 1 Then
						ShellExecute($ruta,"","","OPEN")
					Else
						MsgBox(16, "Aviso", "La direccion registrada ya no existe.", -1, $interfaz)
					EndIf
				EndIf
			Next
	EndSwitch
WEnd

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 21:02
por yasmany
Alguien disponible? :smt024

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 21:10
por Dany
usando google :S

EDIT: 30 segundos googleando

Código: Seleccionar todo

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

;basic GUI
Global $GUI = GUICreate("", 300, 450)
Global $hListView = GUICtrlCreateListView("A|B|C|D|E|F|G", 25, 25, 250, 400)
For $i = 0 To 20
    GUICtrlCreateListViewItem("A" & $i & "|B" & $i & "|C" & $i & "|D" & $i & "|E" & $i & "|F" & $i & "|G" & $i, $hListView)
Next

;Context Menu
Global $hCMenu = GUICtrlCreateContextMenu($hListView) ;add a context menu to the listview. I don't think you can add a seperate one to each item unless you write your own function.
Global $hCMenuText = GUICtrlCreateMenuItem("Get Text", $hCMenu) ;add the get text option to the menu.
Global $sItemText ;this will store the text of the last right-clicked item.

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;This intercepts the Notification windows sends your GUI when you right click the listview (and many others) amd sends it to the "WM_NOTIFY" function.

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $hCMenuText
            _ShowText()
    EndSwitch
WEnd

;All Notify messages for your GUI will be send to this function.
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo

    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    ;$ilParam is a pointer. This reads what's at that adress. (not sure why the name suggests its an int)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom ;Check what control triggered the msg
        Case $hWndListView ;If it was the listview...
            Switch $iCode ;Check what action triggered the msg
                Case $NM_RCLICK ;If it was a right click...
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam) ;get the information about the item clicked.
                    $sItemText =  _GUICtrlListView_GetItemText($hWndListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem")) ;store the item text in a global variable in case the get text option is clicked.
                    ;You could also just store the Index and SubItem values, the entire $tInfo struct, or whatever works best for you.

                    ;Uncomment the next part to get more information about your click.
;~                  _DebugPrint("$NM_RCLICK" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
;~                          "-->IDFrom:" & @TAB & $iIDFrom & @LF & _
;~                          "-->Code:" & @TAB & $iCode & @LF & _
;~                          "-->Index:" & @TAB & DllStructGetData($tInfo, "Index") & @LF & _
;~                          "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @LF & _
;~                          "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @LF & _
;~                          "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @LF & _
;~                          "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @LF & _
;~                          "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @LF & _
;~                          "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @LF & _
;~                          "-->lParam:" & @TAB & DllStructGetData($tInfo, "lParam") & @LF & _
;~                          "-->KeyFlags:" & @TAB & DllStructGetData($tInfo, "KeyFlags"))

            EndSwitch
        EndSwitch

    ;Returning this allows the GUI to handle the messages in the usual way once you're done. Returning anything else will block default behavior. (giving you a largely unresponsive GUI)
    Return $GUI_RUNDEFMSG
EndFunc

Func _ShowText()
    MsgBox(0,"Test",$sItemText)
EndFunc

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @LF & _
            "+======================================================" & @LF & _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
EndFunc

Saludos

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 21:27
por yasmany
Ok Gracias Dany. Lo probaré en unas horas.
Luego comento. por cierto yo tambien andaba "Googleando" pero no encontraba.
¿Como buscaste?

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 21:33
por Dany

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 23:35
por yasmany
BUENO ESTUVO bueno el ejemplo, pero realiza lo mismo que el código que ya tenía planteado.
Lo adapte a mi code y es igual, el contexMenu aparece asi haga clic en cualquier parte del CONTROL LISTVIEW.
Muchas gracias Dany por ayudar :smt001 :smt024

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 23 May 2014, 23:48
por Dany
A yaaaaaaaaaaaa te refieres a esto....

Código: Seleccionar todo

#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>

; ========================================================================
; Global variables
; ========================================================================

Global Enum $idOpen = 1000, $idSave, $idInfo

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

$hGUI = GUICreate('Context Menu Demo (Right Click)', 400, 300)
$hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; 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", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

GUISetState()

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func ListView_RClick()
    Local $aHit

    $aHit = _GUICtrlListView_SubItemHitTest($hListView)
    If ($aHit[0] <> -1) Then
        ; Create a standard popup menu
        ; -------------------- To Do --------------------
        $hMenu = _GUICtrlMenu_CreatePopup()
        _GUICtrlMenu_AddMenuItem($hMenu, "Open", $idOpen)
        _GUICtrlMenu_AddMenuItem($hMenu, "Save", $idSave)
        _GUICtrlMenu_AddMenuItem($hMenu, "Info", $idInfo)
        ; ========================================================================
        ; Shows how to capture the context menu selections
        ; ========================================================================
        Switch _GUICtrlMenu_TrackPopupMenu($hMenu, $hListView, -1, -1, 1, 1, 2)
            Case $idOpen
                _DebugPrint("Open: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idSave
                _DebugPrint("Save: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idInfo
                _DebugPrint("Info: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
        EndSwitch
        _GUICtrlMenu_DestroyMenu($hMenu)
    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 ; Sent by a list-view control when the user clicks an item with the left mouse button
                    ListView_RClick()
                    Return 0
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @LF & _
            "+======================================================" & @LF & _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
EndFunc   ;==>_DebugPrint

Saludos

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 24 May 2014, 00:23
por yasmany
Exacto! :smt026
Ahora lo adapto y comento, gracias :smt001
:smt024

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 24 May 2014, 01:10
por yasmany
El ejemplo es excelente pero se me dificulta adaptarlo, pero sigo intentando. Lo adapté pero ni siquiera me sale el contextmenù.
que deshabil que soy :smt017

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 24 May 2014, 17:17
por Dany
Ahi tienes medio adactado.

Código: Seleccionar todo

#NoTrayIcon
#include <GuiMenu.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <GuiTab.au3>
#include <GuiListView.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
#include <ListviewConstants.au3>
Global $tab, $lista, $contextmenu, $buttoncontext, $btnSalir,$hListView
Global Enum $idOpen = 1000, $idSave, $idInfo

$interfaz = GUICreate("Avy", 620, 405, -1, -1, -1, $ws_ex_acceptfiles)
$btnSalir = GUICtrlCreateButton("&Salir", 550, 355, 60, 25)

$tab = GUICtrlCreateTab(10, 100, 600, 250, $WS_MAXIMIZEBOX, $WS_EX_APPWINDOW)
$itemRegistroDeSucesos = GUICtrlCreateTabItem("Registro de sucesos")

$lista = GUICtrlCreateListView("Deteccion |Tipo |Estado ", 18, 150, 575, 190, -1);;
$hListView=GUICtrlGetHandle($lista)
GUICtrlSetState($lista, $GUI_SHOW)
GUICtrlCreateListViewItem("C:\Windows  |Datos|Datos", $lista)
GUICtrlCreateListViewItem("C:\Program Files  |Datos|Datos", $lista)
GUICtrlCreateListViewItem("C:\Usuarios  |Datos|Datos", $lista)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg

      Case $GUI_EVENT_CLOSE, $btnSalir
         Exit
   EndSwitch

WEnd

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 ; Sent by a list-view control when the user clicks an item with the left mouse button
                    ListView_RClick()
                    Return 0
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Func ListView_RClick()
    Local $aHit

    $aHit = _GUICtrlListView_SubItemHitTest($hListView)
    If ($aHit[0] <> -1) Then
        ; Create a standard popup menu
        ; -------------------- To Do --------------------
        $hMenu = _GUICtrlMenu_CreatePopup()
        _GUICtrlMenu_AddMenuItem($hMenu, "Open", $idOpen)
        _GUICtrlMenu_AddMenuItem($hMenu, "Save", $idSave)
        _GUICtrlMenu_AddMenuItem($hMenu, "Info", $idInfo)
        ; ========================================================================
        ; Shows how to capture the context menu selections
        ; ========================================================================
        Switch _GUICtrlMenu_TrackPopupMenu($hMenu, $hListView, -1, -1, 1, 1, 2)
            Case $idOpen
                _DebugPrint("Open: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idSave
                _DebugPrint("Save: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idInfo
                _DebugPrint("Info: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
        EndSwitch
        _GUICtrlMenu_DestroyMenu($hMenu)
    EndIf
EndFunc   ;==>ListView_RClick

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @LF & _
            "+======================================================" & @LF & _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
EndFunc   ;==>_DebugPrint


Revisa el código quizás tenga errores...


Saludos :smt027

Re: Mostrar menú cuando clic derecho solo en Listview item

Publicado: 24 May 2014, 20:50
por yasmany
Gracias Dany, está muy bien, acabé de adaptarlo al código original y funciona bien, en cuanto termine te indicaré todo el code desarrollado. :smt001 GRACIAS