Mehrzeiliger Button mit anderer Farbe

  • Hallo,
    beim Erstellen eines Autoit Skripts bin ich auf folgendes Problem gestoßen, das ich auch nach längerem Suchen in der Hilfe und im Forum nicht lösen konnte:

    Ich benötige einen Button mit folgenden Eigenschaften:
    - mehrzeiliger Text
    - andere Hintergrundfarbe als das übliche Grau.

    Mein bisheriger Code lautet:


    Das Ergebnis ist ein farbiger Button, bei dem der Text ohne Zeilenumbruch am obereren Rand klebt.

    Wenn ich jetzt noch einmal hinter dem GUISetBkColor-Befehl den Zeilenumbruch mit

    Code
    GUICtrlSetStyle($Platz, 0x2000)


    erwzinge, dann erhalte ich einen grauen Button mit Zeilenumbruch.

    Unter KODA kann ich zwar den entsprechenden Button zeichnen - der generierte Code hat aber das gleiche Problem.

    Kennt jemand eine einfache Lösung, mit der ich einen mehrzeiligen, farbigen Button erzeugen kann?

    VIelen Dank im Voraus für Eure Hilfe,

    Rainer, Autoit-Anfänger

    Einmal editiert, zuletzt von hil (17. Juli 2012 um 20:04)

  • Versuche es einmal mit dieser Methode (@crlf)

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIListview.au3>
    #include <GUITab.au3>

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

    dim $platz,$fen_sp,$msg

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

    $fen_sp = GUICreate("Test", @DesktopWidth, @DesktopHeight, 1, 1)
    $Platz = GUICtrlCreateButton("Das ist ein" & @CRLF & "mehrzeiliger Text",10,10, 100,100, 0x2000) ;0x2000 = Multiline : Zeilenumbruch
    GUICtrlSetBkColor($Platz, 0xFFAAAA) ; Farbiger Hintergrund
    GUISetstate()
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    endselect
    wend

    [/autoit]

    mfg autoBert

  • Hallo autobert,

    vielen Dank für die schnelle Antwort - der erzwungene Zeilenumbruch funktioniert und damit ist mir schon einmal grundsätzlich geholfen.

    Mein Problem ist nur, dass sich die Beschriftung während des Programmablaufs ändert, d.h. ich müsste die @CRLF immer wieder in die Zeichenkette einfügen und löschen oder verschieben.

    Vielleicht gibt es noch eine andere Lösung?

    MfG Rainer

    • Offizieller Beitrag

    Das leidige Problem bei den Button ist, dass das Setzen von Farben (Text und/oder Hintergrund) alle anderen Styles zerstört.

    Eine Variante wäre z.B. ein semitransparentes, eingefärbtes Child-Window über den Button zu legen. Sieht aber nicht so toll aus:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #Include <ButtonConstants.au3>
    #Include <Constants.au3>
    #Include <WindowsConstants.au3>

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

    $fChg = False

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

    $hGui = GUICreate('Test', 300, 300)
    $cBtn = GUICtrlCreateButton('Eine Zeile', 20, 80, 80, 30, BitOR($BS_CENTER,$BS_VCENTER,$BS_NOTIFY,$BS_MULTILINE))
    $hWndOverBtn = GUICreate('', 80, 30, 20, 80, BitOR($WS_BORDER,$WS_POPUP), $WS_EX_MDICHILD, $hGui)
    GUISetBkColor(0xFF0000, $hWndOverBtn)
    GUISetState(@SW_SHOW, $hWndOverBtn)
    WinSetTrans($hWndOverBtn, '', 50)
    _WinAPI_SetWindowLong($hWndOverBtn, $GWL_EXSTYLE, BitOR(_WinAPI_GetWindowLong($hWndOverBtn,$GWL_EXSTYLE), $WS_EX_TRANSPARENT)) ; == erlaubt das "Durchklicken" s. progandys Funktion

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

    GUISetState(@SW_SHOW, $hGui)

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $cBtn
    $fChg = Not $fChg
    If $fChg Then
    GUICtrlSetData($cBtn, 'Das sind zwei Zeilen Text')
    Else
    GUICtrlSetData($cBtn, 'Eine Zeile')
    EndIf
    EndSwitch
    WEnd

    [/autoit]


    Bau lieber aus einem Label deinen eigenen Button. Schönen Rahmen per Style drumherum ($SS_ETCHEDFRAME oder $SS_GRAYFRAME oder $SS_BLACKFRAME, was dir gefällt) und per BitOR noch $SS_CENTER dazu (sorgt für AutoWrap und Zentrierung).
    Den Klickeffekt kannst du simulieren:
    - GUI_EVENT_PRIMARYDOWN ==> Ctrl verschieben x+1, y+1
    - GUI_EVENT_PRIMARYUP ==> Ctrl zurück verschieben
    Und Einfärben ist beim Label kein Problem.

  • Hallo, hier mal eine andere Lösung.

    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

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

    ;~ $BS_MULTILINE —> ButtonConstants.au3
    ;~ $GUI_EVENT_CLOSE —> GUIConstantsEx.au3
    $sMsg = '\nDas ist ein\nmehrzeiliger Text\nin einem\nfarbigen Button'

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

    GUICreate('Colored_Button-Tut', 400, 400)
    $platz = GUICtrlCreateButton(StringFormat($sMsg), 10, 10, 100, 100, $BS_MULTILINE) ;i Zeilenumbruch
    GUICtrlSetBkColor($platz, 0xFFAAAA) ;i Farbiger Hintergrund
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    MsgBox(64, 'tata ...', StringFormat('Viel Spaß wünscht\nRitzelrocker04 !'), 3)
    ExitLoop
    Case $platz
    MsgBox(64, 'tata ...', StringFormat('Viel Spaß wünscht\nRitzelrocker04 !'), 3)
    ExitLoop
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
  • Danke für die weiteren Lösungsvorschläge.

    Zum Vorschlag von Bugfix hätte ich noch zwei Fragen:

    1. Kann ich die Abfrage der Mausklicks (GUISetOnEvent...) mit einer Abfrage GUIGetMsg() kombinieren. Konkret habe ich auf dem GUI noch mehrere Inputboxen, deren Änderungen ich mit GUIGetMsg abfrage.
    2. Kann ich bei der Abfrage unterscheiden, auf welchem Tab der Mausklick erfolgt. Die Schaltfläche sind auf dem vorderen Tab ($fsp_tab), auf einem zweiten Tab sind die oben beschriebenen Inputboxen ($fn_tab).

    Danke im Voraus

    Rainer

    • Offizieller Beitrag

    zu 1. Du kannst nur OnEvent ODER GuiGetMsg verwenden. Gemeinsam geht nicht (Ist ja auch nicht notwendig. Man kann beide Modi, bis auf wenige Ausnahmen, identisch nutzen).

    zu 2. Bei einem Tab hängst du die Variable des Tab-Ctrl in die GuiGetMsg-Schleife (Case $TabCtrl) und liest dann im Case mit GuiCtrlRead($TabCtrl) den Index des aktuellen TabItem aus. Noch differenzierter geht es mit Verwendung der GuiTab.au3. Schau dir in der Hilfe mal die Befehle dieser UDF an.

  • Hallo Bugfix,

    dann werde ich mich mal daran machen, meine Abfrage mit OnEvent neu zu schreiben...

    Vielen Dank für Deine schnellen und hilfreichen Antworten.

    MfG Rainer

  • Hi, auch im OnEventMode muss das Ganze nicht umfangreicher sein. 8)

    [autoit]


    #include <ButtonConstants.au3>
    Opt("GUIOnEventMode", 1)

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

    $sMsg = '\nDas ist ein\nmehrzeiliger Text\nin einem\nfarbigen Button'
    #region ### START Koda GUI section ###
    GUICreate('Colored_Button-Tut', 300, 200)
    GUISetOnEvent(-3, "_SpecialEvents")
    $Button = GUICtrlCreateButton(StringFormat($sMsg), 10, 10, 100, 100, $BS_MULTILINE)
    GUICtrlSetBkColor(-1, 0xFFAAAA) ;i Farbiger Hintergrund
    GUICtrlSetOnEvent(-1, "_SpecialEvents")

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

    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While Sleep(1000)
    WEnd

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

    Func _SpecialEvents()
    Switch @GUI_CtrlId
    Case -3
    Exit
    Case 3
    MsgBox(64, 'tata ...', StringFormat('Viel Spaß wünscht\nRitzelrocker04 !'), 3)
    Exit
    EndSwitch
    EndFunc ;==>_SpecialEvents
    ;Ende

    [/autoit]