gdi+ transparenz-problem

  • howdy ho!

    kurz und knackig:

    [autoit]

    Func _splatter()
    $GUIsplatter = GUICreate("",@DesktopWidth,@DesktopHeight,0,0,$WS_POPUP,BitOR($WS_EX_LAYERED,$WS_EX_TOPMOST))
    GUISetBkColor(0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($GUIsplatter, 0xABCDEF, 255)
    GUISetState(@SW_SHOW)
    Sleep(1000)
    Global $hImageS, $hGraphicS
    $hImageS = _GDIPlus_ImageLoadFromFile("blut.png")
    $hGraphicS = _GDIPlus_GraphicsCreateFromHWND($GUIsplatter)
    $splatterBlut = _GDIPlus_GraphicsDrawImageRect($hGraphicS,$hImageS,0,@DesktopHeight-600,800,600)
    sleep(10000)
    _GDIPlus_GraphicsDispose($hGraphicS)
    _GDIPlus_ImageDispose($hImageS)
    GUIDelete($GUIsplatter)
    EndFunc

    [/autoit]

    was mach ich falsch wenn ich die TEILWEISE transparenten stellen nich in der farbe 0xABCDEF haben möchte? der rest der gui wird transparent angezeigt. die grafik hänge ich an.

    mfg
    sgtigram

  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    _GDIPlus_Startup()
    _splatter()

    [/autoit] [autoit][/autoit] [autoit]

    Func _splatter()
    $hImageS = _GDIPlus_ImageLoadFromFile("blut.png")
    $iW = _GDIPlus_ImageGetWidth($hImageS)
    $iH = _GDIPlus_ImageGetHeight($hImageS)
    $GUIsplatter = GUICreate("",$iW, $iH,0,@DesktopHeight-$iH,$WS_POPUP,BitOR($WS_EX_LAYERED,$WS_EX_TOPMOST))
    ;~ GUISetBkColor(0xABCDEF)
    GUISetState(@SW_SHOW)
    ;~ Sleep(1000)
    ;~ _WinAPI_SetLayeredWindowAttributes($GUIsplatter, 0xABCDEF, 255)
    Global $hImageS, $hGraphicS
    $hGraphicS = _GDIPlus_GraphicsCreateFromHWND($GUIsplatter)
    $splatterBlut = _GDIPlus_GraphicsDrawImage($hGraphicS,$hImageS,0,0)
    SetTransparentBitmap($GUIsplatter, $hImageS)
    sleep(5000)
    _GDIPlus_GraphicsDispose($hGraphicS)
    _GDIPlus_ImageDispose($hImageS)
    GUIDelete($GUIsplatter)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func SetTransparentBitmap($hGUI, $hImage, $iOpacity = 0xFF)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hMemDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc ;==>SetTransparentBitmap

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • danke für die schnelle antwort. hat geklappt auch wenn ich bei deiner korrektur noch das

    [autoit]

    Global $hImageS,$hGraphicS

    [/autoit]

    rausnehmen musste

    schade ist auch das diese lösung nur funktioniert wenn die grafik so groß wie die ganze gui ist

    mfg
    sgtigram

  • danke für die schnelle antwort. hat geklappt auch wenn ich bei deiner korrektur noch das

    [autoit]

    Global $hImageS,$hGraphicS

    [/autoit]

    rausnehmen musste

    schade ist auch das diese lösung nur funktioniert wenn die grafik so groß wie die ganze gui ist

    mfg
    sgtigram

    Nicht die Grafik ist so groß wie die GUI, sondern genau umgekehrt - die GUI ist so groß wie die Grafik.

    Die Zeile Global $hImageS,$hGraphicS habe ich nicht hinzugefügt, sondern so gelassen, wie du es gepostest hattest. ;)

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • ja aber rausgenommen hast sie auchnich nachdem $hImageS mitlerweile schon weiter oben deklariert wird ;D.
    gibts dafür auch eine elegante lösung wenn die GUI größer wäre als das bild?

    mfg sgtigram

  • ja aber rausgenommen hast sie auchnich nachdem $hImageS mitlerweile schon weiter oben deklariert wird ;D.


    Das kannst du schön selbst machen! :P

    Zitat


    gibts dafür auch eine elegante lösung wenn die GUI größer wäre als das bild?

    mfg sgtigram

    Das verstehe ich nicht oder meinst du, wenn das Bild größer als der Desktop ist?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯