Frage zu einem Script

  • Hallo,
    ich habe da ein kleines Script geschrieben bei dem ich nicht weiß, ob man das so machen kann.

    Zuerst mal eine kleine Beschreibung, was ich will
    Ich will in einer GUI ein farbige Fläche erzeugen, in der sich ein andersfarbiger Button befindet.
    Es soll aber nur dann etwas geschehen, wenn ich den Button anklicke.

    Ich habe also zwei Controls übereinander erstellt, von dem ich aber nur das anklicken des Buttons auswerten will.

    Hier mein Script zum testen:


    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>#include <GUIConstantsEx.au3>#include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    Opt("MouseCoordMode", 2)
    ; Die GUI erstellen.
    $GUI = GUICreate("Form1", 600, 500, -1, -1)
    GUISetBkColor(0x6791C9)
    ; Ein Label in der GUI erstellen.
    $Label1 = GUICtrlCreateLabel("Nur ein Test", 64, 72, 468, 324, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
    GUICtrlSetBkColor($Label1, 0x00FF00)
    ; Einen Button in dem Label erstellen.
    $Button1 = GUICtrlCreateButton("Klick mich.", 176, 176, 209, 81)
    GUICtrlSetBkColor($Button1, 0xFF0000)
    ; Die Position und die Größe des Buttons ermitteln.
    $Test = ControlGetPos($GUI, "", $Button1)
    ; Die GUI anzeigen.
    GUISetState(@SW_SHOW, $GUI)
    While 1
    ; Die aktuelle Mausposition ermitteln.
    Local $Pos = MouseGetPos()
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Label1
    ; Die aktuelle Mauszeigerposition mit der Position und der Größe des Buttons vergleichen.
    If $Pos[0] > $Test[0] And $Pos[0] < ($Test[0] + $Test[2]) And $Pos[1] > $Test[1] And $Pos[1] < ($Test[1] + $Test[3]) Then
    MsgBox(0, "", "Treffer !", 1)
    Else
    MsgBox(0, "", "Daneben !", 1)
    EndIf
    EndSwitch
    WEnd
    GUIDelete($GUI)
    Exit

    [/autoit]

    Es funktioniert zwar, aber ich bin mir nicht sicher, ob das nicht nur Zufall o.ä. ist.

    Kann man das also wirklich so machen, oder gibt es da eventuell noch eine bessere Lösung ?


    MfG:
    BigRox

    Einmal editiert, zuletzt von BigRox (22. Mai 2015 um 13:02)

  • Hallo BugFix,
    wie erstelle ich anders einen Button mit einer farbigen Umrahmung in einer andersfarbigen GUI ?


    Hallo Kanashius,
    probiers mal mit:

    26 Case $Button1

    aus und du wirst sehen, warum ich die Position des Buttons testen muss.

    Ich kann nur ein klicken auf das Label erkennen und auch wenn ich auf den Button klicke, erkenne ich nur den Klick auf das Label.

    Ich bin mir nur nicht sicher, ob das wirklich so sicher funktionieren kann, oder, ob das mit den zwei Controls übereinander nur zufällig funktioniert.

    MfG:
    BigRox

    • Offizieller Beitrag

    aus und du wirst sehen, warum ich die Position des Buttons testen muss.

    ..weil du vergisst, das Label auf DISABLE zu setzen. ;)

  • Hallo Bugfix,
    jetzt sieht das ganze so aus:

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    Opt("MouseCoordMode", 2)

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

    ; Die GUI erstellen.
    $GUI = GUICreate("Form1", 600, 500, -1, -1)
    GUISetBkColor(0x6791C9)
    ; Ein Label in der GUI erstellen.
    $Label1 = GUICtrlCreateLabel("Nur ein Test", 64, 32, 468, 42, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
    GUICtrlSetFont($Label1, 18, 800, 0, "Times New Roman")
    GUICtrlSetBkColor($Label1, 0x00FF00)
    ; Ein Label in der GUI erstellen.
    $Label2 = GUICtrlCreateLabel("", 64, 72, 468, 324, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
    GUICtrlSetBkColor($Label2, 0x00FF00)
    ; >> LABEL muss inaktiv sein!!
    GUICtrlSetState($Label2, $GUI_DISABLE)
    ; Einen Button in dem Label erstellen.
    $Button1 = GUICtrlCreateButton("Klick mich.", 176, 176, 209, 81)
    GUICtrlSetBkColor($Button1, 0xFF0000)
    ; Die GUI anzeigen.
    GUISetState(@SW_SHOW, $GUI)

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

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Button1
    MsgBox(0, "", "Treffer !", 1)
    EndSwitch
    WEnd
    GUIDelete($GUI)
    Exit

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

    Ohne Text geht das gut, aber mit einem Text in Label zwei, wird auch der Text immer grau. Die Lösung währen zwei Labels (eins aktiv und das andere deaktiv)
    Das einzige, was mich jetzt noch etwas stört, ist der Rahmen zwischen den beiden Labels.
    Irgendwie währe es schöner, wenn es so aussehen würde, als wenn der Text (Nur ein Test), ohne Trennlinie in dem Label zwei stehen würde.
    Oder kann man auch irgendwie auswählen, welcher Rahmen dargestellt werden soll (Label eins ohne den unteren Rahmen und Label zwei ohne den oberen Rahmen und dann ganz aneinander schieben).


    MfG:
    BigRox

    • Offizieller Beitrag

    So:

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    Opt("MouseCoordMode", 2)

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

    ; Die GUI erstellen.
    $GUI = GUICreate("Form1", 600, 500, -1, -1)
    GUISetBkColor(0x6791C9)
    ; Ein Label in der GUI erstellen.
    $Label1 = GUICtrlCreateLabel("", 64, 32, 468, 364, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
    GUICtrlSetBkColor($Label1, 0x00FF00)
    ; Ein Label in der GUI erstellen.
    $Label2 = GUICtrlCreateLabel("Nur ein Test", 68, 42, 460, 42, $SS_CENTER)
    GUICtrlSetFont($Label2, 18, 800, 0, "Times New Roman")
    GUICtrlSetBkColor($Label2, $GUI_BKCOLOR_TRANSPARENT)
    ; Ein Label in der GUI erstellen.
    $Label3 = GUICtrlCreateLabel("Test Test Test Test Test", 68, 92, 460, 42, $SS_CENTER)
    GUICtrlSetFont($Label3, 10, 800, 0, "Times New Roman")
    GUICtrlSetColor($Label3, 0x0000FF)
    GUICtrlSetBkColor($Label3, $GUI_BKCOLOR_TRANSPARENT)
    ; Einen Button in dem Label erstellen.
    $Button1 = GUICtrlCreateButton("Klick mich.", 176, 176, 209, 81)
    GUICtrlSetBkColor($Button1, 0xFF0000)
    ; Die GUI anzeigen.
    GUISetState(@SW_SHOW, $GUI)

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

    GUICtrlSetState($Button1, $GUI_ONTOP) ; <- Wichtig! Diese Zeile muss NACH GuiSetState stehen!

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

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Button1
    MsgBox(0, "", "Treffer !", 1)
    EndSwitch
    WEnd
    GUIDelete($GUI)
    Exit

    [/autoit]
  • Hallo Oscar,

    DANKE für die Hilfe :thumbup: .

    Auf die Idee, es einmal mit einem transparenten Hintergrund zu versuchen, bin ich nicht gekommen.
    (bei den Verknüpfungspfeilen von Windows, wird es ja auch so gemacht).

    Manchmal braucht man eben einen kleinen "Schubs" um auf die Lösung zu kommen.


    MfG:
    BigRox