- 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. Ich bin nicht so der Erklärungstyp
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
#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
$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
Do
$nmsg = GUIGetMsg()
Switch $nmsg
Case $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
EndSwitch
Until $nmsg = $GUI_EVENT_CLOSE
_StartUp_Notify(False)
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
Func _NM_CLICK($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
GUICtrlSetData($Edit2,GUICtrlRead($Edit2)&@crlf& "Click wurde durchgeführt")
EndFunc ;==>_NM_CLICK
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
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