Treeview - Mausklick erkennen

  • Es gibt wirklich tolle Bsp. in der Hilfe und hier im Forum zu Treeviews. Leider bauen aber alle nur Listen auf, egal ob Verzeichnisse (dynamisch) oder eigene Einträge ohne jedoch zu zeigen, wie man anhand eines Mausklicks den selectierten Wert in eine Variable zum weiterverarbeiten bekommt. Zum Bsp. im TV eine Ordnerliste und daneben in einer Liste die Dateien.
    Ich hab das so zwar hinbekommen, aber ich weiß nicht, wo
    Nehmen wir das Bsp. von

    [autoit]

    GUICtrlCreateTreeView

    [/autoit]

    . Da funktioniert es, weil die TV-Items direkt übergeben werden und man diese 'beim Namen' ansprechen kann. Ab bei folgendem Bsp. von Oskar TreeView-(Un)Checked-Example , bekomme ich es einfach nicht hin. Buttons kann man einfach als Ausdruck bei Case angeben, aber was von einem Treeview?
    Mit Sicherheit ist das auch ein kleineres Problem, aber ich komme einfach nicht drauf. Wäre schon, wenn jemand einen Tipp anhand des verlinkten Bsp. hätte.

    Einmal editiert, zuletzt von Ophthalamia (16. Dezember 2010 um 22:22) aus folgendem Grund: Funktioniert jetzt perfekt!

  • Hi,
    dafür gibt es diese schöne UDF (Link)

    //Edit: Hier noch ein Beispiel

    Spoiler anzeigen
    [autoit]

    #include <GUITreeview.au3>
    #include "RegisterNotify_UDF.au3"
    #include <WindowsConstants.au3>

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

    GUICreate("")
    $TreeView = GUICtrlCreateTreeView(48, 64, 257, 241)
    $hTreeview = GUICtrlGetHandle($TreeView)
    GUISetState(@SW_SHOW)

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

    For $x = 0 To 10
    GUICtrlCreateTreeViewItem($x, $TreeView)
    Next

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

    _Notify_SetNotifytoFunc($hTreeview, $NM_DBLCLK, "Notify")
    _StartUp_Notify(True)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    _StartUp_Notify(False)
    Exit

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

    EndSwitch
    WEnd

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

    Func Notify($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    $hSelect = _GUICtrlTreeView_GetSelection($hTreeview)
    If $hSelect = 0 Then Return
    $sText = _GUICtrlTreeView_GetText($hTreeview, $hSelect)

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

    ConsoleWrite("Du hast auf " & $sText & " geklickt" & @CRLF)

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

    EndFunc ;==>Notify

    [/autoit]
    • Offizieller Beitrag

    Oder ohne spezielle UDF:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("Test", 300, 400)
    $hTreeView = GUICtrlCreateTreeView(10, 10, 280, 300)
    For $i = 0 To 9
    GUICtrlCreateTreeViewItem(Random(1000, 9999, 1), $hTreeView)
    Next
    $hTreeViewClick = GUICtrlCreateDummy()
    $hTreeViewDblClick = GUICtrlCreateDummy()

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

    $hLabel = GUICtrlCreateLabel("Angeklickte Zahl: ", 10, 340, 140, 16)
    GUICtrlSetBkColor(-1, 0xFFFF44)
    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hTreeViewClick
    $hItem = _GUICtrlTreeView_GetSelection($hTreeView)
    $sText = _GUICtrlTreeView_GetText($hTreeView, $hItem)
    GUICtrlSetData($hLabel, "Angeklickte Zahl: " & $sText)
    Case $hTreeViewDblClick
    $hItem = _GUICtrlTreeView_GetSelection($hTreeView)
    $sText = _GUICtrlTreeView_GetText($hTreeView, $hItem)
    MsgBox(0, "Doppelklick", "Angeklickte Zahl: " & $sText)
    EndSwitch
    WEnd

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $tNMHDR, $hWndFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case GUICtrlGetHandle($hTreeView)
    Switch $iCode
    Case $NM_CLICK ; The user has clicked the left mouse button within the control
    GUICtrlSendToDummy($hTreeViewClick)
    Return 0 ; zero to allow the default processing
    Case $NM_DBLCLK ; The user has double-clicked the left mouse button within the control
    GUICtrlSendToDummy($hTreeViewDblClick)
    Return 0 ; zero to allow the default processing
    Case $NM_RCLICK ; The user has clicked the right mouse button within the control
    Return 0 ; zero to allow the default processing
    Case $NM_RDBLCLK ; The user has clicked the right mouse button within the control
    Return 0 ; zero to allow the default processing
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • dafür gibt es diese schöne UDF (Link)

    UDF hab ich jetzt schon mehrmals gelesen, daß es das gibt. Aber was es genau ist, weiß ich noch nicht. Aber das schaue ich mir jetzt mal mit genauer an.

  • Oder ohne spezielle UDF:

    Da ich ein anderes Bsp. von dir schon zum testen genommen habe, habe ich das in mein Testprojekt eingebunden und wie zu erwarten... funktioniert es. Super und THX!

  • ... weil ich immer noch immer wieder überrascht bin, was in AU3 ohne die UDFs so alles geht (oder auch nicht geht):

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $hGui = GUICreate("Test", 300, 400)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $idTreeView = GUICtrlCreateTreeView(10, 10, 280, 300)
    $idRoot1 = GUICtrlCreateTreeViewItem("C:", $idTreeView)
    GUICtrlSetOnEvent(-1, "_TVClicked")
    For $I = 0 To 5
    GUICtrlCreateTreeViewItem(Random(1000, 9999, 1) & ".txt", $idRoot1)
    GUICtrlSetOnEvent(-1, "_TVClicked")
    Next
    $idRoot2 = GUICtrlCreateTreeViewItem("Windows", $idRoot1)
    GUICtrlSetOnEvent(-1, "_TVClicked")
    For $I = 0 To 5
    GUICtrlCreateTreeViewItem(Random(1000, 9999, 1) & ".txt", $idRoot2)
    GUICtrlSetOnEvent(-1, "_TVClicked")
    Next
    GUICtrlCreateLabel("Ausgewähltes Item: ", 10, 340, 140, 16)
    GUICtrlSetColor(-1, 0x000080)
    $idItem = GUICtrlCreateInput("", 10, 356, 140, 20, $ES_READONLY)
    GUICtrlSetColor(-1, 0x000080)
    GUISetState()

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

    GUICtrlSetData($idItem, StringReplace(ControlTreeView($hGui, "", $idTreeView, "GetSelected"), "|", "\"))

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

    While True
    Sleep(1000)
    WEnd

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

    Func _TVClicked()
    GUICtrlSetData($idItem, StringReplace(ControlTreeView($hGui, "", $idTreeView, "GetSelected"), "|", "\"))
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]