Probleme mit der GUI Aktualisierung

  • Hallo Leute,

    Mich zwickt schon eine Weile das Problem mit der Aktualisierng meiner GUI.

    Kurz zum Aufbau (nur die wichtigsten Punkte):
    - INI READ
    - VAR DECLARATION
    - INCLUDES
    - MAIN GUI
    - OPTIONS GUI
    - WORKAROUND

    Problem 1:

    Spoiler anzeigen
    [autoit]

    In der Main Gui rufe ich unter anderem PNG-Grafiken auf
    #Region ### MAIN GUI - LOAD PNG ###
    _GDIPlus_Startup()
    $hImage_Winamp = _GDIPlus_ImageLoadFromFile("images\winamp001.png")
    $hImage_News = _GDIPlus_ImageLoadFromFile("images\news001.png")
    $hImage_Wetter = _GDIPlus_ImageLoadFromFile("images\wetter001.png")
    $hImage_Musik = _GDIPlus_ImageLoadFromFile("images\musik001.png")
    $hImage_Kino = _GDIPlus_ImageLoadFromFile("images\kino001.png")
    $hImage_Sport = _GDIPlus_ImageLoadFromFile("images\sport001.png")
    $hImage_Horoskop = _GDIPlus_ImageLoadFromFile("images\horoskop001.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGuiMain)

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    #EndRegion ### MAIN GUI - LOAD PNG ###

    [/autoit]

    und gebe diese Recourcen nach dem Workaround, vor dem Exit wieder frei

    Spoiler anzeigen
    [autoit]

    #Region ### FREE RECOURCES ###
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage_Winamp)
    _GDIPlus_ImageDispose($hImage_News)
    _GDIPlus_ImageDispose($hImage_Wetter)
    _GDIPlus_ImageDispose($hImage_Musik)
    _GDIPlus_ImageDispose($hImage_Kino)
    _GDIPlus_ImageDispose($hImage_Sport)
    _GDIPlus_ImageDispose($hImage_Horoskop)
    _GDIPlus_Shutdown()
    FileDelete("temp\*.*")
    #EndRegion ### FREE RECOURCES ###

    [/autoit]

    Jetzt habe ich aber das Problem, dass bei jeder Aktion im GUI (Aufruf eines MenuItems, Klick eines Buttons usw.) die PNG-Grafiken neu über die alten geladen werden. Was zum Beispiel bei Schatten das Problem birgt, dass diese mit der Zeit zu unschönen schwarzen Klecksen verkommen, auch werden die Grafiken mit der Zeit an den Rändern dadurch unscharf. Das heißt es wird bei jeder Aktion über das alte PNG ein neues gelegt. Ich finde aber keine Möglichkeit das zu unterbinden.

    Problem 2:
    Hängt ebenfalls mit der aktualisierung der GUI zusammen.
    Mein Script soll über "AdlibRegister" nun ca. alle 60 Sekunden eine Funktion aufrufen, die die Verbindung zu einem FTP-Server testet und entweder "true" oder "false" zurück gibt. Aufgrund dieses Wertes, sollen zum einen bei "False" die Buttons im Script deaktiviert werden und in der Statusbar "Nicht Verbunden" angezeigt werden. Im Umkehrschluß sollben bei "True" dann wieder die Buttons aktiviert werden und in der Statusbar "Verbunden" stehen.

    Doch auch hier hänge ich mit der aktualisierung des GUI's. Zwar bekomme ich den richtigen Wert zurück, aber das GUI reagiert nicht auf die Änderungen.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

    Einmal editiert, zuletzt von AnMa (27. September 2013 um 01:04)

    • Offizieller Beitrag

    AnMa:

    Um dir wirklich helfen zu können, stelle bitte immer lauffähigen Code ein.
    Also erstelle ein Bsp.-Skript, mit Bildquellen, die auf jedem Windows-PC vorhanden sind (bevorzugte Variante) oder liefere die Bilder als Anhang mit. Dieses Skript muss dann auch nachvollziehbar den geschilderten Fehler produzieren.

  • Das ist nicht mehr so einfach ... :(

    Das Programm hat inzwischen doch sehr umfangreiche Formen angenommen und ich wüßte nicht wie ich das so reduziere, dass ich es hier noch funktional posten könnte.


    Da muß ich erstmal sehen wie ich das bewerkstelligen kann.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Ich bekomme auf die Schnelle nix lauffähiges zustande was ich hier einstellen könte :(

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Jetzt habe ich mal ein Beispiel, das zeigen sollte wo das Problem liegt.

    Immer wenn man in dem Script auf "Datei" klickt und dann wiedr zuück ins Gui klickt, also ohne das Script zu beenden, verdoppelt sich der Schatten der Grafik.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=becast_icon.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #RequireAdmin

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

    #Region ### VAR DECLARATION ###
    Global $hGuiMain, $hGuiOpt, $sOptSet, $hStatus
    #EndRegion ### VAR DECLARATION ###

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

    #Region ### INCLUDES ###
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>
    #include <GroupEx.au3>
    #EndRegion ### INCLUDES ###

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

    #Region #################### MAIN GUI ####################

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

    #Region ### MAIN GUI - DECLARATION OF VARS ###
    Global $hGuiMain = GUICreate("Downloader V. ", 800, 570, 20, 20)
    #EndRegion ### MAIN GUI - DECLARATION OF VARS ###

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

    #Region ### MAIN GUI - GUI OPTIONS ###
    GUICtrlSetState(-1, $GUI_DISABLE)
    #EndRegion ### MAIN GUI - GUI OPTIONS ###

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

    #Region ### MAIN GUI - MENU ###
    $sMenuFile = GUICtrlCreateMenu("Datei")
    $sItemExit = GUICtrlCreateMenuItem("Beenden", $sMenuFile)
    #EndRegion ### MAIN GUI - MENU ###

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

    #Region ### MAIN GUI - LOAD PNG ###
    _GDIPlus_Startup()
    $hImage_News = _GDIPlus_ImageLoadFromFile("news001.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGuiMain)

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    #EndRegion ### MAIN GUI - LOAD PNG ###

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

    #EndRegion #################### MAIN GUI ####################

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

    GUISetState(@SW_SHOW, $hGuiMain)

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

    #Region ### WORKAROUND ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $sItemExit, $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    GUIDelete($hGuiMain)
    #EndRegion ### WORKAROUND ###

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

    #Region ### FREE RECOURCES ###
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage_News)
    _GDIPlus_Shutdown()
    #EndRegion ### FREE RECOURCES ###

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

    Exit

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

    Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    _WinAPI_RedrawWindow($hGuiMain, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage_News, 30, 150)
    _WinAPI_RedrawWindow($hGuiMain, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT

    [/autoit]

    Grafik im Anhang

  • Bei mir läuft es auch unter Win7 64Bit.

    Und egal was ich tue, die transparente ONG-Grafik wird bei jeder GUI-veränderung (Klicken auf Datei udn anschließend das Menue wieder verlassen) neu über die bereits existierende Grafik gelegt. Die Überlagerung der Schatten führt dann irgendwann zu einem schwarzen Fleck. Auch wird mit der Zeit der Rand der Grafik imemr unsauberer.

    Das ist der selbe Effekt, wenn ich in Photoshop eine Ebene immer wieder kopiere.

    Also unterm Strich lädt das Script die Grafik bei jeder Aktion neu rein ohne darauf Rücksicht zu nehmen ob die Grafik schon geladen ist.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=becast_icon.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #RequireAdmin

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

    #Region ### VAR DECLARATION ###
    Global $hGuiMain, $hGuiOpt, $sOptSet, $hStatus
    #EndRegion ### VAR DECLARATION ###

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

    #Region ### INCLUDES ###
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>
    ;~ #include <GroupEx.au3>
    #EndRegion ### INCLUDES ###

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

    #Region #################### MAIN GUI ####################

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

    #Region ### MAIN GUI - DECLARATION OF VARS ###
    Global $hGuiMain = GUICreate("Downloader V. ", 800, 570, 20, 20)
    #EndRegion ### MAIN GUI - DECLARATION OF VARS ###

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

    #Region ### MAIN GUI - GUI OPTIONS ###
    GUICtrlSetState(-1, $GUI_DISABLE)
    #EndRegion ### MAIN GUI - GUI OPTIONS ###

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

    #Region ### MAIN GUI - MENU ###
    $sMenuFile = GUICtrlCreateMenu("Datei")
    $sItemExit = GUICtrlCreateMenuItem("Beenden", $sMenuFile)
    #EndRegion ### MAIN GUI - MENU ###

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

    #Region ### MAIN GUI - LOAD PNG ###
    _GDIPlus_Startup()
    $hImage_News = _GDIPlus_ImageLoadFromFile("news001.png")
    $iPic = GUICtrlCreatePic("", 60, 60, _GDIPlus_ImageGetWidth($hImage_News), _GDIPlus_ImageGetHeight($hImage_News))
    $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage_News)
    _WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x0172, 0, $hHBitmap))

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

    #EndRegion ### MAIN GUI - LOAD PNG ###

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

    #EndRegion #################### MAIN GUI ####################

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

    GUISetState(@SW_SHOW, $hGuiMain)

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

    #Region ### WORKAROUND ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $sItemExit, $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    GUIDelete($hGuiMain)
    #EndRegion ### WORKAROUND ###

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

    #Region ### FREE RECOURCES ###
    _GDIPlus_ImageDispose($hImage_News)
    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_Shutdown()
    #EndRegion ### FREE RECOURCES ###

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

    Exit

    [/autoit]


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Auch wenn ich noch nicht ganz kapiere warum, aber es funktioniert. :) Vielen Dank

    Ich werde das Ganze nochmal auf alle Grafiken umarbeiten.

    Ein Problem weniger auf dem weiten Weg :)

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Das GDI+ Bild wird in ein GDI Bild umgewandelt und in das Picture Control kopiert. Die GUI Controls werden sauber neugezeichnet.


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • So, jippie ... ein Problem gelöst :) und ich verstehs sogar .... Danke UEZ

    Ist aber noch meine zweite Hürde offen. Wie schon erwähnt würde ich gerne ein paar der in der GUI angezeigte Buttons deaktivieren, wenn der Verbindungstest zum FTP-Server einen Error ausspuckt. Parallel dazu soll in einer Statusleiste eine Meldung stehen die anzeigt ob die Serververbindung OK ist oder nicht.

    Dazu habe ich eine Funktion geschrieben mit der der Status der FTP-Verbindung abgefragt wird.

    Spoiler anzeigen
    [autoit]


    #Region ## CONNECTION TEST ###
    Func _ConTest()
    Local $_S1_Open = _FTP_Open('MyFTP Control')
    Local $_S1_Conn = _FTP_Connect($_S1_Open, $sOptFtpServer, $sOptFtpUser, $sOptFtpPasswd, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0)
    _FTP_ProgressDownload1($_S1_Conn, "temp" & $sOptFtpZugang, "../_func/" & $sOptFtpZugang, "_UpdateProgress")
    _FTP_Close($_S1_Open)
    Local $check = IniRead("temp\zugang.ini", "sektion1", "check", "Nicht gefunden")
    FileDelete("temp\zugang.ini")
    $sConnChange = True
    If $check = "Nicht gefunden" Then
    _logfile("### ERROR - Serverconn: " & $check)
    $sOptSet = False
    Return $sOptSet
    Else
    _logfile("Serverconn: " & $check)
    $sOptSet = True
    Return $sOptSet
    Endif
    EndFunc
    #EndRegion ## CONNECTION TEST ###

    [/autoit]

    Das klappt auch so weit und die Variable $sOptSet.
    Mit AdlibRegister rufe ichalle 20 Sekunden die obige Funktion auf.

    Womit ich aber große Probleme habe dies entsprechend in die MainGui einzubinden.
    Aber die einzige brauchbare Idee die mir dazu einfiel war es das in den Workaround mit einzubinden, was aber so keine gute Lösung ist und aktuell die GUI lahmlegt.

    Spoiler anzeigen
    [autoit]

    Case $sOptSet = True
    $defaultstatus = " VERBUNDEN"
    GUICtrlSetData ($statuslabel, " Verbindungsstatus zum FTP-Server:" & $defaultstatus)
    GUICtrlSetColor($statuslabel, 0x40FF00)
    GUICtrlSetFont($statuslabel, Default, 400, Default, "Arial Black")
    GUICtrlSetState($hGuiMainButton_1, $GUI_ENABLE)
    Case $sOptSet = False
    $defaultstatus = " KEINE VERBINDUNG !!!"
    GUICtrlSetData ($statuslabel, " Verbindungsstatus zum FTP-Server:" & $defaultstatus)
    GUICtrlSetColor($statuslabel, 0xFF0000)
    GUICtrlSetState($hGuiMainButton_1, $GUI_DISABLE)

    [/autoit]

    Auch die Idee über ein externes Programm zu arbeiten, ändert am Ende ja nichts an dem Problem mit der Aktualisierung der GUI.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Moin!

    Mir ist zwar nicht ganz klar, wie du die Gui lahmlegst, aber warum änderst du die Status nicht direkt in der Test-Funktion?

    Also so:

    [autoit]

    #Region ## CONNECTION TEST ###
    Func _ConTest()
    Local $_S1_Open = _FTP_Open('MyFTP Control')
    Local $_S1_Conn = _FTP_Connect($_S1_Open, $sOptFtpServer, $sOptFtpUser, $sOptFtpPasswd, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0)
    _FTP_ProgressDownload1($_S1_Conn, "temp" & $sOptFtpZugang, "../_func/" & $sOptFtpZugang, "_UpdateProgress")
    _FTP_Close($_S1_Open)
    Local $check = IniRead("temp\zugang.ini", "sektion1", "check", "Nicht gefunden")
    FileDelete("temp\zugang.ini")
    $sConnChange = True
    If $check = "Nicht gefunden" Then
    _logfile("### ERROR - Serverconn: " & $check)
    $defaultstatus = " VERBUNDEN"
    GUICtrlSetData ($statuslabel, " Verbindungsstatus zum FTP-Server:" & $defaultstatus)
    GUICtrlSetColor($statuslabel, 0x40FF00)
    GUICtrlSetFont($statuslabel, Default, 400, Default, "Arial Black")
    GUICtrlSetState($hGuiMainButton_1, $GUI_ENABLE)
    Else
    _logfile("Serverconn: " & $check)
    $defaultstatus = " KEINE VERBINDUNG !!!"
    GUICtrlSetData ($statuslabel, " Verbindungsstatus zum FTP-Server:" & $defaultstatus)
    GUICtrlSetColor($statuslabel, 0xFF0000)
    GUICtrlSetState($hGuiMainButton_1, $GUI_DISABLE)
    Endif
    EndFunc
    #EndRegion ## CONNECTION TEST ###

    [/autoit]


    Ich gehe davon aus, dass die Controls global erstellt wurden, ansonsten hättest du innerhalb der Funktion keinen Zugriff auf die entsprechenden Variablen...

    Hoffentlich hab ich das Problem richtig erkannt, wenn nicht, bitte ich darum, diesen Beitrag zu ignorieren :whistling:


    Sanfte Grüße :D

  • :wacko: 8|:huh: Tja, wenn man den Wald vor lauter Bergen oder warens die Hügel vor lauter Bäumen nicht mehr sieht :D

    So einfach zu lösen und doch so weit weg. DANKE :)

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)