flash (swf) in gui transparent machen

  • hi,
    ich möchte eine swf-datei transparent anzeigen...
    ohne weißen oder andersfarbigen rahmen... in browsern geht es ganz einfach mit <embed src="" wmode="transparent">
    mein code sieht so aus:

    [autoit]

    $gui = GUICreate("Flash-GUI", 100, 100, Default, Default, 0x80000000)
    $obj = ObjCreate("ShockwaveFlash.ShockwaveFlash")
    GUICtrlCreateObj($obj, 0, 0, 100, 100)
    With $obj
    .Movie = @ScriptDir & "\test.swf" ; Pfad zur SWF
    .wmode = "transparent" ; Transparenz was nicht funktioniert
    EndWith
    GUISetState()
    Do
    Until GUIGetMsg() = -3 ; Escape beendet

    [/autoit]


    -> ...wenn es geht, würd ich auch gern die gui transparent machen, so dass nur die flash-bühne sichtbar ist und ohne rahmen...

  • naja war eigentlich klar... flash ist ziemlich unbeliebt bei autoitlern ^^
    aber wär ziemlich geil gewesen solche flashanimationen auf dem desktop abspielen zu können mit transparentem hintergrund... die nächste möglichkeit wäre alle png's hintereinander abzuspielen...
    oder man kopiert diesen bereich des desktops (screencapture) und setzt den als bg für die flash-datei... (blöd, falls die stelle sich ändert oder wenn man da an der stelle was anklicken möchte)...

    schade... falls jemand doch noch was weiß kann derjenige ja gern antworten...

  • was heist hier AutoIt'ler und nix Flash.

    Ich find die Möglichkeit grundsätzlich gut.

    Aber Dein Problem läßt sich vielleicht ganz einfach lösen:

    [autoit]

    $gui = GUICreate("Flash-GUI", 100, 100, Default, Default, 0x80000000)
    $obj = ObjCreate("ShockwaveFlash.ShockwaveFlash")
    $test = GUICtrlCreateObj($obj, 0, 0, 100, 100)
    With $obj
    .Movie = @ScriptDir & "\test.swf" ; Pfad zur SWF
    .wmode = "transparent" ; Transparenz was nicht funktioniert
    EndWith
    GUISetState()
    WinSetTrans($gui,"",50)
    Do
    Until GUIGetMsg() = -3 ; Escape beendet

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Zitat

    -> ...wenn es geht, würd ich auch gern die gui transparent machen, so dass nur die flash-bühne sichtbar ist und ohne rahmen...

    Eigentlich ganz einfach, das mit dem

    [autoit]

    .wmode

    [/autoit]


    klappt aber leider nicht, da hatte ich auch schon das Internetz durchsucht.

    Also entweder kennt man die Hintergrundfarbe eh, sonst Pixel x/y auslesen. ==> Bsp 1

    oder more advanced :P mit PNG (MDI)Child Maske ==> Bsp 2


    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Windowsconstants.au3>
    #include <WINAPI.au3>
    #include <GDIPlus.au3>

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

    Opt('CaretCoordMode', 0)

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

    Global Const $AC_SRC_ALPHA = 1
    Global $hWend
    Global $aPosWin
    Global $aCaretPos

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

    $width = 600
    $height = 450

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

    $hGui = GUICreate("Shockwave Flash Object", $width, $height, (@DesktopWidth/2)-200, (@DesktopHeight/2)-200)
    $bBlack = GUICtrlCreateButton("schwarz", 450, 10, 100, 30)
    $bRed = GUICtrlCreateButton("rot", 450, 60, 100, 30)
    $bOriginal = GUICtrlCreateButton("original", 450, 110, 100, 30)
    $bGui = GUICtrlCreateButton("GUIBk", 450, 160, 100, 30)
    $bGuiMask = GUICtrlCreateButton("MDICHILD Maske", 450, 210, 100, 30); dann kann man auch Buttons im "transparenten Bereich erstellen)

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

    $hGuiMask = GUICreate("Mask", 350, 200, 10, 200, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGui) ;<====================================Bsp 2
    _GDIPlus_Startup()
    $hMask = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Mask.png"); PNG mit gleicher Grösse, wie das swf; das was zu sehen sein soll transparent
    SetBitMap($hGuiMask, $hMask, 255) ;wenn man noch eine transparentes Controlebene drüberlegt kann man auch Buttons im
    GUISetState(@SW_HIDE) ;Überlappungsbereich erstellen, das geht sonst nicht.

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

    GUISwitch($hGui)

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

    $flash1 = ObjCreate("ShockwaveFlash.ShockwaveFlash.1")
    GUICtrlCreateObj($flash1, 10, 10, 276, 137)
    With $flash1
    .Movie = @ScriptDir & "\test.swf"
    .ScaleMode = 3;0 showall, 1 noborder, 2 exactFit, 3 noscale ==> Flash OBJECT and EMBED tag attributes
    .bgcolor = "" ; http://kb2.adobe.com/cps/127/tn_12701.html
    ; .Loop = True <== funktioniert bei mir nicht; ==> zum Beenden setzen
    ; .wmode = "" <== funktioniert auch sonst nur eingeschränkt
    .Quality = 1
    .Playing = 1
    .Menu = 1
    EndWith

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

    $flash2 = ObjCreate("ShockwaveFlash.ShockwaveFlash.1")
    GUICtrlCreateObj($flash2, 10, 200, 276, 137)
    With $flash2
    .Movie = @ScriptDir & "\test.swf"
    .ScaleMode = 3;0 showall, 1 noborder, 2 exactFit, 3 noscale
    .bgcolor = ""
    ; .Loop = True
    ; .wmode = ""
    .Quality = 1
    .Playing = 1
    .Menu = 1
    EndWith

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

    GUISetState(@SW_SHOW, $hGui)

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

    $aPosWin = WinGetPos($hWend)
    $aCaretPos = WinGetCaretPos()
    $BKOriColor = PixelGetColor($aPosWin[0] + $aCaretPos[0] + 12 , $aPosWin[1] + $aCaretPos[1] + 12, $hWend)

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

    _SetFlashBKColor($hGui, 2, 2, $flash2) ;<========================================================================== Bsp 1

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

    While 1
    Switch GUIGetMsg()
    Case $bBlack
    GUISetState(@SW_HIDE, $hGuiMask)
    GUISetBkColor(0x000000, $hGui)
    _SetFlashBKColor($hGui, 2, 2, $flash2)
    Case $bRed
    GUISetState(@SW_HIDE, $hGuiMask)
    GUISetBkColor(0xff0000, $hGui)
    _SetFlashBKColor($hGui, 2, 2, $flash2)
    Case $bOriginal
    GUISetState(@SW_HIDE, $hGuiMask)
    GUISetBkColor(0xe0dfe4, $hGui)
    $flash2.bgcolor = "#" & Hex($BKOriColor , 6)
    Case $bGui
    GUISetState(@SW_HIDE, $hGuiMask)
    GUISetBkColor(0xe0dfe4, $hGui)
    $flash2.bgcolor = "#e0dfe4"
    Case $bGuiMask
    GUISetState(@SW_SHOW, $hGuiMask)

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

    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    _GDIPlus_ImageDispose($hMask)
    _GDIPlus_Shutdown()

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

    Func _SetFlashBKColor($hWend, $x, $y, $oFlash); Clientbereich + $x/$y
    $aPosWin = WinGetPos($hWend)
    $aCaretPos = WinGetCaretPos() ;Fenster muss im Vordergrund sein
    $BKColor = PixelGetColor($aPosWin[0] + $aCaretPos[0] + $x , $aPosWin[1] + $aCaretPos[1] + $y, $hWend)
    $oFlash.bgcolor = "#" & Hex($BKColor, 6)
    Endfunc

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

    ; ===============================================================================================================================
    ; SetBitMap
    ; ===============================================================================================================================
    Func SetBitmap($hGui, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

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

    $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", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC (0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC ($hMemDC)
    EndFunc

    [/autoit]


    MfG t002