GDI+ Transparenz Problem bei Bildüberlappung

  • Hallo Community,

    ich habe ein Problem wenn ich ein mit GDI+ geladenes Bild (*.png), auf der GUI, auf eine andere Position ziehe (drag). Wenn ich das nächste Bild (von insgesamt drei) in die unmittelbare Nähe des ersten gezogenen Bildes ziehe, habe ich einen Überlappungseffekt, der nicht transparent ist, wie ich ihn gern hätte.

    Das animierte GIF sollte hoffentlich mein Problem weiter erklären (wie auf GitHub).

    Warum sind die GDI+ PNG Bilder nicht transparent auf der GUI?

    Ich möchte nicht unbedingt ein Buffer System zur Darstellung einsetzen oder muss ich dies?

    Danke für Vorschläge, Tipps und Hilfe - ich bin dankbar!
    Sven

    Vorher:

    [Solved] Finale Lösung:

    Danke der Community und besonders UEZ und @argumentum (EN Forum).

    Code:
    Nachher:
  • Hi,

    Aus der AutoIt-Hilfe:

    To have a transparent picture create the GUI with the WS_EX_LAYERED extended style. The left-top pixel will be used as the transparency color. If several pictures are created the last picture defines the transparent color. See example 2.

    Ich möchte nicht unbedingt ein Buffer System zur Darstellung einsetzen oder muss ich dies?

    Was spricht dagegen? Ich denke GDIPlus + Buffer sind hier eine gute Lösung.

    Dein Script enthält übrigens viele Stellen die mit Arrays viel einfacher und übersichtlicher laufen würden.

    Sieh dir hierzu mal das Tutorial von Bugfix an.

    mfg

    Zeitriss

  • Hallo Zeitriss,

    vielen Dank für deine Hinweise. Leider schade, dass du offensichtlich es nicht versucht/getestet hast. Wenn ich die GUI mit dem Style erstelle, habe ich noch immer das gleiche Verhalten (keine Besserung). Habe den Code und die Images extra zu Verfügung gestellt, damit man direkt damit probieren kann. Aber dennoch Danke.

    Was das Buffer System angeht, wollte ich dies nicht extra für den kleinen MapEditor, den ich da baue, einführen. Wenn es aber nicht anders geht, muss ich wohl. Zu deiner Anmerkung mit den Stellen, die besser Arrays sein könnten danke ich dir. Ich habe das Skript noch nicht refactored, aber werde es dann dabei berücksichtigen.

    Leider wiedersprechen Arrays ein Stück weit verschiedener Clean Code Empfehlungen, welche ich umzusetzen bemüht bin.

    Danke für weitere Vorschläge, Tipps und Hilfe - ich bin dankbar!

    Sven

    Einmal editiert, zuletzt von Sven-Seyfert (17. November 2017 um 09:38)

  • Darf man fragen was das für Empfehlungen sind und wo man diese nachlesen kann?

    Ich glaube er hat sich einfach nur unglücklich ausgedrückt. Nur weil man an einigen Stellen Arrays verwenden kann um paar Zeilen zu sparen, sollte man ab und zu darauf verzichten um die Lesbarkeit des Codes zu gewährleisten oder die dahinterliegende Semantik schneller nachvollziehen zu können.

    @UserIsGrateful du solltest noch eine Abfrage einbauen, ob der Mausklick im Fenster liegt oder nicht. Wenn du außerhalb des Fensters klickst, crasht dein Script.

  • Darf man fragen was das für Empfehlungen sind und wo man diese nachlesen kann?

    Natürlich darf man fragen: Bspw. in Clean Code by Robert C. Martin, näher im Zusammenhang mit readability und structured handover in a team. Nicht falsch verstehen, geht nicht im speziellen um Arrays. Für Skriptsprachen sind viele Empfehlungen auch gar nicht vollends umsetzbar. Ich möchte aber keine Grundsatzdiskussion führen müssen oder diese anleiern oder so.

    Mir ging es in erster Linie nur um die Transparenz der PNG Bilder auf der GUI, welche nicht wirklich transparent sind - warum nicht?

    Danke für weitere Vorschläge, Tipps und Hilfe.

    Sven

    Einmal editiert, zuletzt von Sven-Seyfert (17. November 2017 um 09:40)

  • Nur weil man an einigen Stellen Arrays verwenden kann um paar Zeilen zu sparen, sollte man ab und zu darauf verzichten um die Lesbarkeit des Codes zu gewährleisten oder die dahinterliegende Semantik schneller nachvollziehen zu können.

    @UserIsGrateful du solltest noch eine Abfrage einbauen, ob der Mausklick im Fenster liegt oder nicht. Wenn du außerhalb des Fensters klickst, crasht dein Script.

    Hallo Alpines,

    ja ganz genau, dies ist einer der Punkte um den es mir beim Refaktorisieren, Richtung Clean Code bspw. geht. Danke für die Erläuterung in anderer Ausdrucksweise :) .

    Was den Fenster-Crash angeht, habe ich dies bereits gefixed, ist mir auch aufgefallen - merci!

  • Hallo nochmal Zeitriss,

    entschuldige, ich habe dir Unrecht getan. Generell müsste es mit WS_EX_LAYERED funktionieren, ja. Habe diverse andere Skripte mal versucht und da geht es mit der GUI Transparenz. Nur eben bei diesem Skript irgendwie gerade nicht. Wenn ich nach GUISetState() ein Sleep( 5000 ) bspw. einbaue, sieht man, dass es mit der Transparenz funktioniert.

    Nach der Zeit wird diese Eigenschaft durch irgendeinen Aspekt wieder überschrieben und ich habe wieder ein GUI Hintergrund. Na mal sehen, dass bekomme ich schon raus.

    Melde mich sicherlich nochmals hier, um möglichen Interessenten etwas für die Nachwelt zu hinterlassen ;) .

  • Okay, gelöst.

    Danke allen Helfenden. Der transparente GUI Hintergrund ist nun vorhanden. Das die PNGs sich noch überlappen löse ich dann mit einem GDI+ Buffer System.

    Problem war:

    _WinAPI_SetLayeredWindowAttributes( $oMain, $vGuiBkColor, 255 )
    muss nach

    _GDIPlus_BitmapCreateHBITMAPFromBitmap( $hImage )

    aufgerufen werden, damit der GUI Hintergrund transparent wird. Denn die GDI+ Funktion setzt erneut den Background der GUI.

    Im Post #1 füge ich den korrekten Code nochmals ein, damit bei Interesse man dies nachvollziehen kann. Danach schließe ich den Thread.

    Danke,
    Sven

    Einmal editiert, zuletzt von Sven-Seyfert (17. November 2017 um 09:41)

  • Falls du nicht in die SB schaust: Großes Lob an Dich. Das hier ist ein Vorbildlicher H&U Thread in welchem das Problem sauber beschrieben, mit Beispielskript und Bildchen versehen und anschließend eine Lösung für jeden zugänglich gemacht wurde. So sollte ein guter H&U Thread aussehen :)

    lg

    Mars & Musashi

  • Hier ein Lösungsansatz:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Falls du nicht in die SB schaust: Großes Lob an Dich. Das hier ist ein Vorbildlicher H&U Thread in welchem das Problem sauber beschrieben, mit Beispielskript und Bildchen versehen und anschließend eine Lösung für jeden zugänglich gemacht wurde. So sollte ein guter H&U Thread aussehen :)

    lg

    Mars & Musashi

    Hallo Mars, hallo Musashi,

    habe nun extra ins SB Archiv geschaut - Dankeschön! Solch ein Lob freut mich natürlich.
    Aus meiner Sicht gab es auch keinen einfacheren/deutlicheren Weg Mißverständnisse zu minimieren.


    Nun zu dir UEZ :)
    Ebenfalls vielen Dank! Super Lösungsvorschlag!
    Das du dich im EN Forum gewundert hast (... and I'm wondering why the solution #2 works properly for him!?!?.), warum dies für mich bereits reicht, bitte ich zu entschuldigen.

    Hatte im Post #9 (DE) geschrieben:

    Danke allen Helfenden. Der transparente GUI Hintergrund ist nun vorhanden. Das die PNGs sich noch überlappen löse ich dann mit einem GDI+ Buffer System.

    Jedoch hilft mir dein Ansatz/Lösungsvorschlag viel mehr :) .

    Bis zur nächsten Frage dann, klasse Community!

    Sven

    Einmal editiert, zuletzt von Sven-Seyfert (17. November 2017 um 09:41)