ContextMenuItems mit GuiGetMsg

  • Hey:)

    wollte bei ner Übersicht in nem Listview bei rechtsklick auf ein Item ein ContextMenu anzeigen lassen.

    Soweit kein Problem nur ich bekomms nicht hin, dass sobald ein item angeklickt wurde i was gemacht wird,....jemand ne idee?

    hier n bsp aus dem netz.Wie bekommt man dann dort ne Funktion rein?

    Spoiler anzeigen
    [autoit]

    #include
    #include
    #include
    ;~ Opt('MustDeclareVars', 1)
    ;Rechtsklick auf das listview
    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Dim $lol[1], $list[1], $Size[1], $Date[1]
    Dim $listview
    $search = FileFindFirstFile($Finished & "\*.*")
    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf
    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd
    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next
    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next
    ; Close the search handle
    FileClose($search)
    _Gui()
    Func _Gui()
    Local $hGui, $item1, $item2, $item3, $nMsg
    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color
    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt
    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next
    GUISetState() ; Gui anzeigen
    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    EndSwitch
    WEnd
    EndFunc ;==>_Gui
    ;********************************************
    ; Rechtsklick auf das listview *
    ;********************************************

    [/autoit]
  • also, steig auf jedem fall auf den OnEvent mode um!

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI = GUICreate("", 450, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    $listview = GUICtrlCreateListView("Spalte1 |Spalte2|Spalte3", 10, 10, 430, 280)

    [/autoit] [autoit][/autoit] [autoit]

    $item1 = GUICtrlCreateListViewItem("Eintrag2|Spalte22|Spalte23", $listview)
    _GUICtrlCreateContextMenu($item1)
    $item2 = GUICtrlCreateListViewItem("Eintrag1|Spalte12|Spalte13", $listview)
    _GUICtrlCreateContextMenu($item2)
    $item3 = GUICtrlCreateListViewItem("Eintrag3|Spalte32|Spalte33", $listview)
    _GUICtrlCreateContextMenu($item3)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(200)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _GUICtrlCreateContextMenu($cContextMenu)
    Local $cContextMenuX = GUICtrlCreateContextMenu($cContextMenu)
    GUICtrlCreateMenuItem("Item Info", $cContextMenuX)
    GUICtrlSetOnEvent(-1, "_Click")
    GUICtrlCreateMenuItem("Item Löschen", $cContextMenuX)
    GUICtrlSetOnEvent(-1, "_DeleteItem")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Click()
    MsgBox(0, "Click", "CtrlID des Items: " & GUICtrlRead($listview) &@CR& "Text des Items: " & GUICtrlRead(GUICtrlRead($listview)) )
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DeleteItem()
    GUICtrlDelete(GUICtrlRead($listview))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]


    das mal als beispiel wie das geht^^
    wie du siehst erstelle ich das Contextmenü in einer Funktion, dass mache ich, damit es weniger Code ist, besser als es 100x zu kopieren und anzupassen :)

    mfg

  • nur ich bekomms nicht hin, dass sobald ein item angeklickt wurde i was gemacht wird,....jemand ne idee?


    Ich habe das Skript mal um eine WM_Notify-Eventhandler ergänzt:

    Spoiler anzeigen
    [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    ;Opt('MustDeclareVars', 1)
    ;Rechtsklick auf das listview
    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Dim $lol[1], $list[1], $Size[1], $Date[1]
    Dim $listview
    $search = FileFindFirstFile($Finished & "\*.*")
    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf
    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd
    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next
    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next
    ; Close the search handle
    FileClose($search)
    _Gui()
    Func _Gui()
    Local $hGui, $item1, $item2, $item3, $nMsg
    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color
    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt
    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next
    GUISetState() ; Gui anzeigen
    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    EndSwitch
    WEnd
    EndFunc ;==>_Gui

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_Notify_Events($hWnd, $MsgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $listview Then
    ;ConsoleWrite($code & @CRLF)
    Switch $code
    ;case $NM_CLICK,$NM_DBLCLK, ;Klick
    Case $NM_RCLICK ;Rechtsklick
    If _GUICtrlListView_GetSelectedCount($listview) > 0 Then
    For $i = 0 To _GUICtrlListView_GetItemCount($listview)
    If _GUICtrlListView_GetItemSelected($listview, $i) Then
    $aItem = _GUICtrlListView_GetItemTextArray($listview, $i)
    MsgBox(0, "Rechts-Klick auf ", $aItem[1] & @CRLF & @CRLF & $aItem[2])
    EndIf
    Next
    EndIf
    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    mfg autoBert