Mir sind ein paar Kleinigkeiten aufgefallen die ich vermutlich irgendwo eingebaut hätte:
- Kleiner Hinweis wie du die Events nicht andauernd via Adlib durchlaufen musst: Verwende GUIOnEventMode und registriere dir GUI_EVENT_MOUSEMOVE. Dann wird die Funktion nur aufgerufen, wenn die Maus bewegt wird. Dadurch wird dein Programm nebenbei auch sehr viel reaktiver, weil nicht "alle 100ms" geprüft wird, sondern "sobald sich die Maus einen Pixel bewegt". Gleichzeitig wird keine Rechenleistung verbraucht wenn die Maus stillsteht.
- Noch eine Idee wäre WM_NCHITTEST & Return $HTCAPTION (klappt nur, wenn die Maus "nicht" über einem Ctrl mit einem eigenen Handle ist, z.B. für GDI+ Stuff). Damit kann man ein Fenster bewegen, wenn man auf den Hintergrund des Fensters (und nicht auf ein Ctrl) klickt. Bin gerade nicht sicher ob, und wie das sinnvoll ist, aber vielleicht bringt die die Info ja etwas (PS: NCHITTEST feuert 1x pro Frame, also alle 16.6ms. Wenn man es nicht braucht sollte man es also vllt doch lieber weglassen^^)
- GUIGetCursorInfo trägt bereits informationen zum Ctrl in [4], da braucht man nicht mehr umständlich via Positionen zu berechnen wo die Maus ist.
- Bei Ctrls Farben zu aktualisieren tendiert zu flackern (auch wenn man es hier jetzt nicht wirklich sieht). Versuche die aktuellen Daten (Farbe, Schriftfarbe, Symbol, etc) nur dann zu aktualisieren wenn sich etwas ändert.
Anbei ein Minimalbeispiel wie man ein Fenster bewegt und ein Ctrl umfärbt. Das Beispiel verwendet "alles" oben angesprochene, ob es sinnvoll ist UND nicht
#include <WindowsConstants.au3>
#Include <GUIConstantsEx.au3>
Opt('GUIOnEventMode', 1)
Global $hGUI = GUICreate('Testfenster', 500, 500, -1, -1, $WS_POPUPWINDOW)
Global $hLAB = GUICtrlCreateLabel('', 100, 100, 100, 100, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor($hLAB, 0x808080)
GUISetState(@SW_SHOW)
GUISetOnEvent(-3, Xit)
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, GUI_EVENT_MOUSEMOVE)
GUIRegisterMsg($WM_NCHITTEST, WM_NCHITTEST)
Func Xit()
Exit
EndFunc
While Sleep(10)
WEnd
Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
; Feuert nur, wenn man "über dem aktuellen Fenster ist". Ctrls zählen nicht dazu.
ToolTip('x: ' & BitAND($lParam, 0xFFFF) & @CRLF & 'y: ' & BitAND(BitShift($lParam, 16), 0xFFFF))
Return $HTCAPTION ; Fenster festhalten, wenn man klickt.
EndFunc
Func GUI_EVENT_MOUSEMOVE()
Local $aInfo = GUIGetCursorInfo() ; Label mit gepufferter Farbe ohne Adlib umfärben wenn die Maus darüber ist.
Local Static $iLastColor = 0x808080
If $aInfo[4] = $hLAB Then
If $iLastColor <> 0xA0A0A0 Then
$iLastColor = 0xA0A0A0
GUICtrlSetBkColor($hLAB, 0xA0A0A0)
EndIf
Else
If $iLastColor <> 0x808080 Then
$iLastColor = 0x808080
GUICtrlSetBkColor($hLAB, 0x808080)
EndIf
EndIf
EndFunc
Alles anzeigen
Edit: Es gibt auch noch eine Menge andere WM_XXX die man gebrauchen könnte. Am besten mal alle durchlesen (sind leider ziemlich viele^^).
Edit2: https://www.autoitscript.com/wiki/Moving_an…zing_PopUp_GUIs <- Pflichtlektüre
lg
M