Transparente Buttons

    • Offizieller Beitrag

    Meinst du so etwas:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $GUImain = GUICreate('Main', 255, 40, -1, -1, Default, $GUI_WS_EX_PARENTDRAG)
    GUICtrlCreatePic(@Systemdir & "\oobe\images\mslogo.jpg", 0, 0, 255, 40)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    $GUIBtn = GUICreate("", 80, 20, 155, 10, $WS_POPUP, $WS_EX_MDICHILD, $GUImain)
    WinSetTrans($GUIBtn, "", 150)
    $Btn = GUICtrlCreateButton('Button', 0, 0, 80, 20)

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

    GUISetState(@SW_SHOW, $GUIBtn)
    GUISetState(@SW_SHOW, $GUImain)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit]
  • also ich möchte eine professionelle
    Oberfläche für meine Gui:

    Wenn ich eine Hintergrundgrafik verwende (Beispielgrafik)
    stellt sich die Frage wie man Buttons der Grafik mit Autoit ansprechen kann.

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    ...die Grafik vergrößert sich dynamisch
    Kann man irgendwie Hotspots auf die Elemente setzen
    die dann bei Klick Code ausführen?
    (auch wenn das Fenster vergrößert wird?)


    Beispiel-Code

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ###
    $Form1_1 = GUICreate("Form1", 627, 448, 400, 156, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS))

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

    $Pic2 = GUICtrlCreatePic("C:\ButtonBlue.gif", 8, 16, 81, 33, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic1 = GUICtrlCreatePic("C:\Backbild2.jpg", -24, -16, 644, 436, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO+$GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKVCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Damit es toll aussieht müssten Hover-Effekte
    für jeden Button gemacht werden.
    Also, alles ziemlich aufwendig oder?

    Zitat

    Deßhalb mal eine andere Frage:

    Ist es möglich eine Oberfläche in Html/css...
    mit Grafiken, Buttons... einzubetten. Ich meine eine html-Datei (local)
    die meine Gif Buttons und Hintergrunddesigns bereits enthält?

    Wenn ich dann z.B. auf einen Button der Html-Datei klicke,
    daß dann der Autoit Code ausgeführt wird.

    • Man hätte eine professionelle Oberfläche
    • Man wäre was die Gestaltung angeht wesentlich flexibler. (css)


    Oder wie machen das die Profis hier?


    Viele Grüße
    Ilse ;)

  • Hallo Bugfix,

    ich konnte mich leider erst heute wieder bei dir melden.

    Ich habe mal mit deinem ersten Code experimentiert.
    Eine Frage noch:
    Wenn ich das Script starte, dann wird zuerst der Button kurz mit 100% gezeigt
    und dann wird er erst transparent.
    Kann man das ändern? Ich meine daß der transparente Button nicht zu sehen ist?


    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $GUImain = GUICreate('Main', 255, 40, -1, -1, Default, $GUI_WS_EX_PARENTDRAG)
    GUICtrlCreatePic(@Systemdir & "\oobe\images\mslogo.jpg", 0, 0, 255, 40)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    $GUIBtn = GUICreate("", 80, 20, 155, 10, $WS_POPUP, $WS_EX_MDICHILD, $GUImain)
    WinSetTrans($GUIBtn, "", 5) ; erscheint kurz mit 100%
    $Btn = GUICtrlCreateButton('Button', 0, 0, 80, 20)

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

    GUISetState(@SW_SHOW, $GUIBtn)
    GUISetState(@SW_SHOW, $GUImain)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Btn
    MsgBox(4,"test","Test")

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

    EndSwitch
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Wenn ich das Script starte, dann wird zuerst der Button kurz mit 100% gezeigt
    und dann wird er erst transparent.


    Passiert bei mir nicht. Vielleicht vom Windows-Style abhängig (habe Classic).
    Kannst ja auch mal testen erst GUISetState für Main und dann für Child auszuführen.

    Bei Trans 5 ist von dem Button ja gar nix mehr zu sehen. Ist das Absicht? Falls ja, brauchst du also nur einen "Klickbereich" der als Button verwertet wird. Das geht aber dann einfacher. (Koordinatenbereich definieren und in Schleife Mausklick auswerten - wenn im Koordinatenbereich dann...)

  • Hallo BugFix,

    Zitat

    Falls ja, brauchst du also nur einen "Klickbereich" der als Button verwertet wird. Das geht aber dann einfacher. (Koordinatenbereich definieren und in Schleife Mausklick auswerten - wenn im Koordinatenbereich dann...)


    Genau so etwas brauche ich!
    Im Prinzip verschiendene Klickbereiche (Hotspots), die sich auch mit Resize mit anpassen.
    Wird das Fenster vergrößert, dann müsste auch der Klickbereich die Koordinaten verändern.
    Beispiel:
    Hintergrundgrafik mit Button
    Wird die Grafik mit Resize aufgezogen, dann ist der Button der Grafik evtl. Größer und weiter rechts...
    D.h. auch der klickbereich müsste sich ja verändern.
    Mit $GUI_DOCKAUTO bin ich schon etliche Zeit am probieren.

    Aber ich denke das wäre die Lösung.
    Das mit dem Koordinatenbereich definieren die sich auch mit Resize anpassen, das wärs, aber das schaff ich nicht!

    Würde mich freuen, wenn du mir dabei helfen könntest.

    Huh...
    Liebe Grüße
    Ilse ;)

  • @ Bugfix
    Ich habe mal eine Beispiel-Gui gemacht.
    Diese Gui enthält einen Button der sich der Hintergrundgrafik anpasst. (Also im Prinzip einen Klickbereich)
    Dieser Klickbereich darf natürlich nicht sichbar sein. (Mein Problem)
    Wenn ich auf diesen "unsichbaren Bereich" klicke, sollte was passieren.

    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ###
    $Form1_1 = GUICreate("Form1", 738, 557, 253, 155, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_TABSTOP))

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

    $Button1 = GUICtrlCreateButton("Button1", 608, 136, 35, 25, $BS_NOTIFY)
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    $Pic1 = GUICtrlCreatePic("C:\Backbild2.jpg", -24, -16, 750, 550, BitOR($GUI_SS_DEFAULT_PIC,$WS_CLIPSIBLINGS))
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(4,"Klicktest","Bereich wurde angeklickt!")
    EndSwitch
    WEnd

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

    ...mit einem Button geht das, nur ich bekomm das nicht unsichtbar hin!
    @Raplt,

    Zitat

    ... ob die Maus in einem bestimmten Bereich ist nicht einfach variabel und berechnest sie bei jedem Resize einfach neu

    Kannst du mir vielleicht ein Beispiel machen?
    Ich versteh im Moment irgendwie nur Bahnhof...!

    • Offizieller Beitrag

    OK, hier mal ein kpl. Bsp.:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

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

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

    Local $dll, $ret, $TitleHeight
    $dll = DllOpen("user32.dll")
    $ret = DllCall($dll, "long", "GetSystemMetrics", "long", 4)
    $TitleHeight = $ret[0]
    $ret = DllCall($dll, "long", "GetSystemMetrics", "long", 6)
    $TitleHeight += 2*$ret[0]
    DllClose($dll)

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

    Global $GUI, $aGUI, $aClick[2][6] = [ _
    [0,0 +$TitleHeight,50,20], _ ; Klickbereich1 [x,y,w,h,FaktorX,FaktorY] Index: 0
    [0,100 +$TitleHeight,50,20]] ; Klickbereich2 Index: 1
    ; Die Klickbereiche sind deine "Pseudo-Button"

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

    $GUI = GUICreate('Main', 255, 150, -1, -1, $WS_SIZEBOX)
    $aGUI = WinGetPos($GUI) ; Größendaten GUI zum Vergleich speichern

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

    ; die Label nur damit man nicht allzu blind klicken muß
    GUICtrlCreateLabel('|', 0, 0) ; Abgrenzung Label beim Start
    GUICtrlCreateLabel('|', 51, 0) ; Abgrenzung Label beim Start
    GUICtrlCreateLabel('|', 0, 100)
    GUICtrlCreateLabel('|', 51, 100)

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

    ; === Größenverhältnis Klickbereich W u. H / GUI W u. H abspeichern
    For $i = 0 To 1
    $aClick[$i][4] = $aClick[$i][2]/$aGUI[2] ; Verhältnis W
    $aClick[$i][5] = $aClick[$i][3]/$aGUI[3] ; Verhältnis H
    ConsoleWrite($i & ': ' & $aClick[$i][4] & '/ ' & $aClick[$i][5] & @CRLF)
    Next

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

    GUISetState(@SW_SHOW, $GUI)

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

    GUIRegisterMsg($WM_SIZE, '_mySize')

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    Switch _GetClickedIndex($aClick)
    Case 0
    ConsoleWrite('Klickbereich 1: ' & $aClick[0][0] & ', ' & $aClick[0][1] -$TitleHeight & ', ' & _
    $aClick[0][2] & ', ' & $aClick[0][3] & @CRLF)
    Case 1
    ConsoleWrite('Klickbereich 2: ' & $aClick[1][0] & ', ' & $aClick[1][1] -$TitleHeight & ', ' & _
    $aClick[1][2] & ', ' & $aClick[1][3] & @CRLF)
    Case Else
    ConsoleWrite('Klick außerhalb' & @CRLF)
    EndSwitch
    EndSwitch
    WEnd

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

    Func _GetClickedIndex(ByRef $aClick)
    $old = Opt('MouseCoordMode', 0)
    Local $aM = MouseGetPos()
    Opt('MouseCoordMode', $old)
    For $i = 0 To UBound($aClick) -1
    If ( $aM[0] >= $aClick[$i][0] ) And ( $aM[0] <= $aClick[$i][0] +$aClick[$i][2] ) And _
    ( $aM[1] >= $aClick[$i][1] ) And ( $aM[1] <= $aClick[$i][1] +$aClick[$i][3] ) Then Return $i
    Next
    Return -1
    EndFunc

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

    Func _mySize($hWnd)
    If $hWnd <> $GUI Then Return 0
    Local $aSize = WinGetPos($GUI)
    For $i = 0 To UBound($aClick) -1
    ;~ ConsoleWrite('W/H vorher: ' & $aClick[$i][2] & ' / ' & $aClick[$i][3] & @CRLF)
    $aClick[$i][2] = Int($aSize[2] * $aClick[$i][4])
    $aClick[$i][3] = Int($aSize[3] * $aClick[$i][5])
    ;~ ConsoleWrite('W/H nachher: ' & $aClick[$i][2] & ' / ' & $aClick[$i][3] & @CRLF)
    Next
    $aGUI = $aSize
    Return 0
    EndFunc

    [/autoit]
  • Hallo Bugfix,

    erstmal danke für deine Mühe.
    Ich werde da wohl noch etwas brauchen um das nachzuvollziehen.

    Wirklich schade, warum das nicht so einfach geht wie ich gedacht habe.
    Transparentes gif auf die Gui, onClick... Code fertig.

    In Koda (..ich weiß...vergiß Koda)
    da gibt es ein Graphic Tool (Kreis zeichnen) und damit kann man das auch nicht irgendwie erledigen?
    Ich meine transparenten Kreis auf die Gui legen (als unsichbarer Button) und mit Code versehen....?

    Es würde wirklich die grafische Arbeit um vieles angenehmer machen.
    Ilse :(

    • Offizieller Beitrag

    Wirklich schade, warum das nicht so einfach geht wie ich gedacht habe.
    Transparentes gif auf die Gui, onClick... Code fertig.


    Im Prinzip ist doch das genau der Fall, nur dass halt gar kein gif da ist. ;)
    Auch bei einem gif müsstest du, wenn du die GUI resizeable gestaltest, ein Sizemanagement gestalten. Und das ist es, was das Skript jetzt so gewaltig aussehen läßt. Bei einer GUI fixer Größe ist das wesentlich unkomplizierter. Ich gestatte es dem User niemals, die Größe zu verändern. :D

  • Hallo Ilse,

    wenn Du nur transparente "Klickflächen" auf ein Hintergrundbild legen willst, ist das nicht wirklich kompliziert:

    Spoiler anzeigen
    [autoit]

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

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

    If Not IsDeclared("SS_REALSIZECONTROL") Then
    Global Const $SS_REALSIZECONTROL = 0x40
    EndIf

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

    Opt("GUIOnEventMode", 1)
    $GUI = GUICreate("GUI", 800, 600, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "GUI_Close")
    $BG = GUICtrlCreatePic(@ProgramFilesDir & "\AutoIt3\Examples\GUI\msoobe.jpg", 0, 0, 800, 600, $SS_REALSIZECONTROL)
    GUICtrlSetState(-1, $GUI_DISABLE) ; <-- Das Bild selbst darf nicht auf Mausklicks reagieren
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    $Btn1 = GUICtrlCreateLabel("", 20, 20, 50, 50, $WS_BORDER) ; <-- WS_BORDER ist nur dafür da, dass Du es sehen kannst
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetOnEvent(-1, "Btn1_Clicked")
    $Btn2 = GUICtrlCreateLabel("", 730, 20, 50, 50, $WS_BORDER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetOnEvent(-1, "Btn2_Clicked")
    $Btn3 = GUICtrlCreateLabel("", 20, 530, 50, 50, $WS_BORDER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetOnEvent(-1, "Btn3_Clicked")
    $Btn4 = GUICtrlCreateLabel("", 730, 530, 50, 50,$WS_BORDER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetOnEvent(-1, "Btn4_Clicked")
    $Btn5 = GUICtrlCreateLabel("", 360, 260, 80, 80, $WS_BORDER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetOnEvent(-1, "Btn5_Clicked")
    GUISetState()

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

    While True
    Sleep(100)
    WEnd

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

    Func Btn1_Clicked()
    MsgBox(0, "Btn1", "Klick!", 1, $GUI)
    EndFunc

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

    Func Btn2_Clicked()
    MsgBox(0, "Btn2", "Klick!", 1, $GUI)
    EndFunc

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

    Func Btn3_Clicked()
    MsgBox(0, "Btn3", "Klick!", 1, $GUI)
    EndFunc

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

    Func Btn4_Clicked()
    MsgBox(0, "Btn4", "Klick!", 1, $GUI)
    EndFunc

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

    Func Btn5_Clicked()
    MsgBox(0, "Btn5", "Klick!", 1, $GUI)
    EndFunc

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

    Func GUI_Close()
    Exit
    EndFunc

    [/autoit]
  • BugFix
    sorry, mußte arbeiten konnte mich erst heute wieder melden.

    Möchte mich nochmals ganz ganz herzlich für deine Hilfe bedanken.

    @ Großvater
    super Beispiel.

    Zitat

    wenn Du nur transparente "Klickflächen" auf ein Hintergrundbild legen willst, ist das nicht wirklich kompliziert:


    Genau so hatte ich es gedacht.

    Mal wieder ein DICKES LOB an alle :thumbup:

    Liebe Grüße
    Ilse ;)