SetLayeredWindowAttributes + Child und Buttons

  • Aloha!
    Mir ist grade aufgefallen, dass Buttons die sich auf Child - Fenstern mit LayeredWindowsAttributes befinden einen merkwürdigen schwarzen Rand haben =>
    [Blockierte Grafik: http://img3.imagebanana.com/img/kqhkgdy7/blackborder.gif]

    Hier das Beispielscript:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GuiOnEventMode",1)
    Local $Col = PixelGetColor(55,200)

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

    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    GuiSetBkColor(0x000000)
    ;~ _API_SetLayeredWindowAttributes($MainGui,$Col,255)

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

    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    GuiCtrlSetOnEvent(-1, "Terminate")
    _API_SetLayeredWindowAttributes($BodyGui,$Col,255)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    sleep(100)
    WEnd

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

    Func _API_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $isColorRef = False)
    Local Const $AC_SRC_ALPHA = 1
    Local Const $ULW_ALPHA = 2
    Local Const $LWA_ALPHA = 0x2
    Local Const $LWA_COLORKEY = 0x1
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $LWA_COLORKEY + $LWA_ALPHA)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, 0, 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_API_SetLayeredWindowAttributes

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]


    Hat da jemand eine Idee, wie man den Rand wegbekommt? :P

    Einmal editiert, zuletzt von ChaosKeks (12. Mai 2009 um 15:20)

    • Offizieller Beitrag

    Hallo

    Kann ich nicht bestätigen, weder bei dem
    WindowBlinds Design:
    autoit.de/wcf/attachment/4657/
    Noch beim alten Design:
    autoit.de/wcf/attachment/4658/
    Probier sonst mal ganz oben am anfang des Scriptes folgende Zeile zu schreiben:

    [autoit]

    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 1)

    [/autoit]

    Mfg Spider

  • Hmm ne SetThemeAppProperties hats auch nicht gebracht... aber ich versteh nicht wieso das bei dir keinen rand hat oO..
    Bei mir ist auch die BkColor schwarz.. komisch, kann das an Vista liegen?

    Sonst kann das vllt mal jemand mit Vista testen, bitte? =)

    • Offizieller Beitrag

    Habe Vista Ultimate . Bei mir kommt auch kein Anzeigeproblem des Button, aber die Hintergrundfarbe ist bei mir wie bei GTA. Kein Schwarz zu sehen .

  • Background Color ist bei mir auch nicht schwarz, aber ich hab den komischen Rahmen.

    Damit grigt man den weg:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <winapi.au3>

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

    Opt("GuiOnEventMode",1)
    Local $Col = PixelGetColor(55,200)

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

    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    GUISetBkColor(0x000000)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    GuiCtrlSetOnEvent(-1, "Terminate")
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x02)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    sleep(100)
    WEnd

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]
  • Eh vielen Dank Greek.. soweit so gut:
    Zwar ist jetzt der Rand weg.. das liegt aber daran, dass nun nicht mehr die zweite Gui durchsichtig ist, was mit setlayeredwindowattributes geplant war ;)
    Wenn du oder jemand anders mir jetzt noch das ganze mit einer durchsichtigen zweiten Gui herbeizaubert bin ich happy :thumbup:

  • Teste doch noch mal so ;) Jedenfalls funktioniert es bei mir.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <winapi.au3>

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

    Opt("GuiOnEventMode",1)

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

    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    GUICtrlCreatePic(RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Examples\GUI\logo4.gif",0,0,147,123,0)
    GUISetBkColor(0x000000)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    GuiCtrlSetOnEvent(-1, "Terminate")
    Local $Col = 0xdb7093
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x01)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    sleep(100)
    WEnd

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]
  • Au hey.. hab das Thema fast vergessen geglaubt! :D
    Hatte eig sogar schon nen dummen WorkAround gefunden, aber so klappt es 1A.. lag anscheinend am "PixelGetColor".. Vielen Dank!

  • Hiho ich bins nochmal.. sry für den push aber ich hab ein merkwürdiges Problem entdeckt ;P
    Mit deiner Variante, progandy, klappt das zwar mit dem Rand, aber die Child-Gui ist nun nicht mehr "durchklickbar" sondern einfach "nur" transparent.
    Bei der Methode mit dem PixelgetColor, kann man hingegen durchklicken :P
    Bahnhof?! 8|

    Hab einfach mal nen Beispiel gemacht:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <winapi.au3>

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

    Example1()
    Example2()

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

    Func Example1()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiCtrlSetOnEvent(-1,"msgFunc")
    GUISetBkColor(0x000000)
    GuiCtrlCreateLabel("Color defined!",40,40)
    GuiCtrlSetColor(-1,0xABCDEF)
    GuiCtrlCreateLabel("Ohne Rand",44,82)
    GuiCtrlSetColor(-1,0xABCDEF)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    Local $Col = 0xdb7093
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x01)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    $msg = GuiGetMsg()
    If $msg = $Ex_Button Then
    GuiDelete($MainGui)
    ExitLoop
    ElseIf $msg = $but Then
    msgFunc()
    EndIf
    sleep(10)
    WEnd
    EndFunc

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

    Func Example2()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    Local $Col = PixelGetColor(55,200)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiSetBkColor(0x000000)
    GuiCtrlCreateLabel("PixelGetColor!",40,40)
    GuiCtrlSetColor(-1,0xABCDEF)
    GuiCtrlCreateLabel("Mit Rand",48,82)
    GuiCtrlSetColor(-1,0xABCDEF)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255)
    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    $msg = GuiGetMsg()
    If $msg = $Ex_Button Then
    GuiDelete($MainGui)
    ExitLoop
    ElseIf $msg = $but Then
    msgFunc()
    EndIf
    sleep(10)
    WEnd
    EndFunc

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func msgFunc()
    MsgBox(0,"","")
    EndFunc

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]
  • Hallo ChaosKeks,

    ich hab mal Progandys Beispiel genommen und MsgFunc von dir eingebaut, da klappt das durchklicken wunderbar (hatte ich auch noch nicht gesehen)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <winapi.au3>

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

    Opt("GuiOnEventMode",1)

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

    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    GUICtrlCreatePic(RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Examples\GUI\logo4.gif",0,0,147,123,0)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiCtrlSetOnEvent(-1, "MsgFunc")
    GUISetBkColor(0x000000)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    GuiCtrlSetOnEvent(-1, "Terminate")
    Local $Col = 0xdb7093
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x01)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    sleep(100)
    WEnd

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func Terminate()
    Exit
    EndFunc

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

    Func msgFunc()
    MsgBox(0,"","")
    EndFunc

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

    Damit könnte man sicher auch das TreeView-Problem von Samstag und gestern lösen,

    mfg (Auto)Bert

  • Hmm langsam fühle ich mich von Autoit benachteiligt... bei mir klappt das Durchklicken nämlich nicht :cursing:

  • 100% Kopiert ;) Bei dir gehts und bei mir nicht bei exakt dem gleichem Script.. noch ein Fall für Galileo Mystery o_O

  • Hallo ChaosKeks,

    in deinem Beitrag von 23:11 ist mir folgendes aufgefallen

    Example1:

    Spoiler anzeigen
    [autoit]

    Func Example1()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiCtrlSetOnEvent(-1,"msgFunc")

    [/autoit]

    Example2:

    Spoiler anzeigen
    [autoit]

    Func Example2()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    Local $Col = PixelGetColor(55,200)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiSetBkColor(0x000000)

    [/autoit]

    funktioniert bei mir zwar trotzdem nicht (graues Bild), aber vielleicht meint es die AutoIT-Fee ja diesmal gut mit dir,

    Edit: Ich habe hier in dein Example2 Teile von Progandy's Post eingesetzt. Obwohl ich ausser dem fehlenden Aufruf für msgFunc keinen Unterschied sehen (finden) kann, klappt es auch damit bei mir in beiden Examples:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <winapi.au3>

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

    Example1()
    Example2()

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

    Func Example1()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiCtrlSetOnEvent(-1,"msgFunc")
    GUISetBkColor(0x000000)
    GuiCtrlCreateLabel("Color defined!",40,40)
    GuiCtrlSetColor(-1,0xABCDEF)
    GuiCtrlCreateLabel("Ohne Rand",44,82)
    GuiCtrlSetColor(-1,0xABCDEF)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    Local $Col = 0xdb7093
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x01)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    $msg = GuiGetMsg()
    If $msg = $Ex_Button Then
    GuiDelete($MainGui)
    ExitLoop
    ElseIf $msg = $but Then
    msgFunc()
    EndIf
    sleep(10)
    WEnd
    EndFunc

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

    Func Example2()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP) ;<------------------------- von hier
    GUICtrlCreatePic(RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Examples\GUI\logo4.gif",0,0,147,123,0)
    GUISetBkColor(0x000000)
    $but=GUICtrlCreateButton("MsgBox",1,1) ;<-----Zusatz
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    GuiCtrlSetOnEvent(-1, "Terminate")
    Local $Col = 0xdb7093
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x01)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui) ;<--------------------------bis hier fast alles aus Progandy Post
    While 1 ;<--------------------------------- ab hier alles aus deinem Post
    $msg = GuiGetMsg()
    If $msg = $Ex_Button Then
    GuiDelete($MainGui)
    ExitLoop
    ElseIf $msg = $but Then
    msgFunc()
    EndIf
    sleep(10)
    WEnd
    EndFunc

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func msgFunc()
    MsgBox(0,"","")
    EndFunc

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]

    Wird wohl Zeit, dass ich wieder eimal den Augebarzt aufsuche (oder besser: vernünftigen Monitor kaufe)

    mfg (Auto)Bert

    2 Mal editiert, zuletzt von AutoBert (12. Mai 2009 um 01:46)

    • Offizieller Beitrag

    Also dein 1. Beispiel funktioniert bei mir einwandfrei, das 2. Überhaupt nicht . Sollte die Hintergrundfarbe der Gui nicht der Transparenzfarbe bei _WinAPI_SetLayeredWindowAttributes entsprechen ?

    So funzt bei mir auch dein 2. Beispiel, obwohl ich noch immer nicht weiß, für was du PixelGetColor brauchst .

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <winapi.au3>

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

    Example1()
    Example2()

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

    Func Example1()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiCtrlSetOnEvent(-1,"msgFunc")
    GUISetBkColor(0x000000)
    GuiCtrlCreateLabel("Color defined!",40,40)
    GuiCtrlSetColor(-1,0xABCDEF)
    GuiCtrlCreateLabel("Ohne Rand",44,82)
    GuiCtrlSetColor(-1,0xABCDEF)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    Local $Col = 0xdb7093
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255,0x01)

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

    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    $msg = GuiGetMsg()
    If $msg = $Ex_Button Then
    GuiDelete($MainGui)
    ExitLoop
    ElseIf $msg = $but Then
    msgFunc()
    EndIf
    sleep(10)
    WEnd
    EndFunc

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

    Func Example2()
    $MainGui= GUICreate("Macromat", 147, 123,-1,-1, $WS_POPUP)
    Local $Col = PixelGetColor(55,200)
    $but=GUICtrlCreateButton("MsgBox",1,1)
    GuiSetBkColor(0x000000)
    GuiCtrlCreateLabel("PixelGetColor!",40,40)
    GuiCtrlSetColor(-1,0xABCDEF)
    GuiCtrlCreateLabel("Mit Rand",48,82)
    GuiCtrlSetColor(-1,0xABCDEF)
    $BodyGui= GUICreate("BodyGui", 147, 123,-3, -3, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_MDICHILD,$WS_EX_LAYERED), $MainGui)
    $Ex_Button = GUICtrlCreateButton("Exit", 22, 55, 100, 25)
    GUISetBkColor($Col)
    _WinAPI_SetLayeredWindowAttributes($BodyGui,$Col,255)
    GUISetState(@SW_SHOW, $MainGui)
    GUISetState(@SW_SHOW, $BodyGui)

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

    While 1
    $msg = GuiGetMsg()
    If $msg = $Ex_Button Then
    GuiDelete($MainGui)
    ExitLoop
    ElseIf $msg = $but Then
    msgFunc()
    EndIf
    sleep(10)
    WEnd
    EndFunc

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func msgFunc()
    MsgBox(0,"","")
    EndFunc

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]
  • Hmm eure Beispiele gingen leider nicht bei mir...
    Aber ich hab einfach mal versucht 0x00000 transparent zu setzen und voilla es ging! Im Prinzip ist es alles andere als logisch, aber bei mir klappts immer wenn ich die Farbe, die ich bei der Main-Gui verwende, bei der Child-Gui transparent setze.. und solange es klappt bin ich glücklich =]

    Wenn jemand anders noch ne Lösung statt eines Workaround findet: Immer her damit! :D
    Ansonsten wäre das Thema für mich jetzt so halbwegs gelöst!