GUI flackert

  • Hi,

    beim folgenden Skript flackert die GUI.


    Startet das Skript und haltet dann die linke Maustaste gedrückt.

    Dann zieht ihr ein Fenster auf und bewegt die Maus etwas schneller.

    Nun flackert die rote Fläche teilweise.


    Ich nutze 3.3.16.0

    Bei 3.3.4.15 war dies nicht so.


    Woran könnte dies liegen?


  • Startet das Skript und haltet dann die linke Maustaste gedrückt.

    Dann zieht ihr ein Fenster auf und bewegt die Maus etwas schneller.

    Nun flackert die rote Fläche teilweise.

    Ich habe nicht die neue Version installiert.

    Aber probiere mal, ob das auch mit dem Color-Picker aus meinem Farbmixer passiert. Da wird nur die Maus bewegt, ohne gedrückt halten. - Könnte ein Problem sein.

  • Woran könnte dies liegen?

    Weiß ich nicht. Ist bei mir auch nicht so, aber ich habe mal eine Alternative erstellt:

  • BugFix

    mit deinem Colormixer flackert nichts. Wobei man bei dir ja auch kein Fenster aufziehen kann, sonder nur die Lupe drin ist.

    Diese flackert auch nicht.


    Oscar

    Du verwendet auch die neue Version. Bei dir flackert mein Skript nicht?

    Dein Skript flackert bei mir auch nicht.


    Folgende Unterschiede habe ich gesehen und möchte verstehen warum du es anders (besser :P ) gelöst hast.

    • Dummy -GUI. Ich habe den Kommentar gelesen aber nicht verstanden. Ich sie auch mal deaktiviert aber keinen Unterschied festgestellt.
    • Du verwendest GUIGetCursorInfo statt _Ispressed. Warum?
    • Du verwendest 1 GUI mit Auswahl, 2x Fadenkreuz und veränderst die Position immer mit GUICtrlSetPos.
      Ich verwende 3 GUIs. 1 GUI für Auswahl (Verschieben durch GUICtrlSetPos) 2 GUI für Fadenkreuz (verschieben durch WinMove der GUI)


    Ich denke nur das 3 spielt eine Rolle für das flackern, oder?

  • Du verwendet auch die neue Version. Bei dir flackert mein Skript nicht?

    Dein Script "flackert" mal kurz, wenn man die linke Maustaste das erste Mal drückt und das Label aufzieht.



    Dummy -GUI. Ich habe den Kommentar gelesen aber nicht verstanden.

    Die Dummy-Gui verhindert, dass man mit dem Auswahlkreuz in ein darunter liegendes Fenster etwas auswählen kann. Wenn SciTE mit dem Script drunter ist, kann man das sehen.


    Du verwendest GUIGetCursorInfo statt _Ispressed. Warum?

    Ist einfach zum einsparen von _IsPressed und MouseGetPos. Mit GUIGetCursorInfo bekommst Du beides gleichzeitig.


    Du verwendest 1 GUI mit Auswahl, 2x Fadenkreuz und veränderst die Position immer mit GUICtrlSetPos.

    Ja, eine GUI und Fadenkreuz und Auswahl sind Label.

    Vielleicht liegt darin auch schon der Grund für das "flackern", weil bei mir nicht mehrere Fenster "übereinander" liegen!?

    Ok, bei Windows sind alles Fenster, aber eben Childs vom Hauptfenster.

  • Zieht das Fenster mal von rechts unten nach links oben.

    Bei mir flackert dann das rechte untere Eck.

    Bei euch auch?

  • Bei mir flackert dann das rechte untere Eck.

    Bei euch auch?

    Ja, dafür war das Script nicht vorgesehen. Das Label muss verschoben und in der Größe angepasst werden. Das flackert zwangsläufig.

    Ich habe mal eine Version mit GDI+ geschrieben, die dann auch mit mehreren Monitoren zurechtkommt (Anhang).

    Da kannst Du das Auswahlrechteck sowohl von links-oben als auch von rechts-unten starten.

  • Wow, da flackert nun nichts mehr :klatschen:

    Danke schonmal :)


    2 Sachen habe ich aber noch.


    Ich würde gerne das abdunkeln des Hintergrunds abschalten.

    Dachte eigentlich, dass dies durch GUISetBkColor($iTransColor) bzw. WinSetTrans($hDummy, '', 20) gemacht wird.

    Das deaktivieren bringt aber nichts.


    Ich habe noch eine Lupe eingefügt.

    Leider läuft das Fadenkreuz nach.

    Ist es möglich die Lupe ohne das Fadenkreuz darzustellen?


  • Ich würde gerne das abdunkeln des Hintergrunds abschalten.

    Hmm...das Auswahlrechteck soll ja halbtransparent sein. Im Moment fällt mir dazu keine Lösung ein.


    Ist es möglich die Lupe ohne das Fadenkreuz darzustellen?

    Wozu? Ich finde es gerade hilfreich, wenn man das Fadenkreuz auch in der Lupe sieht.

    Das "nachlaufen" kann man einfach beheben. Außerdem habe ich mal noch ein paar Fehler beseitigt (Script im Anhang).

  • Klar, ich habe zuerst gedacht man kann nur den rot markierten Bereich transparant darstellen und den restlichen Bildschirm original. Aber das geht ja leider nicht.


    Ich finde es auch sinnvoll, dass das Fadenkreuz in der Lupe angezeigt wird. Ich dachte nur man könnte es irgendwie ausblenden und dann in der Lupe mittig neu zeichnen.

    Hast du am nachlaufen wirklich was geändert. Es verhält sich immer noch so wie vorher :rolleyes:

  • Moin,


    wenn Du das 'Nachlaufen' verhindern willst, musst Du die Lupe erst aktualisieren, nachdem das Fadenkreuz in _BlendBitmap() neu gezeichnet worden ist.


    Das 'Abdunkeln' ist z.Zt. zweistufig:

    1. Das Dummy-GUI mit einer Transparenz von 10 (WinSetTrans($hDummy, '', 10)

    2. Darüber das FullScreen-GUI mit einer Transparenz von 60 (_BlendBitmap($hBgGui, $hBuffer, 60))


    Man könnte allerdings auf das Dummy-GUI komplett verzichten und die Tranzparenz von Hintergrund, Auswahlrechteck und Fadenkreuz im FullScreen-GUI direkt und auch unterschiedlich vorgeben. Eine Vorgabe von 0 ist aber nicht ratsam, weil dann die Mausklicks auf das darunterliegende Fenster durchgeleitet werden.

  • Man könnte allerdings auf das Dummy-GUI komplett verzichten und die Tranzparenz von Hintergrund, Auswahlrechteck und Fadenkreuz im FullScreen-GUI direkt und auch unterschiedlich vorgeben.

    Das ist mir nicht ganz klar. Wie kann man die Teile unterschiedlich transparent darstellen?


    Ich habe das Script jetzt mal dahingehend umgestellt (Anhang), dass der Mauszeiger als Bitmap auf die Graphic gezeichnet und der Original-Mauszeiger versteckt wird. Das verhindert die Latenz, die durch die AutoIt-Befehle auftreten.

  • Ich hab noch eine Idee, aber es funktioniert nicht und ich weiß nicht wieso :(


    Beim folgenden Skript ist das Fadenkreuz mittig in der Lupe und flackert nicht


    Nun dachte ich mir ich erstelle den Auswahlbereich mit _GDI... und das Fadenkreuz mit 2 GUIs.

    Warum auch immer bewegt sich dann das Fadenkreuz wieder in der Lupe, warum?

  • Das ist mir nicht ganz klar. Wie kann man die Teile unterschiedlich transparent darstellen?

    Moin Oscar,


    ich meinte das so. Es beruht allerdings auf einer Version ohne Lupe:

    Die Farben für das Fadenkreuz und das Auswahlrechteck werden als ARGB Werte übergeben. Die Transparenz für den Hintergrund ist fest verdrahtet

    _GDIPlus_GraphicsClear($hGfxBuffer, 0x08FFFFFF)

  • ich meinte das so. Es beruht allerdings auf einer Version ohne Lupe:

    Ok, das ist super!

    Ich habe mal noch die Lupe hinzugefügt und den Cursor entfernt (wird ja eigentlich nicht gebraucht bei dem Fadenkreuz):


  • Moin Oscar,


    ein Vorschlag zur Synchronisierung (es läuft damit jedenfalls auf meinem Rechner besser):

    AutoIt
            _WinAPI_UpdateLayeredWindow($hBgGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
            _ShowMagnifier($hMagnifier, $aInfo, $iVSW, $iVSH, $iVSX, $iVSY)
  • ein Vorschlag zur Synchronisierung (es läuft damit jedenfalls auf meinem Rechner besser):

    Ja, Du hast recht! Damit läuft es besser. :thumbup:

    Und damit die Prozessorlast noch etwas runtergeht, kann man das Update auch nur bei einer Bewegung ausführen (reicht ja):

  • Und damit die Prozessorlast noch etwas runtergeht, ...

    Dazu ist mir nach längerem Herumprobieren wieder eingefallen, dass es auch ohne GDI-Bitmap geht, wenn man anstelle der GDIP-Bitmap eine GDI-DIBSECTION verwendet. Diese Technik habe ich aber nicht selbst erfunden:

  • Dazu ist mir nach längerem Herumprobieren wieder eingefallen, dass es auch ohne GDI-Bitmap geht, wenn man anstelle der GDIP-Bitmap eine GDI-DIBSECTION verwendet.

    Ah, sehr interessant! :thumbup:

    Ich habe das mal übernommen und noch eine Capture-Funktion zum testen der Koordinaten eingebaut:

    Edit: Da war noch ein Fehler drin! Bei den Koordinaten stimmten die Werte nicht, wenn man die Auswahl nicht von oben/links vorgenommen hat.