GDIPlus-HoverButton Problem

  • Hallo,

    es tut mir leid, dass ich euch schon wieder nerven muss, aber ich komm einfach nicht weiter.
    Hab eine Funktion _CheckHoverButton(...), die überprüfen soll, ob sich die Maus über dem "Button" befindet, funktioniert aber nur in eine Richtung.
    Das Problem ist schwer zu beschreiben, wenn ihr das Skript ausführt, erkennt ihr aber glaube ich das Problem.


    Bin dankbar um Antworten.

    Lg NO1 :)

  • Hallo @NO1 :-),

    Du rufst die Funktion in Schleife auf und gibst als Parameter $iBtnState mit. In der Funktion wertest du das als $iState aus. Das macht deine Prüfung $iState 1 oder 0 ist natürlich sinnlos. Beim Aufruf der Funktion ist $iState immer 0.


    Ersetze $iBtnState = 0 durch $iState = 0 (globale Variable) und lass $iBtnState und auch $iState als Funktionsparameter weg. Dann müsste auch deine Abfrage funktionieren.

    AutoIt
    Local $iBtnState = 0	
    
    
    ...
    
    
    _CheckHoverButton($idBtn, $iBtnState, $hGraphics, "Test", "Arial", 18, 128, 34, 105, 30, 90, 30)

    Edit: Wenn du die Variable nur in dieser Funktion auswerten musst, kannst du statt einer globalen Variable $iState auch in der Funktion (vllt. erste Zeile) die Variable local zu deklarieren: Local Static $iState = 0

    Grüße autoiter

  • Hi!

    Wenn du es so machst, wie autoiter es empfiehlt (ich würde allerdings ein Local Static Flag verwenden), wirst du feststellen, daß der Aufruf von _GDIPlus_GraphicsFillRect im else Zweig einen Fehler wirft.

    Da ich aber im Moment weder Zeit, noch Lust habe, den Fehler zu ergründen und außerdem kein großer Fan von GDI bin, hier ein Vorschlag zur Umsetzung des Hover Buttons mit Labels:

    Spoiler anzeigen


    Ist ganz flott in 10 Minuten runtergeschrieben und läßt sich vermutlich eleganter lösen, aber es sollte gut verständlich sein und zeigen, wie einfach man es sich machen kann...ganz ohne GDI :rock:
    Erweiterte Animationen, wie bei "OnClick" sind mit Labels auch kein Problem...

    Beste Grüße, Friesel

  • Dann müsste auch deine Abfrage funktionieren.

    Was es aber nicht tut...

    Für "ButtonHover" gibt es übrigens mindestens zwei UDFs... im Anhang findest du die, die ich dafür verwende...

    @Friesel
    Dein Ansatz ist sehr kurz und einfach, aber "Polling" ist immer eine schlechte Lösung... viel besser (effizienter) ist es, die entsprechende Message auszuwerten, so wie es die UDF macht.

  • Also ich hab Eure Antworten erst jetzt lesen können.

    Erst einmal viiieeelen Dank.
    Manchmal bleibt man bei den einfachsten Problemen hängen. Hab den State in der Funktion mitgegeben wollen, da ich die Funktion öfters benutze und dann einfach nur die Parameter ändern muss.
    Ich verwende jetzt autoiter's Lösung. Nix gegen Eure Lösungen, aber die passt halt in diesem Fall am Besten.

    Um einer Funktion eine globale Variable zu übergeben kann ich aber ByRef verwenden, oder?

    MfG NO1 :)

  • Kannst du, ist aber nicht notwendig, da globale Variablen an jeder beliebigen Stelle im Script geändert werden können.

    Byref ist sehr empfehlenswert, wenn große Datenmengen (Strings/Arrays) an eine Funktion übergeben werden, da in diesem Fall lediglich eine Referenz (ein Zeiger) auf die Variable an die Funktion übergeben wird. Ohne ByRef wird eine Kopie der Variable erstellt und an die Funktion übergeben, was vor allem bei sehr großen Arrays extrem viel Zeit kostet.

    Hier kannst du es selbst auf Deutsch nachlesen: https://autoit.de/onlinehilfe/keywords/Func.htm

    Du solltest dir allerdings dringend angewöhnen, globale Variablen auch als solche erkenntlich zu machen. Das ist vor allem bei einer späteren Fehlersuche ungemein hilfreich! (Huhu @Oscar ;) )

    Global $g_hGUI, $g_iBtnState = 0, ...