Zeit ändern per MouseWheel

    • Offizieller Beitrag

    Für meine Digitaluhr habe ich ja die Alarmzeit per MouseWheel einstellbar gemacht.

    Falls ihr so etwas auch machen wollt, hier mal ein kleines, kommentiertes Minimal-Beispiel:

  • Nur eine kurze Anmerkung... Gerade für wiederverwendbare Codeschnipsel ist GUIRegisterMsg relativ ungeeignet, weil man eine Nachricht immer nur einmal registrieren kann. Daher in UDFs usw. lieber mit SetWindowLong die WndProc ersetzen. Bietet die selben Möglichkeiten, lässt sich aber mehr oder weniger verschachteln.

    • Offizieller Beitrag

    Naja, das ist ja keine unabhängige UDF. Soll ja nur ein Minimal-Beispiel sein.

    Und ob die WinProc-Lösung für Anfänger einfacher zu "lesen" ist, sei auch mal dahingestellt, aber ich will mal nicht so sein:

  • Einfacher zu lesen ist die Variante gewiss nicht. Allerdings kommt es ansonsten auch gerne schon mal zu Fehlern, auf die man als Anfänger gar nicht kommt. Zum Beispiel... Es gibt auch eine ListView-UDF, die $WM_MOUSEWHEEL über GUIRegisterMsg registriert. Ein beliebiger DAU verwendet diese UDF und möchte dazu noch deinen Code verwenden. Bamm, Kollision, nur eins von beiden wird funktionieren. Und da kommt man nicht ganz so leicht drauf, das kann einen dann schon ein paar Stunden Fehlersuchen kosten. Das wollte ich mit der Anmerkung verhindern. ^^

  • Vielen Dank für die Bereitstellung beider Skripte. Skript 1 ist auf jeden Fall für Beginner besser zu verstehen. In Skript 2 (WinProc-Lösung) würde ich ohne Kommentare im Quellcode nicht durchblicken. Aber Dank der Kommentare konnte ich wieder einiges lernen. Jedenfalls ist für mich die Nutzung der Maus-Scrollfunktion für andere Dinge, als nur für den Bild- oder Zeilenlauf zu nutzen wieder ein gutes Beispiel dafür, dass mit AutoIt viel mehr gemacht werden kann als ich mir vorstellen konnte.

    Nur wie bist Du draufgekommen, das Mausrad zum stellen einer Uhr zu nutzen? Das ist sehr kreativ! Es dann auch noch umzusetzen, zu kommentieren und zu teilen finde ich richtig klasse.

    • Offizieller Beitrag

    Nur wie bist Du draufgekommen, das Mausrad zum stellen einer Uhr zu nutzen?

    Naja, bisher habe ich dafür immer das Date-Control (GuiCtrlCreateDate) verwendet, aber das mit dem reinklicken und dann immer Up/Down klicken fand ich ziemlich umständlich.

    Da kam mir dann die Idee, mit dem Mausrad. Der Mauszeiger bestimmt die Position und das Mausrad verändert den Wert. Das gefiel mir gut, weil man die Werte recht schnell ändern kann (ohne viel Geklicke).

    Aber nicht jede Maus hat ein Mausrad (bei den meisten allerdings mittlerweile schon) oder es wird ein Touchpad benutzt. Deswegen habe ich noch die Tastatursteuerung eingebaut.

  • Ich habe eine Logitech Wireless Mouse M560 mit freilaufendem Rad... da reicht ein Schubser und das Teil dreht sich wie ein einarmiger Bandit... ^^

    Die Variante mit WinProc hat übrigens einen kleinen (unbeabsichtigten?) Nebeneffekt... denn die Uhr lässt sich auch stellen, wenn das Fenster disabled ist.

    Gestern kam mir der Gedanke, mal kurz zu Testen, wie gut es mit der WinProc-Variante funktioniert, wenn ich mehrere Uhren/Fenster auf eine Funktion registriere. Dann habe ich für beide Fenster einen Button hinzugefügt, mit dem ich das jeweils andere aktiveren und das eigene disablen kann. Nach mehrmaligen Switchen habe ich bemerkt, dass es immer 1-3 Sekunden dauert, bis sich die Fenster nach einem Klick auf den Close-Button schließen. Dann habe ich eine zweite Version geschrieben, die für jedes Fenster eine WinProc-Funktion hat und war erstaunt, dass die Fenster bei dieser viel zügiger reagieren.

    • Offizieller Beitrag

    Nach mehrmaligen Switchen habe ich bemerkt, dass es immer 1-3 Sekunden dauert, bis sich die Fenster nach einem Klick auf den Close-Button schließen.

    Du hast in Deiner ersten Version zweimal SetWindowLong auf $hGui:

    Code
    _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcOld))
    DllCallbackFree($hProcNew)
    _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcOld2))

    Beim zweiten _WinAPI_SetWindowLong() muss $hGui2 drin stehen, so wie Du es in Deiner zweiten Version gemacht hast.

    • Offizieller Beitrag

    Mich störte das verwenden von globalen Variablen im WindowProc. Das behindert einen beim Einsatz als UDF.

    Ich habe nun etwas rumgetrickst und die Maximalwerte als UserData den Labels mitgegeben. Ich hoffe mal, das HiWord davon kann man problemlos nutzen? Im LoWord liegt ja IMHO die Control-ID.

    Jedenfalls funktioniert es so bei mir: