Flimmernde Buttons [Problem mit Backgroundimage]

  • Hallo erstmal,

    wenn ich ein neues GUI entwerfe, entstehen leider immer die gleichen Probleme. Eines davon würd ich nun gerne mal aus der Welt schaffen.
    Und zwar geht es um folgendes:

    Ein GUI-Fenster(500px * 300px) mit einem Hintergrundbild.

    Das Hintergrundbild ist bei mir der Anfang allen übels, erst muss man die richtige Reihenfolge beim erstellen des GUIS einhalten. Dann muss man das Bild noch extra disablen [GUICtrlSetState($bgrImg,$GUI_DISABLE)]

    Alles noch schön und gut. Dann kommt aber schon das nächste Problem mit dem $bgrImg.
    Ich dachte mir: "Buttons? Die sehen mit der Zeit langweilig aus und passen nicht zu einem bunten GUI. Wieso nicht einfach ein kleines Bild mit [GUICtrlCreatePic] erstellen welches seine Farbe solange verändert, wie man draufklickt?!". Gesagt getan.:

    Ich hab mir eine kleine Funktion gemacht, welche diesen "Austausch auf Klick" vornimmt.
    ->

    [autoit]

    #include-once

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

    ; #INDEX# =======================================================================================================================
    ; Title .........: ButtonChangeColor
    ; Author(s) .....: Fabian Steinkogler
    ; ===============================================================================================================================

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

    ; #CURRENT# =====================================================================================================================
    ;_ButtonChangeColor
    ; ===============================================================================================================================

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ButtonChangeColor
    ; Description ...: Ändert das jeweilige als Button gebrauchte Bild solange diese gedrückt wird.
    ; Syntax.........: _ButtonChangeColor($gImg1,$gImg2)
    ; Parameters ....: $gImg - Name der Variable des Bildes
    ;................: $sImg1 - Pfad zur ersten Datei
    ;................: $sImg2 - Pfad zur zweiten Datei
    ; Author ........: Fabian Steinkogler
    ; ===============================================================================================================================

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

    Func _ButtonChangeColor($gImg,$sImg1,$sImg2)
    If _IsPressed(01) = 1 Then ;Wenn die linke Maustaste gedrückt wird, dann...
    Do ;erneuere...
    GUICtrlSetImage($gImg,$sImg2, -1) ;das Bild solange...
    Until _IsPressed(01) = 0 ;bis die linke Maustaste nicht mehr gedrückt wird.
    EndIf
    GUICtrlSetImage($gImg,$sImg1, -1) ;danach soll das Bild wieder durch das alte ersetzt werden.
    EndFunc

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


    Ja ich weiß, eine eigene UDF wäre nicht nötig gewesen, abgesehen davon, dass es von der Sorte schon X gibt. Aber ich fand es einfach nett, da ich das ganze hoffentlich noch öfters verwenden werde.

    Nun aber zum eigentlichen GUI:
    ->

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <Buttons.au3>

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

    $mGUI = GUICreate("Login", 500, 300, 300, 218, -1, BitOR($WS_EX_TOOLWINDOW,$WS_EX_WINDOWEDGE))
    $bgrImg = GUICtrlCreatePic(".\mainbgrimg.bmp", 0, 0, 500, 300)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $gImg1 = GUICtrlCreatePic(".\settingsico1.bmp", 472, 272, 25, 25)
    $gImg2 = GUICtrlCreatePic(".\helpbtnimg1.bmp", 464, 0, 35, 35)

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

    GUICtrlCreateInput("Name",242,60,203,26,1,512)
    GUICtrlSetFont(-1,12,400,default,"Technic")
    GUICtrlCreateInput("Passwort",242,100,203,24,33,512)
    GUICtrlSetFont(-1,12,400,default,"MS Sans Serif")
    GUISetState(@SW_SHOW)

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

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

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

    Case $gImg1
    _ButtonChangeColor($gImg1,".\settingsico1.bmp",".\settingsico2.bmp")
    MsgBox(64,"","Error")
    Case $gImg2
    _ButtonChangeColor($gImg2,".\helpbtnimg1.bmp",".\helpbtnimg2.bmp")
    MsgBox(64,"","Error")
    EndSwitch
    WEnd

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


    Tja das Problem stellte sich beim Test recht schnell herraus:
    Aus irgendeinem Grund mischt sich das verdammte $bgrImg wieder mal ein und blinzelt hin und da zwischen den Frames heraus (als weißes Flackern).

    Für alle die es sich selber ansehen wollen:
    http://www.file-upload.net/download-4011285/upload.zip.html

    und wie es sich für einen Download gehört ein VirusTotalScanReport:
    http://www.virustotal.com/file-scan/compact.html?id=011c1c0686e8c4083bc168d86fb24980cd1e83b436ea490dbefb9f2cb645dc2f-1325959811#

    Mit freundlichen Grüßen
    Fabian Steinkogler

    mfg, Stoani

    Einmal editiert, zuletzt von Stoani (7. Januar 2012 um 19:42) aus folgendem Grund: Solved

    • Offizieller Beitrag
    [autoit]

    Func _ButtonChangeColor($gImg,$sImg1,$sImg2)
    If _IsPressed(01) = 1 Then ;Wenn die linke Maustaste gedrückt wird, dann...
    GUICtrlSetImage($gImg,$sImg2, -1) ;das Bild solange...
    Do ;erneuere...
    Sleep(10)
    Until _IsPressed(01) = 0 ;bis die linke Maustaste nicht mehr gedrückt wird.
    EndIf
    GUICtrlSetImage($gImg,$sImg1, -1) ;danach soll das Bild wieder durch das alte ersetzt werden.
    EndFunc

    [/autoit]

    Auf den ersten Blick eher so…

  • Peinlich Peinlich....

    Ich hatte es genau so schon versucht, aber da ich das Skript nicht direkt im [include]-ordner gespeichert habe, wurde es auch nie so verwendet wie ich es wollte. X(
    Danke pheethebee für die rasche und korrekte Hilfe!



    Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved Solved

    mfg, Stoani