_WinAPI_SetLayeredWindowAttributes

  • Moin Leute,
    Ich habe mir eine Gui gemacht und habe dann den Hintergrund weiß gemacht eine Button drauf gesetzt und mit GDIPlus ein Rechteck gezeichtnet. Nur wollte ich mit _WinAPI_SetLayeredWindowAttributes da wo die Gui noch weiß ist mit dem wert 100 (geht bis 255) Transparent machen, nun passiert aber folgendes, das weiß wird ganz durchsichtig und der rest wir mit dem wert 100 Transparent, hat jemand eine Idee wie ich das beheben kann? WOllte nich das das weiß ganz verschwindet, sonder einfach 100 Transparent wird und der Rest sollte so bleiben wie er ist

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinApi.au3>
    #include <GDIPlus.au3>

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

    #Region ### START Koda GUI section ### Form=
    $hwnd = GUICreate("Form1", 200, 200, Default, Default,$WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor (0xFFFFFF)
    GUICtrlCreateButton ("Test",10,10)
    _WinAPI_SetLayeredWindowAttributes($hWnd, 0xFFFFFF,100)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    _GDIPlus_Startup ()
    $Graphics = _GDIPlus_GraphicsCreateFromHWND ($hwnd)
    $PenRect = _GDIPlus_PenCreate (0xFFFFAA00,10)
    _GDIPlus_GraphicsDrawRect($Graphics, 0, 0, 199, 199,$PenRect)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    mfg. Jam00

  • Hier eine Version:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinApi.au3>
    #include <GDIPlus.au3>

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

    #Region ### START Koda GUI section ### Form=
    $width = 200
    $height = 200
    $hwnd = GUICreate("Form1", $width, $height, Default, Default, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST)
    GUISetState(@SW_SHOW)
    $bsize_x = 50
    $bsize_y = 30
    $child = GUICreate("", $bsize_x, $bsize_y, $width * 0.5 - $bsize_x * 0.5, $height * 0.5 - $bsize_y * 0.5, $WS_POPUP, $WS_EX_MDICHILD + $WS_EX_LAYERED, $hwnd)
    $button = GUICtrlCreateButton ("Test", 0, 0, $bsize_x, $bsize_y)
    _WinAPI_SetLayeredWindowAttributes($child, 0xFFFFFF, 160)
    GUISetState(@SW_SHOW)

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

    ;~ GUISetBkColor (0xFFFFFF)
    #EndRegion ### END Koda GUI section ###

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

    _GDIPlus_Startup ()
    $Graphics = _GDIPlus_GraphicsCreateFromHWND ($hwnd)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    $ScreenDc = _WinAPI_GetDC($hWnd)
    $gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($bitmap)
    $dc = _WinAPI_CreateCompatibleDC($ScreenDc)
    _WinAPI_SelectObject($dc, $gdibitmap)
    ; _WinAPI_UpdateLayeredWindow parameters
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $width)
    DllStructSetData($tSize, "Y", $height)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    $alpha = 160
    DllStructSetData($tBlend, "Alpha", $alpha)
    DllStructSetData($tBlend, "Format", 0)
    $tPoint = DllStructCreate($tagPOINT)
    $pPoint = DllStructGetPtr($tPoint)
    DllStructSetData($tPoint, "X", 0)
    DllStructSetData($tPoint, "Y", 0)

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

    $PenRect = _GDIPlus_PenCreate (0xFFFFAA00, 10)
    _GDIPlus_GraphicsClear($backbuffer, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawRect($backbuffer, 0, 0, $width, $height, $PenRect)
    $gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($bitmap)
    _WinAPI_SelectObject($dc, $gdibitmap)
    _WinAPI_UpdateLayeredWindow($hWnd, $ScreenDc, 0, $pSize, $dc, $pSource, 0, $pBlend, 2)
    _WinAPI_DeleteObject($gdibitmap)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($bitmap)
    _WinAPI_DeleteDC($dc)
    _WinAPI_ReleaseDC($hWnd, $ScreenDc)
    _GDIPlus_GraphicsDispose($Graphics)
    _GDIPlus_Shutdown()
    $tSize = ""
    $tSource = ""
    $tBlend = ""
    $tPoint = ""
    GUIDelete($child)
    GUIDelete($hwnd)
    Exit
    Case $button
    WinSetOnTop($hwnd, "", False)
    MsgBox(0, "Transparenz", "von UEZ '2010")
    WinSetOnTop($hwnd, "", True)
    EndSwitch
    WEnd

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (11. August 2010 um 17:32)

  • UEZ
    So wird aber doch ach alles durchsichtig als würde ich einfach WinSetTrans das ganze Fenster transparent machen

    @progandy
    Meinst du das so?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinApi.au3>
    #include <GDIPlus.au3>

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

    #Region ### START Koda GUI section ### Form=
    $hwnd = GUICreate("Form1", 200, 200, Default, Default,$WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor (0xFFFFFF)
    GUICtrlCreateButton ("Test",10,10)
    _WinAPI_SetLayeredWindowAttributes($hWnd, 0xFFFFFF,100)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    _GDIPlus_Startup ()
    $Graphics = _GDIPlus_GraphicsCreateFromHWND ($hwnd)
    $PenRect = _GDIPlus_PenCreate (0xFFFFAA00,10)
    $PenFill = _GDIPlus_PenCreate (0xFFFFFFFF,10)
    _GDIPlus_GraphicsDrawRect($Graphics, 0, 0, 199, 199,$PenRect)
    _GDIPlus_GraphicsFillRect($Graphics,5,5,189,189,$PenFill)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Also so ist nichts anders als voher

    mfg. Jam00

  • Ich glaub, das musst du mit 2 GUIs machen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinApi.au3>
    #include <GDIPlus.au3>

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

    $hGui = GUICreate("Main", 195, 195, Default, Default, $WS_POPUP)
    WinSetTrans($hGui, "", 100)
    $hChild = GUICreate("Child", 200, 200, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGui)
    GUISetBkColor(0xFFFFFF)
    GUICtrlCreateButton("Test", 10, 10)
    _WinAPI_SetLayeredWindowAttributes($hChild, 0xFFFFFF)
    GUISetState(@SW_SHOW, $hChild)
    GUISetState(@SW_SHOW, $hGui)

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

    _GDIPlus_Startup()
    $Graphics = _GDIPlus_GraphicsCreateFromHWND($hChild)
    $PenRect = _GDIPlus_PenCreate(0xFFFFAA00, 10)
    _GDIPlus_GraphicsDrawRect($Graphics, 0, 0, 199, 199, $PenRect)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    mfgE

  • Hier was ähnliches als 1-Fenster Lösung:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #Include <WinAPIEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    If Not _WinAPI_DwmIsCompositionEnabled() Then
    MsgBox(16, 'Error', 'Require Windows Vista or above with enabled Aero theme.')
    Exit
    EndIf

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

    Global $hForm, $hRgn, $hDC, $hPen, $obj_orig

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

    ; Create GUI
    $hForm = GUICreate('Transparent GUI', 200, 200, Default, Default,$WS_POPUP, $WS_EX_TOPMOST)

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

    GUISetBkColor(0)
    GUISetState()

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

    $hDC = _WinAPI_GetWindowDC($hForm) ; DC of entire screen (desktop)
    $hPen = _WinAPI_CreatePen($PS_SOLID, 5,0xFFFFFF)
    $obj_orig = _WinAPI_SelectObject($hDC, $hPen)
    _WinAPI_DrawLine($hDC, 5, 5, 5, 195)
    _WinAPI_DrawLine($hDC, 5, 5, 195, 5)
    _WinAPI_DrawLine($hDC, 195, 5, 195, 195)
    _WinAPI_DrawLine($hDC, 5, 195, 195, 195)

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

    ; Create the "sheet of glass" effect for the specified region. You must call this function whenever DWM composition is toggled.
    _WinAPI_DwmGetColorizationColor()
    If Not @extended Then
    $hRgn = _WinAPI_CreateRectRgn(5, 5, 195, 195)
    Else
    $hRgn = 0
    EndIf
    _WinAPI_DwmEnableBlurBehindWindow($hForm, 1, 0, $hRgn)
    If $hRgn Then
    _WinAPI_DeleteObject($hRgn)
    EndIf

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

    Do
    Until GUIGetMsg() = -3

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

    _WinAPI_SelectObject($hDC, $obj_orig)
    _WinAPI_DeleteObject($hPen)
    _WinAPI_ReleaseDC($hForm, $hDC)
    GUIDelete($hForm)
    Exit

    [/autoit]

    Benötigt wird die WinAPIEx.au3 und Vista+ und Aero!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Das sieht eig ganz gut aus, kann es bestimmt auch gebrauchen für andere dinge, doch mein aktuelles Projekt soll auch für XP funktionieren, wenn es keine andere möglichkeit gibt als Windows Aero muss ich wohl mehrere Fenster nehmen

    mfg. Jam00

  • du möchtest die gui transparent machen ?
    dazu musst du folgendes machen :

    [autoit]


    _WinAPI_SetLayeredWindowAttributes($hWnd, 0xABCDEF, 255)

    [/autoit]


    (klappt 100 %, buttons usw sichtbar)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • @EliteMattthias
    Bitte ließ dir voher alles durch, allein der Titel sagt doch aus das ich den Befehl kenne, aber ist geht nur richtig mit 255 also Komplett durchsitig anders geht es nicht richtig

    mfg. Jam00