GUI-Darstellung, Wechsel der Schriftfarbe eines Labels --> ästhetisches Problem

  • Hallo zusammen,

    ich habe für die GUI-Spezialisten unter Euch einen Schönheitsfehler, den ich gerne beseitigen möchte:

    Ich möchte die Auswahl einer Funktion (ON/OFF) über ein Label des GUI steuern, beim Anklicken wechselt die Farbe der Schrift, so daß man den Status erkennen kann. So weit so gut; klappt auch. Jedoch "erscheint" beim Anklicken des Labels kurzzeitig der Hintergrund, kann man das vermeiden? In der Hilfe habe ich nichts gefunden, um den "Umschaltvorgang" zu beeinflussen .......

    P.S.

    - den Farbwechsel habe ich unterschiedlich realisiert, gleiches Ergebnis

    - habe den Farbwechsel mit der Funktion test() [Aurfuf über <t>] auch mal ohne Klicken realisiert, das Erscheinen des Hintergrundes liegt aber nicht an der Maus-Ansteuerung des Labels


    Spoiler anzeigen
    [autoit]


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

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

    Global $sethfm = 0
    Global $b_hoehe = 30, $b_breite = 250
    Global $farbe1 = 0xff0000 ; Rot
    Global $farbe2 = 0x076825 ; Grün
    Global $L2

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

    HotKeySet("t", "test")

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

    ;-------------------------------------------------------------------------------------------------------------
    gui()
    Exit
    ;-------------------------------------------------------------------------------------------------------------

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

    Func gui()
    $Form1 = GUICreate("Form1", 500, 440, (@DesktopWidth - 500) / 2, (@DesktopHeight - 400) / 2, $WS_DLGFRAME + $WS_POPUP + $WS_THICKFRAME)
    $Pic1 = GUICtrlCreatePic("pic.jpg", 0, 0, 500, 440, $WS_BORDER)
    $L2 = GUICtrlCreateLabel("Label Text", 125, 200, $b_breite, $b_hoehe, $SS_CENTER)
    GUICtrlSetCursor(-1, 0)
    If $sethfm = 0 Then format($L2, $farbe1)
    If $sethfm = 1 Then format($L2, $farbe2)
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $L2
    If $sethfm = 0 Then
    $sethfm = 1
    GUICtrlSetColor($L2, $farbe2)
    ElseIf $sethfm = 1 Then
    $sethfm = 0
    format($L2, $farbe1)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>gui

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

    Func format($control, $farbe)
    GUICtrlSetBkColor($control, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 18, 900, 2, "Verdana")
    GUICtrlSetColor($control, $farbe)
    EndFunc ;==>format

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

    Func test()
    For $i = 1 To 3
    GUICtrlSetColor($L2, $farbe2)
    Sleep(1000)
    GUICtrlSetColor($L2, $farbe1)
    Sleep(1000)
    Next
    EndFunc ;==>test

    [/autoit]

    das GUI-Hintergrundbild (bitte ins gleiche Verzeichnis kopieren)

    [Blockierte Grafik: http://freenet-homepage.de/latemail/pic.jpg]


    >>>> und wie bitte bleibt im Spoiler die Formatierung des Quell-Textes erhalten?? <<<<<<

  • Hey,

    ich hab ein wenig rumprobiert, jedoch sieht es aus als ob er immer das Label neu aufbaut, selbst beim Befehl
    GUICtrlSetState($L2, $GUI_HIDE) wird der Hintergrund erst weiß und verschwindet dann.

    Wieso erstellst du nicht einfach 2 Bilder direkt mit dem Text drin? In einem ist der Text in Grün und im anderen in Rot

    Sollte ja per Screenshots gehen und wechselst dann zwischen den Hintergründern hin und her? Könntest du das verwenden?

    Gruß

    Prajoss

    Edith sagt:

    Die Funktion format() ist recht überflüssig und nimmt noch Performance weg..
    so sieht der Code ein wenig einfacher aus und der wechsel geht auch schneller:

    [autoit]


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

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

    Global $sethfm = 0
    Global $b_hoehe = 30, $b_breite = 250
    Global $farbe1 = 0xff0000 ; Rot
    Global $farbe2 = 0x076825 ; Grün
    Global $L2

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

    HotKeySet("t", "test")

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

    ;-------------------------------------------------------------------------------------------------------------
    gui()
    Exit
    ;-------------------------------------------------------------------------------------------------------------

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

    Func gui()
    $Form1 = GUICreate("Form1", 500, 440, (@DesktopWidth - 500) / 2, (@DesktopHeight - 400) / 2, $WS_DLGFRAME + $WS_POPUP + $WS_THICKFRAME)
    $Pic1 = GUICtrlCreatePic("pic.jpg", 0, 0, 500, 440, $WS_BORDER)
    $L2 = GUICtrlCreateLabel("Label Text", 125, 200, $b_breite, $b_hoehe, $SS_CENTER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 18, 900, 2, "Verdana")
    GUICtrlSetCursor(-1, 0)
    If $sethfm = 0 Then GUICtrlSetColor($L2, $farbe2)
    If $sethfm = 1 Then GUICtrlSetColor($L2, $farbe1)
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $L2
    If $sethfm = 0 Then
    $sethfm = 1
    GUICtrlSetColor($L2, $farbe1)
    ElseIf $sethfm = 1 Then
    $sethfm = 0
    GUICtrlSetColor($L2, $farbe2)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>gui

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

    Func test()
    For $i = 1 To 3
    GUICtrlSetColor($L2, $farbe2)
    Sleep(1000)
    GUICtrlSetColor($L2, $farbe1)
    Sleep(1000)
    Next
    EndFunc ;==>test

    [/autoit]

    "Never touch a running System!"

  • "im Prinzip ja, aber ....." sagt Radio Eriwan :)


    erstmal Danke ....


    - das mit den zwei Bildern könnte ich versuchen, ist jedoch aufwändig, da ich in dem echten GUI natürlich mehrere Labels habe (war hier nur eine verkürzte Version wegen der Übersichtlichkeit)

    - der Tip von Edith (??) ist gut, nur habe ich eben mehrere Labels, deshalb habe ich die Funktion extra eingeführt, um das Script zu kürzen (konnte man so nicht erkennen, ist klar)

    - und wie fügst Du das Script MIT Formatierungen (Einrückungen) in den Thread ein?? Ich habe <SPOILER><AUTOIT> verwendet, da fliegen die TAbs raus ???!!!

  • "Edith sagt:" ist das selbe wie "Edit:" :)

    Ich habe den Quellcode aus Scite rauskopiert und eingefügt, hab das mit dem Spoiler noch nie ausprobiert...

    Wenn man natürlich das Gesamte nicht kennt, kann man halt nur gezielt auf den Ausschnitt hinarbeiten, darum auch
    das Weglassen der forma()-Funktion.

    Also ich seh das so, entweder du versuchst das mit den Bildern falls es in deinem Programm passt oder du wartest bis der ein oder
    andere Profi hier was dazusagt, ich hab da noch nicht so viel Erfahrung mit AutoIT :)

    Gruß

    Prajoss

    "Never touch a running System!"

  • Moin,

    so geht's ohne Flackern ...

    Spoiler anzeigen
    [autoit]


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

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

    Global $sethfm = 0
    Global $b_hoehe = 30, $b_breite = 250
    Global $farbe1 = 0xff0000 ; Rot
    Global $farbe2 = 0x076825 ; Grün
    Global $L2
    Global Const $WS_EX_COMPOSITED = 0x2000000 ; Gegen "Flackern"

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

    HotKeySet("t", "test")

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

    ;-------------------------------------------------------------------------------------------------------------
    gui()
    Exit
    ;-------------------------------------------------------------------------------------------------------------

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

    Func gui()
    $Form1 = GUICreate("Form1", 500, 440, (@DesktopWidth - 500) / 2, (@DesktopHeight - 400) / 2, _
    BitOR ($WS_DLGFRAME, $WS_POPUP, $WS_THICKFRAME), $WS_EX_COMPOSITED)
    $Pic1 = GUICtrlCreatePic("pic.jpg", 0, 0, 500, 440, $WS_BORDER)
    $L2 = GUICtrlCreateLabel("Label Text", 125, 200, $b_breite, $b_hoehe, $SS_CENTER)
    GUICtrlSetBkColor($L2, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 18, 900, 2, "Verdana")
    GUICtrlSetCursor(-1, 0)
    GUICtrlSetState (-1, $GUI_ONTOP) ; ... wichtig !
    If $sethfm = 0 Then format($L2, $farbe1)
    If $sethfm = 1 Then format($L2, $farbe2)

    GUISetState(@SW_SHOW)

    While 1

    $nMsg = GUIGetMsg()

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $L2
    If $sethfm = 0 Then
    $sethfm = 1
    format($L2, $farbe2)
    ElseIf $sethfm = 1 Then
    $sethfm = 0
    format($L2, $farbe1)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>gui

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

    Func format($control, $farbe)
    GUICtrlSetColor($control, $farbe)
    EndFunc ;==>format

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

    Func test()
    For $i = 1 To 3
    GUICtrlSetColor($L2, $farbe2)
    Sleep(1000)
    GUICtrlSetColor($L2, $farbe1)
    Sleep(1000)
    Next
    EndFunc ;==>test

    [/autoit]


    LG
    Greenhorn


  • Hey Greenhorn,

    wie kommt man auf

    [autoit]

    Global Const $WS_EX_COMPOSITED = 0x2000000 ; Gegen "Flackern"

    [/autoit]

    In der Hilfe ist dier Ex-Style nicht enthalten, da sieht man mal was Erfahrung ausmacht :)

    Gruß

    Prajoss

    "Never touch a running System!"