Wie eine Transparente GUI erstellen?

  • Hallo Leute,
    ich hätte mal eine Frage, und zwar ob es eine Möglichkeit gibt eine GUI zu erstellen die komplett transparent ist? Also so das man durch sie hindurch sehen kann aber man die Labels (wenn möglich mit transparenten Hintergrund) noch sieht?

    Und wenn ja, wie geht das?
    Am besten anhand eines Beispielscriptes erklären ;)

    mfg
    Icynator


    okay hat sich erledigt...
    ich habs jetzt so gemacht:

    [autoit]

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

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

    $PlayerBase = 0xA0465C

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

    $pid = WinGetProcess("SRO_Client")
    If $pid = -1 Then
    MsgBox(16, "SRO-Information", "Silkroad is not running!")
    exit
    EndIf
    $info = _MemoryOpen($pid)

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

    $PlayerBase = _MemoryRead($PlayerBase, $info)

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

    ; INI-Datei definieren Priorität: Userprofile vor lokaler Datei
    If FileExists(@userprofiledir & "\Killcounter.ini") then
    $inifile = @userprofiledir & "\Killcounter.ini"
    Else
    If FileExists(@scriptdir & "\Killcounter.ini") then
    $inifile = @scriptdir & "\Killcounter.ini"
    Else
    $inifile = ""
    EndIf
    EndIf
    FileInstall("Killcounter.gif",@tempdir & "\Killcounter.gif",1)

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

    ; GUI erzeugen mit Contextmenue "Beenden"
    Opt("GUIOnEventMode", 1)
    $gui = GUICreate("Killcounter",200,200, 318, 213,$WS_POPUP,BitOr($WS_EX_LAYERED,$WS_EX_TOOLWINDOW))
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_PrimeDown")
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Ende")
    $bild_id = GUICtrlCreatePic(@tempdir & "\Killcounter.gif", 0, 0, 200,200)
    $suchtext_id = GUICtrlCreateLabel("Test",50,50,50,50)
    GUICtrlSetColor(-1,0xFFFFFF)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    $label = GUICtrlCreateLabel("KA",100,100,50,50)
    GUICtrlSetColor(-1,0xFFFFFF)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    $CMenue = GUICtrlCreateContextMenu ($bild_id)
    $CMenueEnde = GUICtrlCreateMenuitem ("Beenden",$CMenue,0)
    GUICtrlSetOnEvent ($CMenueEnde, "_Ende")
    GUISetState(@SW_SHOW)
    WinSetOnTop("Killcounter", "", 1)

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

    ; alte Fensterposition laden und GUI verschieben
    if $inifile <> "" then
    $WinXPos = IniRead($inifile,"Startwerte","WinXPos","")
    $WinYPos = IniRead($inifile,"Startwerte","WinYPos","")
    If $WinXPos <> "" And $WinYPos <> "" then WinMove("Killcounter","",$WinXPos,$WinYPos)
    endif

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

    ; warten....
    While 1
    $PlayerCurHP = 0x350
    $SpielerHP = _MemoryRead($PlayerBase + $PlayerCurHP, $info)
    GUICtrlSetData($label, $SpielerHP,"")
    Sleep(500)
    WEnd

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

    ; Danke für diese Funktion um das rahmenlose Fenster zu verschieben
    Func _PrimeDown()
    Local $DifX, $DifY, $MouseData = GUIGetCursorInfo(@GUI_WinHandle)
    Local $WinPos = WinGetPos(@GUI_WinHandle)
    Local $MPos = MouseGetPos()
    $DifX = $MPos[0] - $WinPos[0]
    $DifY = $MPos[1] - $WinPos[1]
    Do
    Sleep(15)
    $MPos = MouseGetPos()
    $MouseData = GUIGetCursorInfo(@GUI_WinHandle)
    Until ($WinPos[0] <> ($MPos[0] - $DifX)) Or ($WinPos[1] <> ($MPos[1] - $DifY)) Or (Not $MouseData[2])
    GUICtrlSetCursor($bild_id,9)
    While $MouseData[2]
    $MPos = MouseGetPos()
    $WinPos = WinGetPos(@GUI_WinHandle)
    If ($WinPos[0] <> ($MPos[0] - $DifX)) Or ($WinPos[1] <> ($MPos[1] - $DifY)) Then
    WinMove(@GUI_WinHandle, '', $MPos[0] - $DifX, $MPos[1] - $DifY)
    EndIf
    Sleep(15)
    $MouseData = GUIGetCursorInfo(@GUI_WinHandle)
    WEnd
    GUICtrlSetCursor($bild_id,2)
    GUICtrlSetState($suchtext_id,$GUI_FOCUS)
    GUICtrlSetState($label,$GUI_FOCUS)
    EndFunc

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

    ; Fensterposition merken und Programm beenden
    Func _Ende()
    $iniid=fileopen($inifile,1)
    if $iniid = -1 then $inifile = @userprofiledir & "\Killcounter.ini"
    fileclose($iniid)
    IniDelete($inifile,"Startwerte")
    $WinPos = WinGetPos("Killcounter")
    IniWrite($inifile,"Startwerte","WinXPos",$WinPos[0])
    IniWrite($inifile,"Startwerte","WinYPos",$WinPos[1])
    if FileExists(@Tempdir & "\Killcounter.gif") then FileDelete(@Tempdir & "\Killcounter.gif")
    Exit
    EndFunc

    [/autoit]


    ich hoffe mal Micha_he is mir nich böse das ich einiges von seinem script geklaut hab... wenn doch sag bitte bescheid dann such ich ne andere möglichkeit....

    Einmal editiert, zuletzt von Icynator (23. Februar 2009 um 16:12)

  • bei guicreate unter style entweder $WS_EX_TRANSPARENT oder 0x00000020 (wenn das andere nicht geht wie bei mir) hinschreiben dann sollte es gehen

    Computers are like Airconditioning. They don´t work with open Windows.

  • Schau Dir mal diesen Thread an: [ gelöst ] Hab da mal eine Frage zur GUI.

    okay,ich habs mir mal angeschaut....
    allerdings hab ich jetzt ein weiteres problem...
    wenn ich jetzt ein label machen will kann ich den hintergrund davon nicht transparent machen..

    code würde bei mir so aussehen:

    [autoit]

    GUICtrlCreateLabel("test",10,10,50,50)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)

    [/autoit]
  • Hä, dann fürde ich die farbe mal ändern, wenn du nicht mehr willst das dass laber tnrasparent ist!

    [autoit]

    GUICtrlCreateLabel("test",10,10,50,50)
    GUICtrlSetBkColor(-1,0xFFFFFF)

    [/autoit]

    mfg. Jam00

  • Hä, dann fürde ich die farbe mal ändern, wenn du nicht mehr willst das dass laber tnrasparent ist!

    [autoit]

    GUICtrlCreateLabel("test",10,10,50,50)
    GUICtrlSetBkColor(-1,0xFFFFFF)

    [/autoit]

    ich will ja eben das das label transparent is...
    was aber nicht funzt...
    aber habs ja jetzt ;)

  • Sowas?

    Wenn du $WS_POPUP verwendest, ist nur mehr der Test da...

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>

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

    $hGui = GUICreate("", 300, 100, -1, -1, -1, $WS_EX_LAYERED)
    GUISetBkColor(0xABCDEF)
    $hLabel = GUICtrlCreateLabel("Test", 5, 5, 290, 90, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont($hLabel, 60)
    GUICtrlSetColor($hLabel, 0x00FF00)
    GUICtrlSetBkColor($hLabel, 0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($hGui, 0xABCDEF, 255)
    GUISetState()

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

    While GUIGetMsg() <> -3
    Sleep(5)
    WEnd

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    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]

    lgE

  • dein script is nich schlecht...
    aber wenn ich jetzt bei

    [autoit]

    $hGui = GUICreate("", 300, 100, -1, -1, -1, $WS_EX_LAYERED)

    [/autoit]

    des $WS_EX_LAYERED durch $WS_POPUP ersetz zeigts bei mir gar nix mehr an... also auch keine label...
    und wenn ich unten im tray des script beenden will flackern meine ganzen fenster und es dauert ewig bis der taskmgr offen is um des script zu beenden....