WM_Notify per Funktion

    • Offizieller Beitrag

    WM_Notify per Funktion
    Servus.

    Inspiriert durch eine Idee von BugFix, möchte ich euch meine neue UDF vorstellen.

    Notify_UDF, mit dieser UDF kann einer Notifikationen oder auch einem ControlHandle eine Funktion zugeordnet werden.

    Zur Funktionsweise:

    Mit _Notify_SetHandletoFunc kann die Auswertung von eingehenden Notify´s, die zu einem Control gehören,
    in eine Externe Funktion weiterleiten. In dieser Funktion kann kann dann die weitere Abfrage erfolgen. Optional
    kann _Notify_SetHandletoFunc auch ein Array mit den weiterzuleitenden Notify´s übergeben werden. Damit kann man schon
    eine Vorauswahl treffen, welche Notify´s überhaupt abgefangen und in die Funktion umgeleitet werden.
    Die Funktion _Notify_SetNotifytoFunc funktioniert auf die gleiche Weise wie _Notify_SetHandletoFunc, nur kann man damit
    einem Control und einem Notify eine Funktion zuordnen. Z.b. man will in einem Listview nur einen Doppelclick auswerten,
    würde das dann so in etwa aussehen: _Notify_SetNotifytoFunc($Listview,$NM_DBLCLK,"_Listview_Doppelklick").
    Bei einem Doppelklick wird dann die Funktion _Listview_Doppelklick aufgerufen. Die einzelnen Funktion müssen in ihrem
    Funktionskopf die Parameter $hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam haben.
    Mit _StartUp_Notify startet oder stoppt die WM_Notify Auswertung.

    Die Frage ist jetzt warum das ganze?

    - Man kann die Abfrage von WM_NOTIFY übersichtlicher gestalten.

    - Es ist aus meiner Sicht für einen Anfänger so leichter, WM_NOTIFY einzusetzten.
    Wenn man nur Standard Notify´s wie $NM_CLICK, $NM_DBLCLK braucht,muß man nur den auszuführenden Code in die zugeordnete
    Funktion schreiben. Man braucht sich nicht mit der weiteren Abfrage zu beschäftigen.

    - Will man in einer eigenen UDF auf WM_NOTIFY zugreifen wird der Verwaltungsaufwand minimiert.
    Spätere nutzer müssen nicht die WM_NOTIFY Funktion der UDF abändern, sondern könne per _Notify_SetHandletoFunc
    und _Notify_SetHandletoFunc die WM_NOTIFY Abfrage auf einfachste Weise erweitern.


    Eine Ausführliche Beschreibung der Funktionen findet ihr im Funktionskopf.
    Wie die Funktionen eingesetzt werden, geht hoffe ich aus dem Beispiel hervor.
    Ob diese UDF für euch Sinnvoll ist oder nicht, müßt ihr selbst entscheiden.

    Alte Version:
    autoit.de/wcf/attachment/6918/
    autoit.de/wcf/attachment/6919/

    Edit: Danke BugFix, für deine Erklärung in Post 3. :thumbup: Ich bin nicht so der Erklärungstyp 8o

    Edit: Version vom 21.12.2009

    Es gibt ein Neue Version.
    Die Auswertung der Notify´s wurde auf Scripting.Dictionary umgestellt. Somit wird die Notify Funktion noch schneller ausgeführt
    und so schnell wie möglich wieder verlassen. Es wurde ein GuiHandle Abfrage eingebaut. Betrifft ein Notify keine Gui oder Control
    das registriert wurde, so wird die Notify-Auswertung sofort verlassen. Um die GUI Registrierung muß man sich nicht kümmern, das
    wird Automatisch bei der Control - /Notifyregistrierung durchgeführt

    Edit: Version vom 22.12.2009

    Die Funktion _Notify_SetNotifytoFunc wurde komplett überarbeitet. Die Datenstruktur wurde auf Scripting.Dictionary umgestellt. Nur der Index wird als Array verwaltet.
    Die Auswertung der Notify´s wurde weitgehend auf Scripting.Dictionary umgestellt, was deutlich die Ausführungszeit verkürtzt.

    Edit: Version vom 14.06.2013

    Fehler bei der Verarbeitung des $iCode beseitigt. Die UDF sollte jetzt auf AutoIt > 3.3.8.0 laufen.

    Über Kommentare, Kritik und Verbesserungsvorschläge würde ich mich freuen.


    Register_UDF_Test.au3
    [autoit]

    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <RegisterNotify_UDF.au3>
    #include <Array.au3>
    Opt('MustDeclareVars', 1)
    Global $testArray2[1][2]
    Global $listview, $button, $item1, $item2, $item3, $input1, $nmsg, $Message, $hGUI, $hListView, $Edit,$hGUI1
    Global $listview2, $button2, $item4, $item5, $item6, $input2, $Edit2
    $hGUI1 = GUICreate("listview items", 440, 400, 400, 400, -1, $WS_EX_ACCEPTFILES)
    Global $listview3=GUICtrlCreateListView("col1 |col2|col3 ", 210, 10, 200, 150)
    GUISetState()
    $hGUI = GUICreate("listview items", 440, 400, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF) ; will change background color

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

    $listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
    $button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
    $item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
    $item2 = GUICtrlCreateListViewItem("item1|col12|col13", $listview)
    $item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
    $input1 = GUICtrlCreateInput("", 20, 200, 150)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
    $Edit = GUICtrlCreateEdit("", 20, 250, 150, 100)
    $listview2 = GUICtrlCreateListView("col1 |col2|col3 ", 210, 10, 200, 150);,$LVS_SORTDESCENDING)
    $button2 = GUICtrlCreateButton("Value?", 275, 170, 70, 20)
    $item4 = GUICtrlCreateListViewItem("item2|col22|col23", $listview2)
    $item5 = GUICtrlCreateListViewItem("item1|col12|col13", $listview2)
    $item6 = GUICtrlCreateListViewItem("item3|col32|col33", $listview2)
    $input2 = GUICtrlCreateInput("", 220, 200, 150)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
    $Edit2 = GUICtrlCreateEdit("", 220, 250, 150, 100)
    GUISetState()
    Global $aNotifySelect[3] =[$NM_DBLCLK,$NM_CLICK,$LVN_COLUMNCLICK]
    _Notify_SetHandletoFunc($listview3, "_ListView2");Func Listview wird für die Notify´s $NM_DBLCLK,$NM_CLICK,$LVN_COLUMNCLICK zugeordnet
    _Notify_SetHandletoFunc($listview, "_ListView",$aNotifySelect);Func Listview wird für die Notify´s $NM_DBLCLK,$NM_CLICK,$LVN_COLUMNCLICK zugeordnet
    _Notify_SetNotifytoFunc($listview2, $NM_DBLCLK, "_NM_DBLCLK");Func wind $Listview, Icode $NM_DBLCLK zugeordent
    _Notify_SetNotifytoFunc($listview2, $NM_CLICK, "_NM_CLICK");;Func wind $Listview, Icode $NM_CLICK zugeordent
    _StartUp_Notify(True); Registrieren von $WM_NOTIFY

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

    Do
    $nmsg = GUIGetMsg()
    Switch $nmsg
    Case $button
    MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
    EndSwitch
    Until $nmsg = $GUI_EVENT_CLOSE
    _StartUp_Notify(False)

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

    Func _NM_DBLCLK($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $tNMHDR, $hwnd2, $iIDfrom2, $iCode2
    GUICtrlSetData($Edit2,GUICtrlRead($Edit2)&@crlf& "Doppelclick wurde durchgeführt")
    EndFunc ;==>_NM_DBLCLK

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

    Func _NM_CLICK($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    GUICtrlSetData($Edit2,GUICtrlRead($Edit2)&@crlf& "Click wurde durchgeführt")
    EndFunc ;==>_NM_CLICK

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

    Func _ListView($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Switch $iNotifyCode
    Case $NM_DBLCLK
    GUICtrlSetData($Edit,GUICtrlRead($Edit)&@crlf& "Doppelclick wurde durchgeführt")
    Case $NM_CLICK
    GUICtrlSetData($Edit,GUICtrlRead($Edit)&@crlf& "Click wurde durchgeführt")
    Case $LVN_COLUMNCLICK
    GUICtrlSetData($Edit,GUICtrlRead($Edit)&@crlf& "Column wurde angeklickt")
    EndSwitch
    EndFunc ;==>_ListView

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

    Func _ListView2($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Switch $iNotifyCode
    Case $NM_DBLCLK
    ConsoleWrite("Doppelclick auf Listview 3 wurde durchgeführt" & @CRLF)
    Case $NM_CLICK
    ConsoleWrite("Click auf Listview 3 wurde durchgeführt" & @CRLF)
    Case $LVN_COLUMNCLICK
    ConsoleWrite("ColumnClick auf Listview 3 wurde durchgeführt" & @CRLF)
    EndSwitch
    EndFunc ;==>_ListView

    [/autoit]
    • Offizieller Beitrag

    Der Hintergrund ist recht simpel. ;) Raupi hatte grad ein schöpferisches Tief und lechzte nach neuen Aufgaben :rofl:
    Da ich diese Erweiterung noch in meine Listview-Format-UDF einbauen will, hab ich Raupi empfohlen, sich dadran zu versuchen.
    Hintergrund war eigentlich die Problemstellung in eine laufende WM_NOTIFY-Funtion weitere Abfragen auf andere Ctrl und Events zu ermöglichen ohne die Funktion selbst zu verändern.
    Bsp.:
    Mit der StartUp-Func aus der Listview-Format-UDF wird die im Include laufende WM_NOTIFY-Funtion gestartet. Sollen jetzt weitere WM_NOTIFY-Events verwertet werden, müßte die Include-Datei geändert werden. Und das sollte möglichst vermieden werden.
    Ein evtl. einfacherer Programmiervorgang für WM_NOTIFY-Events wäre dann ein angenehmer Nebeneffekt.

    • Offizieller Beitrag
    Zitat

    Steckt ja Menge Arbeit drin.

    Hat sich in Grenzen gehalten, bin selbst erstaunt drüber 8o . Das schlimmste war die Datenstruktur, Array im Array.
    Die Zündende Idee kahm mir beim Kaffetrinken, Koffein wirkt manchmal Wunder.

    Zitat

    Allerdings ist mir unklar was du damit genau bezwecken willst. Den Umgang mit WM_Notify erleichtern?

    Ja, auch... hab mal meinen 1. Post überarbeitet. Ich hoffe, ich hab es jetzt ein wenig besser Erklärt.
    Wenn nicht, siehe Post von BugFix. Danke für die Erklärung BugFix :thumbup:

  • Ähm ich habe mit dem normalen WM_Notify noch nicht gearbeitet. Sorry für dies Frage. Aber wozu kann man das nutzen?

    • Offizieller Beitrag

    Neue Version siehe Post 1.

  • Hallo Raupi,

    ich wollte gestern mal zum Test Dein vielversprechendes Script einsetzen und habe 2 WM_Notify Funktionen versucht damit zusammenzuführen. Dabei habe ich auf die Schnelle diese beiden Scripten genommen: [Beispiel] BMP-, GIF- & JPG-Viewer und https://autoit.de/index.php?page…49074#post49074

    Aus diesen beiden

    Spoiler anzeigen
    [autoit]


    Func WM_NOTIFY($hWnd, $msgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView ; ID des LV
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
    $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_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    habe ich das hier gemacht:

    Spoiler anzeigen
    [autoit]


    _Notify_SetHandletoFunc($idLV_Files, "_LV_Viewer")
    _Notify_SetHandletoFunc($hListV, "_LV")
    _StartUp_Notify(True)

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

    Func _LV_Viewer($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $tagNMHDR, $event, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _LV($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListV ; ID des LV
    If Not IsHWnd($hListV) Then $hWndListView = GUICtrlGetHandle($hListV) ; ID des LV
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    Das zweite Script von BugFix ging immer. Das erste dagegen nur in Abwesenheit des zweiten (auch immer mit Deiner UDF). Siehst Du als Vertrauter "WM_Notifier" hier einen Fehler? Sind 2 Listviews im Spiel.

    Dank und Gruß
    Thomas

    • Offizieller Beitrag

    Poste mal das komplette Script, damit man testen kann.
    Kannst es mir auch als PM schicken, wenn du nicht willst das ander deinen Code sehen.

  • Bei dieser Version geht der Viewer (mit Deiner UDF - ohne das BugFix-Script):

    Spoiler anzeigen
    [autoit]


    #cs -----------------------------------------------------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667

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

    Skriptbeispiel für den Umgang mit FileOpenDialog, GUICtrlCreateListView, GUICtrlCreateListViewItem,
    GUIRegisterMsg speziell für das Event $GUI_EVENT_DROPPED
    #ce -------------------------------------------------------------------------------------------------------------------------
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <array.au3>
    #include <GDIPlus.au3>
    #include <GUIListBox.au3>
    #include <GuiConstantsEx.au3>
    #include <RegisterNotify_UDF.au3>

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

    ;Opt('MustDeclareVars', 1)

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

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem
    Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99
    Global $aDropFiles[1], $WM_DROPFILES = 0x233
    Global $currentItem[2], $title, $currentOpt[2] = ["none"]

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

    ;$idfrmMain = GUICreate("BMP-, GIF- & JPG-Viewer", 824, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idfrmMain = GUICreate("", 1150, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 830, 10, 300, 200, $LVS_REPORT)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 70)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 60)
    _GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
    For $i = 1 To 9
    GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
    Next
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLV_Files = GUICtrlCreateListView("Name: |Pfad", 519, 5, 300, 490, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 519, 500, 140, 25)
    Local $idClearLV = GUICtrlCreateButton("&Listview &leeren", 669, 500, 140, 25)
    ;GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUISetState()

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

    ;------------------------------------------

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

    _Notify_SetHandletoFunc($idLV_Files, "_LV_Viewer")
    ;_Notify_SetHandletoFunc($idLV_Files, "_LV")
    _StartUp_Notify(True)

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

    ;------------------------------------------

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idfileitem

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

    $message = "Um mehrere Dateien auszuwählen die Strg-Taste, Strg-A oder die Shift-Taste drücken."

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

    $var = FileOpenDialog($message, @ScriptDir & "", "Bilder (*.jpg;*.bmp)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    _GUICtrlListView_BeginUpdate($idLV_Files)
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild

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

    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren

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

    For $i = 2 To $aFiles[0]
    GUICtrlCreateListViewItem($aFiles[$i] & "|" & $aFiles[1], $idLV_Files)
    Next
    Else ;nur eine Datei ausgewählt
    ConsoleWrite($aFiles[1] & @CRLF)
    _PathSplit($aFiles[1], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndIf
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndIf
    Case $idClearLV
    _GUICtrlListView_DeleteAllItems($idLV_Files)
    Case $idbtnShow
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    _ShowPic($aItem)
    Case $GUI_EVENT_CLOSE, $idexititem
    Exit
    EndSwitch
    WEnd

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

    Func _ShowPic($aItem)
    Local $sImageName = $aItem[2] & "\" & $aItem[1]
    ;$aItem[0] enthält Anzahl der Spalten [$aIem[1] die 1. Spalte usw.
    ;_ArrayDisplay($aItem) ; nur zu Verständnisuwecken evtl. aktivieren
    ConsoleWrite("Pfad zur Datei:" & $aItem[2] & "\" & $aItem[1] & @CRLF) ;nur zu Verständnisuwecken evtl. deaktivieren
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImageName)
    Local $iX = _GDIPlus_ImageGetWidth($hImage)
    Local $iY = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Local $iRatio = $iX / $iY
    ConsoleWrite("Orig.: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $iRatio >= 1 Then
    $iX = 500
    $iY = $iX / $iRatio
    Else
    $iY = 300
    $iX = $iY * $iRatio
    EndIf
    ConsoleWrite("Neu: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $hPic <> -99 Then GUICtrlDelete($hPic)
    $hPic = GUICtrlCreatePic($sImageName, 5, 5, $iX, $iY)
    EndFunc ;==>_ShowPic

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

    #region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ConsoleWrite("WM_DropFiles_Func " & @CRLF)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    ConsoleWrite("Bin da " & @CRLF)
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($idLV_Files)
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;;consolewrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    Switch $szExt
    Case ".JPG", ".BMP", ".GIF"
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndSwitch
    Next
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndFunc ;==>_FilesDropped

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

    ; ------------------------ WM_Notify ---------------------------------------------------------------

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

    Func _LV_Viewer($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $tagNMHDR, $event, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Diese Version mit beiden Scripten geht nicht. Hier kommt ein Fehler der UDF:

    Spoiler anzeigen
    [autoit]


    #cs -----------------------------------------------------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667

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

    Skriptbeispiel für den Umgang mit FileOpenDialog, GUICtrlCreateListView, GUICtrlCreateListViewItem,
    GUIRegisterMsg speziell für das Event $GUI_EVENT_DROPPED
    #ce -------------------------------------------------------------------------------------------------------------------------
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <array.au3>
    #include <GDIPlus.au3>
    #include <GUIListBox.au3>
    #include <GuiConstantsEx.au3>
    #include <RegisterNotify_UDF.au3>

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

    ;Opt('MustDeclareVars', 1)

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

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem
    Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99
    Global $aDropFiles[1], $WM_DROPFILES = 0x233
    Global $currentItem[2], $title, $currentOpt[2] = ["none"]

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

    ;$idfrmMain = GUICreate("BMP-, GIF- & JPG-Viewer", 824, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idfrmMain = GUICreate("", 1150, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 830, 10, 300, 200, $LVS_REPORT)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 70)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 60)
    _GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
    For $i = 1 To 9
    GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
    Next
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLV_Files = GUICtrlCreateListView("Name: |Pfad", 519, 5, 300, 490, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 519, 500, 140, 25)
    Local $idClearLV = GUICtrlCreateButton("&Listview &leeren", 669, 500, 140, 25)
    ;GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUISetState()

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

    ;------------------------------------------

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

    $EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
    $dummy = GUICtrlCreateDummy()
    $hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
    HotKeySet('{ESC}', '_EscEdit')
    Global $AccelKeys[1][2]=[["{ENTER}", $dummy]]
    GUICtrlSetOnEvent($dummy, "_EditEnter")
    GUISetAccelerators($AccelKeys)
    _Notify_SetHandletoFunc($idLV_Files, "_LV_Viewer")
    _Notify_SetHandletoFunc($idLV_Files, "_LV")
    _StartUp_Notify(True)

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

    ;------------------------------------------

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idfileitem

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

    $message = "Um mehrere Dateien auszuwählen die Strg-Taste, Strg-A oder die Shift-Taste drücken."

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

    $var = FileOpenDialog($message, @ScriptDir & "", "Bilder (*.jpg;*.bmp)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    _GUICtrlListView_BeginUpdate($idLV_Files)
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild

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

    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren

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

    For $i = 2 To $aFiles[0]
    GUICtrlCreateListViewItem($aFiles[$i] & "|" & $aFiles[1], $idLV_Files)
    Next
    Else ;nur eine Datei ausgewählt
    ConsoleWrite($aFiles[1] & @CRLF)
    _PathSplit($aFiles[1], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndIf
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndIf
    Case $idClearLV
    _GUICtrlListView_DeleteAllItems($idLV_Files)
    Case $idbtnShow
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    _ShowPic($aItem)
    Case $GUI_EVENT_CLOSE, $idexititem
    Exit
    EndSwitch
    WEnd

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

    Func _ShowPic($aItem)
    Local $sImageName = $aItem[2] & "\" & $aItem[1]
    ;$aItem[0] enthält Anzahl der Spalten [$aIem[1] die 1. Spalte usw.
    ;_ArrayDisplay($aItem) ; nur zu Verständnisuwecken evtl. aktivieren
    ConsoleWrite("Pfad zur Datei:" & $aItem[2] & "\" & $aItem[1] & @CRLF) ;nur zu Verständnisuwecken evtl. deaktivieren
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImageName)
    Local $iX = _GDIPlus_ImageGetWidth($hImage)
    Local $iY = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Local $iRatio = $iX / $iY
    ConsoleWrite("Orig.: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $iRatio >= 1 Then
    $iX = 500
    $iY = $iX / $iRatio
    Else
    $iY = 300
    $iX = $iY * $iRatio
    EndIf
    ConsoleWrite("Neu: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $hPic <> -99 Then GUICtrlDelete($hPic)
    $hPic = GUICtrlCreatePic($sImageName, 5, 5, $iX, $iY)
    EndFunc ;==>_ShowPic

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

    #region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ConsoleWrite("WM_DropFiles_Func " & @CRLF)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    ConsoleWrite("Bin da " & @CRLF)
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($idLV_Files)
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;;consolewrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    Switch $szExt
    Case ".JPG", ".BMP", ".GIF"
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndSwitch
    Next
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndFunc ;==>_FilesDropped

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

    ;---------------------------------------Mod ----------------------------------------------------------

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

    Func _LeftDblClick($Info)
    If $Info[3] = -1 Then Return
    If $currentOpt[0] = "none" Then
    $currentOpt[0] = Opt('GUICoordMode', 1)
    $currentOpt[1] = Opt("GUIOnEventMode", 1)
    EndIf
    GUICtrlSetOnEvent($hEdit, '_EditEnter')
    _GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    $title = WinGetTitle($idfrmMain)
    Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
    Local $posGUI = WinGetPos($idfrmMain), $posLV = ControlGetPos($idfrmMain, '', $hListView)
    Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
    WinSetTitle($idfrmMain, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
    For $i = 0 To $Info[4]
    $tmp = _GUICtrlListView_GetColumn($Info[1], $i)
    $sumWidth += $tmp[4]
    Next
    $sumWidth -= $colInfo[4]
    Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
    If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If $xPos < 0 Then $xPos = 0
    WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
    GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    $currentItem[0] = $Info[3]
    $currentItem[1] = $Info[4]
    GUISetState(@SW_SHOW, $EditBox)
    EndFunc

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

    Func _EscEdit()
    WinSetTitle($idfrmMain, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    Func _EditEnter()
    WinSetTitle($idfrmMain, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    _GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    ; ------------------------ WM_Notify ---------------------------------------------------------------

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

    Func _LV_Viewer($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $tagNMHDR, $event, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _LV($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView ; ID des LV
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Mußt unter Datei -> Öffnen Bilder auswählen und dann den Itemeintrag Doppelklicken um das Bild zu sehen.

    Viele Grüße
    Thomas

  • Hi Raupi,
    ich hab mir gedacht ich könnte dein Programm für die _GUICtrlToolBar verwenden. Nur leider habe ich keine Ahnung wie ich an das Handle der Toolbar komme um dieses zu übergeben. Ich will eigentlich nur für jeden Button in der Toolbar eine Funktion aufrufen, wenn dieser angeklickt wird.

    mfg
    Matches

    • Offizieller Beitrag

    Hi Raupi,
    ich hab mir gedacht ich könnte dein Programm für die _GUICtrlToolBar verwenden. Nur leider habe ich keine Ahnung wie ich an das Handle der Toolbar komme um dieses zu übergeben. Ich will eigentlich nur für jeden Button in der Toolbar eine Funktion aufrufen, wenn dieser angeklickt wird.

    mfg
    Matches


    Wirst du so nicht hinbekommen. Bei einem ToolBar werden die Notifikationen $NM_LDOWN und $TBN_HOTITEMCHANGE ausgewertet.
    Schau dir dazu mal das Beispeil von _GUICtrlToolbar_Create an. Dort kannst du sehen wie die einzelnen Buttons abgefragt werden.
    DU kannst meine UDF dazu benutzen, aber die Auswertung per Button mußt du trotzdem mit z.B. einer Case abfrage lösen.

    • Offizieller Beitrag


    Also mir fällt als 1. mal auf das au beide Funktioen für ein und daselbe Listview benutzt.
    Ich denke es sollte eher so aussshen:

    Spoiler anzeigen
    [autoit]

    #cs -----------------------------------------------------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667

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

    Skriptbeispiel für den Umgang mit FileOpenDialog, GUICtrlCreateListView, GUICtrlCreateListViewItem,
    GUIRegisterMsg speziell für das Event $GUI_EVENT_DROPPED
    #ce -------------------------------------------------------------------------------------------------------------------------
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <array.au3>
    #include <GDIPlus.au3>
    #include <GUIListBox.au3>
    #include <GuiConstantsEx.au3>
    #include <RegisterNotify_UDF.au3>

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

    ;Opt('MustDeclareVars', 1)

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

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem
    Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99
    Global $aDropFiles[1], $WM_DROPFILES = 0x233
    Global $currentItem[2], $title, $currentOpt[2] = ["none"]

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

    ;$idfrmMain = GUICreate("BMP-, GIF- & JPG-Viewer", 824, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idfrmMain = GUICreate("", 1150, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 830, 10, 300, 200, $LVS_REPORT)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 70)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 60)
    _GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
    For $i = 1 To 9
    GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
    Next
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLV_Files = GUICtrlCreateListView("Name: |Pfad", 519, 5, 300, 490, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 519, 500, 140, 25)
    Local $idClearLV = GUICtrlCreateButton("&Listview &leeren", 669, 500, 140, 25)
    ;GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUISetState()

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

    ;------------------------------------------

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

    $EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
    $dummy = GUICtrlCreateDummy()
    $hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
    HotKeySet('{ESC}', '_EscEdit')
    Global $AccelKeys[1][2]=[["{ENTER}", $dummy]]
    GUICtrlSetOnEvent($dummy, "_EditEnter")
    GUISetAccelerators($AccelKeys)
    _Notify_SetHandletoFunc($idLV_Files, "_LV_Viewer")
    _Notify_SetHandletoFunc($hListView, "_LV")
    _StartUp_Notify(True)

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

    ;------------------------------------------

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idfileitem

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

    $message = "Um mehrere Dateien auszuwählen die Strg-Taste, Strg-A oder die Shift-Taste drücken."

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

    $var = FileOpenDialog($message, @ScriptDir & "", "Bilder (*.jpg;*.bmp)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    _GUICtrlListView_BeginUpdate($idLV_Files)
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild

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

    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren

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

    For $i = 2 To $aFiles[0]
    GUICtrlCreateListViewItem($aFiles[$i] & "|" & $aFiles[1], $idLV_Files)
    Next
    Else ;nur eine Datei ausgewählt
    ConsoleWrite($aFiles[1] & @CRLF)
    _PathSplit($aFiles[1], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndIf
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndIf
    Case $idClearLV
    _GUICtrlListView_DeleteAllItems($idLV_Files)
    Case $idbtnShow
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    _ShowPic($aItem)
    Case $GUI_EVENT_CLOSE, $idexititem
    Exit
    EndSwitch
    WEnd

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

    Func _ShowPic($aItem)
    Local $sImageName = $aItem[2] & "\" & $aItem[1]
    ;$aItem[0] enthält Anzahl der Spalten [$aIem[1] die 1. Spalte usw.
    ;_ArrayDisplay($aItem) ; nur zu Verständnisuwecken evtl. aktivieren
    ConsoleWrite("Pfad zur Datei:" & $aItem[2] & "\" & $aItem[1] & @CRLF) ;nur zu Verständnisuwecken evtl. deaktivieren
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImageName)
    Local $iX = _GDIPlus_ImageGetWidth($hImage)
    Local $iY = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Local $iRatio = $iX / $iY
    ConsoleWrite("Orig.: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $iRatio >= 1 Then
    $iX = 500
    $iY = $iX / $iRatio
    Else
    $iY = 300
    $iX = $iY * $iRatio
    EndIf
    ConsoleWrite("Neu: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $hPic <> -99 Then GUICtrlDelete($hPic)
    $hPic = GUICtrlCreatePic($sImageName, 5, 5, $iX, $iY)
    EndFunc ;==>_ShowPic

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

    #region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ConsoleWrite("WM_DropFiles_Func " & @CRLF)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    ConsoleWrite("Bin da " & @CRLF)
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($idLV_Files)
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;;consolewrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    Switch $szExt
    Case ".JPG", ".BMP", ".GIF"
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndSwitch
    Next
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndFunc ;==>_FilesDropped

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

    ;---------------------------------------Mod ----------------------------------------------------------

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

    Func _LeftDblClick($Info)
    If $Info[3] = -1 Then Return
    If $currentOpt[0] = "none" Then
    $currentOpt[0] = Opt('GUICoordMode', 1)
    $currentOpt[1] = Opt("GUIOnEventMode", 1)
    EndIf
    GUICtrlSetOnEvent($hEdit, '_EditEnter')
    _GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    $title = WinGetTitle($idfrmMain)
    Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
    Local $posGUI = WinGetPos($idfrmMain), $posLV = ControlGetPos($idfrmMain, '', $hListView)
    Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
    WinSetTitle($idfrmMain, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
    For $i = 0 To $Info[4]
    $tmp = _GUICtrlListView_GetColumn($Info[1], $i)
    $sumWidth += $tmp[4]
    Next
    $sumWidth -= $colInfo[4]
    Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
    If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If $xPos < 0 Then $xPos = 0
    WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
    GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    $currentItem[0] = $Info[3]
    $currentItem[1] = $Info[4]
    GUISetState(@SW_SHOW, $EditBox)
    EndFunc

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

    Func _EscEdit()
    WinSetTitle($idfrmMain, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    Func _EditEnter()
    WinSetTitle($idfrmMain, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    _GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    ; ------------------------ WM_Notify ---------------------------------------------------------------

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

    Func _LV_Viewer($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $tagNMHDR, $event, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _LV($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView ; ID des LV
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • Hallo Raupi,

    ich hatte letzte Nacht noch spät dran rumgemacht. Da hat sich wohl der Fehler in Z. 60 eingeschlichen. Aber auch diese Version funktioniert nicht. Das LV rechts geht einwandfrei. Wenn Du dann unter Datei->Öffnen ein oder mehrere Bilder aussuchst, davon eines dann im linken LV doppelklickst, passiert nichts...

    Wenn man anschließend nochmal auf das LV rechts klickt, gibt es bei mir ein schwarzes Popup-Feld

    Gruß
    Thomas

    • Offizieller Beitrag

    So klappt es :

    Spoiler anzeigen
    [autoit]

    #cs -----------------------------------------------------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667

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

    Skriptbeispiel für den Umgang mit FileOpenDialog, GUICtrlCreateListView, GUICtrlCreateListViewItem,
    GUIRegisterMsg speziell für das Event $GUI_EVENT_DROPPED
    #ce -------------------------------------------------------------------------------------------------------------------------
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <array.au3>
    #include <GDIPlus.au3>
    #include <GUIListBox.au3>
    #include <GuiConstantsEx.au3>
    #include <RegisterNotify_UDF.au3>

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

    ;Opt('MustDeclareVars', 1)

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

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem
    Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99
    Global $aDropFiles[1], $WM_DROPFILES = 0x233
    Global $currentItem[2], $title, $currentOpt[2] = ["none"]

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

    ;$idfrmMain = GUICreate("BMP-, GIF- & JPG-Viewer", 824, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idfrmMain = GUICreate("", 1150, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 830, 10, 300, 200, $LVS_REPORT)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 70)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 60)
    _GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
    For $i = 1 To 9
    GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
    Next
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLV_Files = GUICtrlCreateListView("Name: |Pfad", 519, 5, 300, 490, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 519, 500, 140, 25)
    Local $idClearLV = GUICtrlCreateButton("&Listview &leeren", 669, 500, 140, 25)
    ;GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUISetState()

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

    ;------------------------------------------

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

    $EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
    $dummy = GUICtrlCreateDummy()
    $hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
    HotKeySet('{ESC}', '_EscEdit')
    Global $AccelKeys[1][2]=[["{ENTER}", $dummy]]
    GUICtrlSetOnEvent($dummy, "_EditEnter")
    GUISetAccelerators($AccelKeys)
    _Notify_SetHandletoFunc($idLV_Files, "_LV_Viewer")
    _Notify_SetHandletoFunc($hListView, "_LV")
    _StartUp_Notify(True)

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

    ;------------------------------------------

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idfileitem

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

    $message = "Um mehrere Dateien auszuwählen die Strg-Taste, Strg-A oder die Shift-Taste drücken."

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

    $var = FileOpenDialog($message, @ScriptDir & "", "Bilder (*.jpg;*.bmp)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    _GUICtrlListView_BeginUpdate($idLV_Files)
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild

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

    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren

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

    For $i = 2 To $aFiles[0]
    GUICtrlCreateListViewItem($aFiles[$i] & "|" & $aFiles[1], $idLV_Files)
    Next
    Else ;nur eine Datei ausgewählt
    ConsoleWrite($aFiles[1] & @CRLF)
    _PathSplit($aFiles[1], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndIf
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndIf
    Case $idClearLV
    _GUICtrlListView_DeleteAllItems($idLV_Files)
    Case $idbtnShow
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    _ShowPic($aItem)
    Case $GUI_EVENT_CLOSE, $idexititem
    Exit
    EndSwitch
    WEnd

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

    Func _ShowPic($aItem)
    Local $sImageName = $aItem[2] & "\" & $aItem[1]
    ;$aItem[0] enthält Anzahl der Spalten [$aIem[1] die 1. Spalte usw.
    ;_ArrayDisplay($aItem) ; nur zu Verständnisuwecken evtl. aktivieren
    ConsoleWrite("Pfad zur Datei:" & $aItem[2] & "\" & $aItem[1] & @CRLF) ;nur zu Verständnisuwecken evtl. deaktivieren
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImageName)
    Local $iX = _GDIPlus_ImageGetWidth($hImage)
    Local $iY = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Local $iRatio = $iX / $iY
    ConsoleWrite("Orig.: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $iRatio >= 1 Then
    $iX = 500
    $iY = $iX / $iRatio
    Else
    $iY = 300
    $iX = $iY * $iRatio
    EndIf
    ConsoleWrite("Neu: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    GuiSwitch($idfrmMain) ; Vor dem erstellen des Bildes muß auf die Hautgui geswitcht werden. Im Augenbich war die GUI $EditBox aktiv, weil sie zuletzt erstellt wurde
    If $hPic <> -99 Then GUICtrlDelete($hPic)
    $hPic = GUICtrlCreatePic($sImageName, 5, 5, $iX, $iY)
    EndFunc ;==>_ShowPic

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

    #region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ConsoleWrite("WM_DropFiles_Func " & @CRLF)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    ConsoleWrite("Bin da " & @CRLF)
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($idLV_Files)
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;;consolewrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    Switch $szExt
    Case ".JPG", ".BMP", ".GIF"
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndSwitch
    Next
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndFunc ;==>_FilesDropped

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

    ;---------------------------------------Mod ----------------------------------------------------------

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

    Func _LeftDblClick($Info)
    If $Info[3] = -1 Then Return
    If $currentOpt[0] = "none" Then
    $currentOpt[0] = Opt('GUICoordMode', 1)
    $currentOpt[1] = Opt("GUIOnEventMode", 1)
    EndIf
    GUICtrlSetOnEvent($hEdit, '_EditEnter')
    _GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    $title = WinGetTitle($idfrmMain)
    Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
    Local $posGUI = WinGetPos($idfrmMain), $posLV = ControlGetPos($idfrmMain, '', $hListView)
    Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
    WinSetTitle($idfrmMain, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
    For $i = 0 To $Info[4]
    $tmp = _GUICtrlListView_GetColumn($Info[1], $i)
    $sumWidth += $tmp[4]
    Next
    $sumWidth -= $colInfo[4]
    Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
    If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If $xPos < 0 Then $xPos = 0
    WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
    GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    $currentItem[0] = $Info[3]
    $currentItem[1] = $Info[4]
    GUISetState(@SW_SHOW, $EditBox)
    EndFunc

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

    Func _EscEdit()
    WinSetTitle($idfrmMain, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    Func _EditEnter()
    WinSetTitle($idfrmMain, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    _GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    ; ------------------------ WM_Notify ---------------------------------------------------------------

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

    Func _LV_Viewer($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $tagNMHDR, $event, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _LV($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    Local $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView ; ID des LV
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    Du benutz in deinem Script mehrere GUIS. Das hat zur Folge, das ein neues Control in deinem Fall ein GUICtrlCreatePic, auf der zuletzt erstellten GUI eingefügt wird.
    Die zuletzt erstellte GUi was $EditBox und gehört zum Script das du von BugFix adoptiert hast.
    In Zukunft muß du darauf achten, das du auch auf die GUI umschaltest, auf der du ein Control erstellen willst.
    Schau dir mal Zeile 133 an ;)

  • Hallo,

    erstmal vielen Dank für diese tolle UDF, Raupi. Allerdings stützt das Beispiel beim hovern von ListView 1 und 2 oder beim klick auf ListView 3 ab. Ich verwende Windows 7 und die aktuelle, stabile AutoIt Version. Weißt du woran es liegen könnte?

    Fehlermeldung

    Vielen Dank,

    Magnus