Problem mit CHILD-Fenster

  • Hi Leute, da binn ich mal wieder^^

    Ich habe folgendes Problem:
    Ich habe ein Schript geschreiben, in dem ich versuchen wollte einen Transparenten Ramen zu machen, und hab es mit CHILD-Fentser gemacht!
    Allerdings wir das Fenster nicht aktualisiert :( Ich muss erst ein Fenster drüberzeihen oder es Minimieren und wieder maximieren.
    Ist das bei euch uach so?
    Ich verstehe nucht warum das so ist! Ich habe das bei den Runde Buttons doch genaueso gemacht, und es geht!

    Mein versuch
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Ramen = GUICreate ("Transparenter Ramen",400,400,400,400,$WS_POPUP)
    GUISetBkColor (0x0077FF,$Ramen)
    GUICtrlCreateLabel ("",0,0,400,400,$WS_EX_TRANSPARENT,$GUI_WS_EX_PARENTDRAG)
    $Pos = WinGetPos ($Ramen)
    $Innen = GUICreate("", $Pos[2] -15, $Pos[3] -35, 5,25,$WS_POPUP,$WS_EX_MDICHILD, $Ramen);
    GUISetBkColor (0x00FF00,$Innen)
    GUISetState (@SW_SHOW,$Ramen)
    GUISetState (@SW_SHOW,$Innen)
    WinSetTrans ($Ramen,"",200)
    While 1
    Sleep (100)
    WEnd

    [/autoit]
    Hier mal das mit den Buttons
    [autoit]

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

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

    Dim $Button[2],$Icon[2]
    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\Übungen\XSkin\Oberfläche\XSkin.kxf
    $Titel = "INC"
    $Form2 = GUICreate($Titel, 555, 532, 303, 219,$WS_POPUP)
    GUISetBkColor (0x00FF00)
    $Pic1 = GUICtrlCreatePic(@ScriptDir & "\Data\1.bmp", 0, 0, 555, 532, $WS_CLIPSIBLINGS)
    $Label1 = GUICtrlCreateLabel(" "& $Titel, 0, 0, 555, 32,$WS_EX_TRANSPARENT, $GUI_WS_EX_PARENTDRAG)
    GUICtrlSetBkColor (-1,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetColor (-1,0xFF0A000)
    GUICtrlSetFont (-1,12,550,0,"Arial")
    $Button[0] = GUICreate("", 16, 16, 525, 3, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $Form2);
    $Icon[0] = GUICtrlCreatePic(@ScriptDir & "\Data\X.gif",0, 0, 16, 16, BitOR($SS_NOTIFY,$WS_GROUP))
    $Button[1] = GUICreate("", 16, 16, 500, 3, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $Form2);
    $Icon[1] = GUICtrlCreatePic(@ScriptDir & "\Data\_.gif",0, 0, 16, 16, BitOR($SS_NOTIFY,$WS_GROUP))
    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Form2, "int", 400, "long", 0x00040010);Slide von unten ein
    GUISetState(@SW_SHOW,$Button[0])
    GUISetState(@SW_SHOW,$Button[1])
    GUISetState(@SW_SHOW,$Form2)
    #EndRegion ### END Koda GUI section ###
    Dim $Pfad[2][2],$Status[2]
    $Pfad[0][0] = @ScriptDir & "\Data\X.gif"
    $Pfad[0][1] = @ScriptDir & "\Data\X1.gif"
    $Pfad[1][0] = @ScriptDir & "\Data\_.gif"
    $Pfad[1][1] = @ScriptDir & "\Data\_1.gif"
    $Status[0] = False
    $Status[1] = False
    _Ecken($Form2,0,0,10,10)
    While 1
    $iOldOpt = Opt("MouseCoordMode", 2)
    $aPos = MouseGetPos()
    $aPos3 = WinGetPos($Form2)
    For $A = 0 To 1
    $aPos2 = WinGetPos($Button[$A])
    If IsArray ($aPos2) Then
    $Point = _PointInEllipse($aPos[0], $aPos[1],$aPos2[0] - $aPos3[0] , $aPos2[1] - $aPos3[1], 16, 16)
    _Pic($Icon[$A],$A)
    EndIf
    Next
    Opt("MouseCoordMode", $iOldOpt)
    $MSG = GUIGetMsg (1)
    Switch $MSG[1]
    Case $Button[0]
    Switch $MSG[0]
    Case $Icon[0]
    GUIDelete ($Button[0])
    GUIDelete ($Button[1])
    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Form2, "int", 400, "long", 0x00050010);Slide nach unten aus
    Exit
    EndSwitch
    Case $Button[1]
    Switch $MSG[0]
    Case $Icon[1]
    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Form2, "int", 400, "long", 0x00050005);Slide nach unten aus
    GUISetState(@SW_MINIMIZE)
    EndSwitch
    EndSwitch
    WEnd
    Func _Ecken($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
    Local $XS_pos, $XS_ret, $XS_ret2
    $XS_pos = WinGetPos($h_win)
    $XS_ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $XS_pos[2], "long", $XS_pos[3], "long", $i_x3, "long", $i_y3)
    If $XS_ret[0] Then
    $XS_ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $XS_ret[0], "int", 1)
    EndIf
    EndFunc ;==>_GuiRoundCorners
    Func _PointInEllipse($xPt, $yPt, $xTL, $yTL, $w, $h)
    Local $bInside = False, $a = $w / 2, $b = $h / 2
    Local $c1X, $c2X, $dist, $xc = $xTL + $a, $yc = $yTL + $b
    $c1X = $xc - ($a ^ 2 - $b ^ 2) ^ (1 / 2); 1st focal point x position
    $c2X = $xc + ($a ^ 2 - $b ^ 2) ^ (1 / 2); 2nd focal point x position
    $dist = (($xPt - $c1X) ^ 2 + ($yPt - $yc) ^ 2) ^ 0.5 + (($xPt - $c2X) ^ 2 + ($yPt - $yc) ^ 2) ^ 0.5
    If $dist <= $w Then $bInside = Not $bInside
    Return $bInside
    EndFunc ;==>_PointInEllipse
    Func _Pic($hHandel,$Zahl)
    If $Status[$Zahl] <> $Point Then
    $Status[$Zahl] = $Point
    If $Status[$Zahl] = True Then
    GUICtrlSetImage ($hHandel,$Pfad[$Zahl][1])
    ElseIf $Status[$Zahl] = False Then
    GUICtrlSetImage ($hHandel,$Pfad[$Zahl][0])
    EndIf
    EndIf
    EndFunc

    [/autoit]

    mfg. Jam00

    • Offizieller Beitrag

    Schau dir mal das an :

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $hShadow = GUICreate('Shadow', 400,400,400,400, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT)) ; Schattenfenster erzeugen
    GUISetBkColor(0x0077FF,$hShadow) ; Farbe des Schattens setzen
    WinSetTrans($hShadow, '', 200) ; Transparenz des Schattens einstellen
    Global $Pos = WinGetPos ($hShadow)
    Global $Gui = GUICreate("", 400, 400, 400,400,$WS_POPUP)
    GUISetBkColor (0x00FF00,$Gui)
    GUICtrlCreateLabel ("",0,0,400,400,$WS_EX_TRANSPARENT,$GUI_WS_EX_PARENTDRAG)
    GUISetState(@SW_SHOW, $hShadow) ; Schatten anzeigen
    GUISetState(@SW_SHOW, $Gui) ; GUI anzeigen
    _ShadowSize() ; Position und Größe des Schatten-Fensters setzen
    WinSetOnTop($hShadow, '', 1) ; Schatten immer im Vordergrund
    WinSetOnTop($Gui, '', 1) ; GUI immer im Vordergrund

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

    GUIRegisterMsg($WM_MOVE, '_ShadowMove') ; Funktion zum "Schatten verschieben" registrieren
    GUIRegisterMsg($WM_SIZE, '_ShadowSize') ; Funktion zum "Schatten anpassen" registrieren

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

    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    Sleep (100)
    WEnd

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

    Func _ShadowSize()
    Local $pos1 = WinGetPos($Gui) ; Fensterposition der GUI holen
    WinMove($hShadow, '', $pos1[0]-10, $pos1[1]-25, $pos1[2]+20, $pos1[3]+35) ; das Schatten-Fenster entsprechend verschieben
    EndFunc
    Func _ShadowMove()
    Local $pos1 = WinGetPos($Gui) ; Fensterposition der GUI holen
    WinMove($hShadow, '', $pos1[0]-10, $pos1[1]-25, $pos1[2]+20, $pos1[3]+35) ; das Schatten-Fenster entsprechend verschieben
    EndFunc

    [/autoit]

    Den Code habe ich mir von Oscar entliehen.

    Edit:Sag mal bist du Farbenblind ? Von deiner Farbzusammenstellung bekommt man ja Augenkrebs. 8|

  • Okay, aber warum es bei mir nicht geht weißt du nicht? Das Problem ist ja nur das es nicht Aktualisiert wird! Warum geht es dann bei den Buttons?
    Und dann hab ich es mal so gemacht, das geht fast, aber eben nur fast^^

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Ramen = GUICreate ("Transparenter Ramen",400,400,400,400,$WS_POPUP)
    GUISetBkColor (0x0077FF,$Ramen)
    GUICtrlCreateLabel ("",0,0,400,400,$WS_EX_TRANSPARENT,$GUI_WS_EX_PARENTDRAG)
    $Pos = WinGetPos ($Ramen)
    $Innen = GUICreate("", $Pos[2] -15, $Pos[3] -35, 5,25,$WS_POPUP,$WS_EX_MDICHILD, $Ramen);
    GUISetBkColor (0x00FF00,$Innen)
    GUISetState (@SW_SHOW,$Ramen)
    GUISetState (@SW_SHOW,$Innen)
    WinSetTrans ($Ramen,"",200)
    While 1
    GUISetState (@SW_LOCk,$Innen)
    Sleep (100)
    GUISetState (@SW_UNLOCK,$Innen)
    WEnd

    [/autoit]

    mfg. Jam00

    • Offizieller Beitrag

    Das Problem ist , das du nur eine Pseudo Child-Gui verwendest . Diese wird nicht automatisch neu gezeichnet wenn sich die Position der Parent-Gui ändert . Wenn du einen richtige Child-Gui verwendest , hast du aber das Problem , das du diese nicht Transparent setzen kannst ohne die ParentGui auch transparent zusetzen . Oder umgekehrt .

    • Offizieller Beitrag

    Kontrolliert du auch mal was du postest ? Ist es so schwer nochmal zu lesen bevor du es abschickst ? Das ist das reinste Kauderwelsch . Aber schau mal unter den Styles in der Hilfe bei GuiCreate .

  • ähm
    Was aktualisiert sich genau nicht?
    bei mir ist die Gui immer durchsichtig?
    ich versteh dein problem nicht

    Padmak

    Ps: Hab vista, vllt liegts daran?

    • Offizieller Beitrag

    An Vista liegt es nicht. Er will eine normale Gui (undurchsichtig) vor einer durchsichtigen haben .

  • hab ich verstanden
    aber was hat er denn für ein Problem?
    bei mir funktionierts einwandfrei
    kannst du vielleicht mal Screenshots posten, so wies sein soll und wies ist?

    Padmak

    • Offizieller Beitrag

    Padmak die Gui soll ja gar nicht ganz durchsichtig sein, nur der Rand. Wie das aussehen soll kannst du dir bei meinem 1. Post anschauen . Ist nur anders gelöst als das von Jam00.Scheint ihm aber nicht zu gefallen weil es nicht sein Lösungsweg ist . ;(

  • Raupi
    Doch, das ist gut, nur verstehe ich nicht warum es bei meinem nicht geht, weil es bei den Buttons doch auch geht!Kannst du vieleicht mir mal erklären was ich ändern muss, nur um zu wissen wie es geht, ist dann nicht schlimm wenn das mit der Transparent nicht geht, nur kapier ich halbt nich was da anders ist ;(

    @Padmak 
    Ich mach mal 2 Bilder rein, damit du es kapierst!
    1. Bild
    So wie es aussehen soll!
    2. Bild
    Was pasiert wenn man es verschiebt!

    mfg. Jam00

  • Ich hab es jetzt so gemacht!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Ramen = GUICreate ("Transparenter Ramen",400,400,400,400,$WS_POPUP)
    GUISetBkColor (0x0077FF,$Ramen)
    ;~ GUICtrlCreatePic (@ScriptDir & "\Data\1.bmp",0,0,400,400,$WS_CLIPSIBLINGS)
    GUICtrlCreateLabel ("",0,0,400,400,$WS_EX_TRANSPARENT,$GUI_WS_EX_PARENTDRAG)
    GUICtrlSetBkColor (-1,$GUI_BKCOLOR_TRANSPARENT)
    $Pos = WinGetPos ($Ramen)
    $Innen = GUICreate("", $Pos[2] -15, $Pos[3] -35, 5,25,$WS_POPUP,$WS_EX_MDICHILD, $Ramen);
    GUISetBkColor (0x00FF00,$Innen)
    GUISetState (@SW_SHOW,$Ramen)
    GUISetState (@SW_SHOW,$Innen)
    WinSetTrans ($Ramen,"",150)
    _Ecken($Ramen,0,0,10,10)
    GUIRegisterMsg($WM_MOVE, "_Move")
    While 1
    Sleep (100)
    WEnd
    Func _Ecken($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
    Local $XS_pos, $XS_ret, $XS_ret2
    $XS_pos = WinGetPos($h_win)
    $XS_ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $XS_pos[2], "long", $XS_pos[3], "long", $i_x3, "long", $i_y3)
    If $XS_ret[0] Then
    $XS_ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $XS_ret[0], "int", 1)
    EndIf
    EndFunc ;==>_GuiRoundCorners
    Func _Move()
    GUISetState (@SW_LOCK)
    GUISetState (@SW_UNLOCK)
    EndFunc

    [/autoit]

    mfg. Jam00

    • Offizieller Beitrag

    Wird doch langsam. Der einzige Schönheitsfehler daran ist, das man nur das Fenster bei klicken auf den Rahmen bewegen kann .Im grünen Fenster funzt das nicht.