GDI+ layered gui (transparent)

  • Moin Com,

    seit paar Stunden (oh schon 7 Uhr morgens :D ) suche ich eine Funktion/Methode,
    womit ich ein GUI transparent gestalten kann. Und zwar habe ich ein Kreis als .png Datei,
    die ich in Autoit laden will aber dieser Backbuffer ist ja immer schwarz. Und somit sieht
    man einmal den Kreis und der Rest ist dann schwarz wie ein Kasten ausgefüllt.

    Hier kleines Beispiel: http://puu.sh/qFmCS/dadd8e1697.png

    Ich wollte das eigentlich so haben, dass man nur den Kreis sieht, aber man soll noch andere
    Elemente auf dem Kreis mit GDI zeichen können.

    Z.B habe ich mir dieses Doodlejump Script angeschaut. Da haben die auch eine individuelle
    Form genommen: http://puu.sh/qFmFq/5418fafcd0.jpg

    Die Funktion habe ich dann kopiert, aber irgendwie kann ich dann nichts mehr auf dem GUI mit GDI zeichnen.
    Man sieht dann quasi nur den Kreis.

    Ich habe auch schon sowas wie _WinAPI_SetLayeredWindowAttributes getestet, aber das brachte
    nichts. Und wenn ich ganz normal diesen $WS_EX_LAYERED nehme, sieht man das GUI garnicht mehr.


    Das hat mich echt retarded gemacht. Weiß jemand, wie ich so eine Transparenz hinkriege?

  • Hier ein Beispiel, wie man ein Bild transparent darstellen kann.

    Du könntest auch anstelle des Bildes auch ein eigenes Bild erstellen und es darstellen.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hi UEZ :)

    kann ich dann bei diesem script keinen backbuffer einbauen?

    Hab das so versucht

    AutoIt
    $buffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Backbuffer

    Aber dann stürzt das Script unerwartet ab.
    Und sonst war das immer so, dass ich in er Hauptschleife die Bilder mit _GDIPlus_GraphicsDrawImageRect geladen habe.

  • Du kannst nicht einfach GDI+ Elemente mit GDI Elementen mischen.
    Ferner musst du das Resultat immer wieder neu setzen.

    Älteres Beispiel von mir:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Achso wusste ich nicht. :(

    Dein Beispiel klappt bisher super, danke fürs Posten. :D

    Könntest du mir vielleicht noch sagen, wieso in der Hauptschleife


    AutoIt
    _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000)
    $GDIBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_SelectObject($dc, $gdibitmap)
    _WinAPI_UpdateLayeredWindow($hWnd, $ScreenDc, 0, $pSize, $dc, $pSource, 0, $pBlend, 1)
    _WinAPI_DeleteObject($GDIBitmap)


    drin steht? Normal hat man das ja nicht oder ist das wie der sonst genutze double buffer?

  • Hier wird ein GDI+ image nacg GDI konvertiert und per _WinAPI_UpdateLayeredWindow in der GUI angezeigt. Dazu benötigst du kein Backbuffer.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯