GUICtrlCreateTreeView - RechtsKlick Menü - Fehler mit Auswahl

  • Hey Leute, ich hab leider wieder ein Problem...

    ein relativ kleiner aber nerviger Fehler....:(

    [autoit]

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

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

    Opt("guiOnEventMode", 1)

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

    $hGui = GUICreate('FileExplorer', 400, 400)
    $hTreeview = GUICtrlCreateTreeView(10, 10, 380, 360)
    $hWndTreeview = GUICtrlGetHandle($hTreeview)
    $hOk = GUICtrlCreateButton('Ok', 240, 375, 60, 22)
    $hCancel = GUICtrlCreateButton('Cancel', 320, 375, 60, 22)

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

    ;erstelle KontextMenü...
    $cm_process = GUICtrlCreateContextMenu($hTreeview)
    GUICtrlCreateMenuitem("RUN", $cm_process)
    GUICtrlSetOnEvent(-1, "_Run")

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

    ;Zuordnung der Icons...
    $hImage = _GUIImageList_Create(16, 16, 5, 1)
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 3) ; Verzeichnis-Icon
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 110) ; Verzeichnis-Icon mit Haken
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 1) ; Datei-Icon
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 5) ; Diskette
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 7) ; Wechseldatenträger
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 8) ; Festplatte
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 11) ; CDROM
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 12) ; Netzwerklaufwerk
    _GUIImageList_AddIcon($hImage, 'shell32.dll', 53) ; Unbekannt
    _GUICtrlTreeView_SetNormalImageList($hTreeview, $hImage)

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

    GUISetState()
    GUICtrlSetStyle($hTreeview, Default, $WS_EX_COMPOSITED + $WS_EX_CLIENTEDGE)

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

    $aDrives = DriveGetDrive('ALL') ;
    ToolTip('Please wait...', Default, Default, 'Read Directory', 1)
    For $i = 1 To $aDrives[0]
    $iLWindex = 0
    ;Wähle Symbol aus, welches unten dann verknüpft wird...
    Switch DriveGetType($aDrives[$i]) ;
    Case 'Fixed'
    $iLWindex = 5
    Case 'CDROM'
    $iLWindex = 6
    Case 'RAMDisk'
    $iLWindex = 7
    Case 'Removable'
    $iLWindex = 4
    If StringLeft($aDrives[$i], 2) = 'a:' Or StringLeft($aDrives[$i], 2) = 'b:' Then $iLWindex = 3
    Case Else
    $iLWindex = 8
    EndSwitch
    ;Füge Eintrag in Liste hinzu...
    $hRoot = _GUICtrlTreeView_Add($hTreeview, $hTreeview, StringUpper($aDrives[$i]), $iLWindex, $iLWindex)
    If DriveStatus($aDrives[$i]) <> 'READY' Then ContinueLoop ;
    _GUICtrlTreeView_BeginUpdate($hTreeview)
    _GUICtrlTreeView_FileExplorerRecursive($hTreeview, $hRoot, $aDrives[$i], 1)
    _GUICtrlTreeView_EndUpdate($hTreeview)
    Next
    ToolTip('')

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

    ;Rüft '_WM_NOTIFY' auf, wenn auf + geklickt...
    GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
    While True

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $hCancel
    Exit
    Case $hOk
    EndSwitch
    WEnd

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

    Func _run()
    $iSelect = _GUICtrlTreeView_GetSelection($hTreeview)
    $sTree = StringReplace(_GUICtrlTreeView_GetTree($hTreeview, $iSelect), '|', '\')
    MsgBox(0, 'Selected Path/File', $sTree)
    EndFunc

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

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    GUIRegisterMsg($WM_NOTIFY, '')
    Local $hWndFrom, $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    $iCode = DllStructGetData($tNMHDR, 'Code')
    If $hWndFrom = $hWndTreeview And $iCode = $NM_CLICK Then
    ToolTip('Please wait...', Default, Default, 'Read Directory', 1)
    _GUICtrlTreeView_FileExplorer($hGui, $hTreeview)
    ToolTip('')
    EndIf
    GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY

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

    Func _GUICtrlTreeView_FileExplorer($hGui, $hTreeview)
    Local $aTVPos, $aPos, $hItem, $hChild, $sTree
    $aTVPos = ControlGetPos($hGui, '', $hTreeview)
    $aPos = GUIGetCursorInfo($hGui)
    $hItem = _GUICtrlTreeView_HitTestItem($hTreeview, $aPos[0], $aPos[1] - $aTVPos[1])
    If _GUICtrlTreeView_GetExpanded($hTreeview, $hItem) Then Return
    $hChild = _GUICtrlTreeView_GetFirstChild($hTreeview, $hItem)
    If $hChild <> 0 Then
    _GUICtrlTreeView_BeginUpdate($hTreeview)
    $sTree = StringReplace(_GUICtrlTreeView_GetTree($hTreeview, $hChild), '|', '\')
    _GUICtrlTreeView_DeleteChildren($hTreeview, $hChild)
    _GUICtrlTreeView_FileExplorerRecursive($hTreeview, $hChild, $sTree, 1)
    Do
    $hChild = _GUICtrlTreeView_GetNextChild($hTreeview, $hChild)
    If $hChild <> 0 Then
    $sTree = StringReplace(_GUICtrlTreeView_GetTree($hTreeview, $hChild), '|', '\')
    _GUICtrlTreeView_DeleteChildren($hTreeview, $hChild)
    $iTimer = TimerInit()
    _GUICtrlTreeView_FileExplorerRecursive($hTreeview, $hChild, $sTree, 1)
    EndIf
    Until $hChild = 0
    _GUICtrlTreeView_EndUpdate($hTreeview)
    EndIf
    EndFunc ;==>_GUICtrlTreeView_FileExplorer

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

    Func _GUICtrlTreeView_FileExplorerRecursive($hTreeview, $hItem, $sPath, $iRec)
    Local $aDirList, $aFileList, $tmp
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $iRec -= 1
    $aDirList = _MyFileListToArray($sPath, 2)
    If IsArray($aDirList) Then
    For $sDir In $aDirList
    $tmp = _GUICtrlTreeView_AddChild($hTreeview, $hItem, $sDir, 0, 1)
    If $iRec > 0 Then _GUICtrlTreeView_FileExplorerRecursive($hTreeview, $tmp, $sPath & $sDir, $iRec)
    Next
    EndIf
    $aFileList = _MyFileListToArray($sPath, 1)
    If IsArray($aFileList) Then
    For $sFile In $aFileList
    $tmp = _GUICtrlTreeView_AddChild($hTreeview, $hItem, $sFile, 2, 2)
    Next
    EndIf
    EndFunc ;==>_GUICtrlTreeView_FileExplorerRecursive

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

    Func _MyFileListToArray($sPath, $iFlag)
    Local $sFileList = '', $hSearch, $sFile
    $hSearch = FileFindFirstFile($sPath & '*') ;
    If @error Then Return
    While True
    $sFile = FileFindNextFile($hSearch) ;
    If @error Then ExitLoop
    If ($iFlag + @extended = 2) Then ContinueLoop
    $sFileList &= $sFile & '|'
    WEnd
    FileClose($hSearch) ;
    If $sFileList = '' Then Return
    Return StringSplit(StringTrimRight($sFileList, 1), '|', 2)
    EndFunc ;==>__FileListToArray

    [/autoit]

    Wenn ich, ohne dass ich vorher mit dem Linken Mausklick den Ordner angeklickt habe, ihn mit der Rechten Maustaste anklicke, erkennt er den MOMENTAN geklickten NICHT sondern den, der letztes mal geklickt wurde... (RUN-Funktion...)

    Es ist also so, also würde er sich nicht merken, auf Welchen Ordner jetzt Rechts geklickt wurde....

    kann mir da jemand helfen...??

    Danke!!

    Einmal editiert, zuletzt von Mr_gitarre (10. Oktober 2010 um 13:35) aus folgendem Grund: Danke an kleiner...!!! *in Nachtgebet mit einschließ

  • es funktioniert: ja...

    Mein problem ist folgendes:

    Ich klicke einen Ordner mit der Rechten Maustaste an, klicke dann auf RUN und lasse mir den Pfad zu diesem Ordner anzeigen DOCH was wird angezeigt?? NICHTS oder Der ordner, der VORHER angewählt wurde...!!!

    ----> ICH MUSS ALSO, wenn ich Rechte Maustaste auf einen Ordner machen will, ihn Erst mit der Linken Maustaste vorher anwählen...!!!!

    Hab ichs verständlich ausgedrückt...??j

    ---> kann man sowas nicht ändern, dass ich erst mit der Linken maustaste vorher anklicken muss, um ihn zu Fixieren...?? Weil das ist doch im Micosoft-Explorer auch nicht so...!

  • Hi!


    Schau die den befehl mal an!

    [autoit]

    _GUICtrlTreeView_ClickItem

    [/autoit]

    Eventuell eine kombo mit!

    [autoit]

    $WM_COMMAND

    [/autoit]


    oder...

    [autoit]

    GUIGetMsg

    [/autoit][autoit]

    GUISetOnEvent

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Rückgabewert

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

    Gibt je nach "advanced"-Parameter ein Ereignis oder ein Array zurück.
    Das zurückgegebene "Ereignis" ist die Control-ID des Controls, das die Nachricht sendet, oder es ist ein spezielles Ereignis (wie das Schließen oder Minimieren eines Fensters). Wenn keine Nachricht vorhanden ist, wird 0 als Ereignis zurückgegeben.
    Spezial ID Bemerkungen
    0 Kein Ereignis
    $GUI_EVENT_CLOSE die Dialogbox wird geschlossen (entweder durch einen bestimmten Button oder das Systemmenü).
    $GUI_EVENT_MINIMIZE die Dialogbox wird per Button in der Titelleiste minimiert.
    $GUI_EVENT_RESTORE die Dialogbox wird durch Klick auf das Taskleistensymbol wiederhergestellt.
    $GUI_EVENT_MAXIMIZE die Dialogbox wird per Button in der Titelleiste maximiert.
    $GUI_EVENT_MOUSEMOVE der Mauszeiger wurde bewegt
    $GUI_EVENT_PRIMARYDOWN die erste (linke) Maustaste wurde gedrückt
    $GUI_EVENT_PRIMARYUP die erste (linke) Maustaste wurde losgelassen
    $GUI_EVENT_SECONDARYDOWN die zweite (rechte) Maustaste wurde gedrückt
    $GUI_EVENT_SECONDARYUP die zweite (rechte) Maustaste wurde losgelassen
    $GUI_EVENT_RESIZED Dialogbox wurde neu aufgebaut.
    $GUI_EVENT_DROPPED Ende der Drag&Drop Aktion @GUI_DRAGID, @GUI_DRAGFILE und @GUI_DROPID werden verwendet, um die ID's bzw. Dateien der jeweiligen Controls zu ermitteln.
    Wird der "advanced"-Parameter verwendet, werden die Informationen in einem Array zurückgegeben:
    $array[0] = 0 oder Ereignis-ID oder Control-ID
    $array[1] = Der Fenster-Handle des Fensters, von dem das Ereignis gemeldet wird
    $array[2] = Der Control-Handle des Controls, von dem das Ereignis gemeldet wird (gegebenenfalls)
    $array[3] = Die aktuelle X-Position des Mauszeigers (relativ zum GUI-Fenster)
    $array[4] = Die aktuelle Y-Position des Mauszeigers (relativ zum GUI-Fenster)
    Wenn die GUIOnEventMode-Option auf 1 gesetzt ist, ist der Rückgabewert von GUIGetMsg immer 0, und @error wurde auf 1 gesetzt.
    Falls die Option GUIEventOptions auf 1 gesetzt ist, wird der Minimier-, Wiederherstell- und Maximier-Button nichts weiter tun, außer einer einfachen Benachrichtigung.

    [/autoit]

    Die Hilfe ist dein Freund...... ;)

    Lg Kleiner

  • also ich hab mir deinen Text jetzt etwa ne 4el stunde angeguckt und:

    Tut mir leid, aber ich weiß überhaupt nicht, worauf zu hinaus willst...

    Weil mein Problem ist ja, dass er nicht erkennt, dass ich auf ein Item ein Rechtsklick mache OHNE vorher mit Links geklickt zu haben... Und somit erkennt er nicht, auf welches Item jetzt Rechts geklickt wurde...!!

    ---> :(

  • Hi!


    Oscar hat in seiner Func o. er berechnet in seiner Func die Maus Position das machst du auch die beispiele von mir ist nur als anregung gedacht!

    Edit:/ von zeile 100 bis 105 ;)
    LG kleiner

  • also mit _WM_NOTIFY komm ich absolut nicht klar...

    Dann wäre ne Idee, das icon automatisch nochmal anzuwählen über die Maustaste, wobei ich hier auch nicht genau weiß wie es funktionieren sollte...
    Denn dann müsste ich eine Funktion mit dem Rechtsklick verknüpfen, dass er das Rechtsgeklickte nochmal mit links anklickt (wobei das Menü weggeht) ...????

    ...KURZ... Ich weiß es einfach nich, wie ich es wegbekomme...:(

    wäre schön, wenn du mir nen beispiel schreiben könntest... dafür wäre ich UNENDLICH DANKBAR°!!!

  • Hi!


    Das einfachste wehr! ;)

    Spoiler anzeigen
    [autoit]

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iCode, $tNMHDR, $aPos_
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    $iCode = DllStructGetData($tNMHDR, 'Code')
    $aPos_ = MouseGetPos()
    If $iCode = -5 Then
    If ControlClick($hGui, '', $hTreeview, 'primary', 2, $aPos_[0], $aPos_[1] - 10) And Sleep(50) Then MouseClick('right')
    EndIf
    If $hWndFrom = $hWndTreeview And $iCode = $NM_CLICK Then
    ToolTip('Please wait...', Default, Default, 'Read Directory', 1)
    _GUICtrlTreeView_FileExplorer($hGui, $hTreeview)
    ToolTip('')
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY

    [/autoit]

    LG Kleiner

  • Boa... Total übergenial...

    *Unendlich Dankbar bin!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Das isn Traum!!!!!!!!!!!!!!!!!!!!!


    Vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen ....vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen DANK!!!!!!!!!!!!!!!!

    Ich werde dich heute abend in mein Nachtgebet mit einschließen..:!!!!

    Theme -> Gelöst DANK KLEINER!!!!!