Child-GUI Objekte wandern mit der Scrollbar

  • Ich habe eine GUI in der eine weitere GUI (Child) als "Fenster" mit Scrollbar eingebettet ist. Darin ist mein MultiGraph abgebildet, der mir Logfiles am Ende graphisch wiedergeben soll. Da das Programm auf unterschiedlichen Rechnern und Monitoren laufen wird/soll, benötige ich eine flexible GUI in der Anzeige-Größe. Deshalb hat das Child-GUI die Scrollbar, weil der MultiGraph in der horizontalen Auflösung sonst nicht immer vollständig angezeigt wird. Die Skalierung der GUI funktioniert, aber wenn ich die Scrollbar bewege, dann wandert meine Zeichenfläche vom MultiGraph immer mit, der Rest "unten drunter" (Achsbezeichnung und gezeichnete Achsen) bleiben stehen). Was könnte hier der Fehler sein, bzw wie kann ich das beheben? ?(

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <mod_MultiGraph.au3>
    #include <Date.au3>
    #include <file.au3>
    #include <GUIScrollbars_Ex.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $hGUI= GUICreate("Diagramm-Tool", 1024, 768, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_MAXIMIZE,$WS_TABSTOP))
    GUISetState (@SW_MAXIMIZE)

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

    Local $size = WinGetClientSize($hGUI)

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

    ;~ Bedien- & Anzeige-Elemente erzeugen
    $OpenLogfile = GUICtrlCreateButton("Logfile öffnen", 8, $size[1]-75, 80, 20)
    $PlotLogfile = GUICtrlCreateButton("Logfile plotten", 90, $size[1]-75, 80, 20)
    $LabelOpenLogfile = GUICtrlCreateLabel("geöffnetes Logfile:", 8, $size[1]-50, 90, 20, $SS_CENTERIMAGE)
    $ViewOpenLogfile= GUICtrlCreateInput("", 100, $size[1]-50, 200, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
    $LabelZeilenAnzahl = GUICtrlCreateLabel("Logeinträge:", 8, $size[1]-25, 90, 20, $SS_CENTERIMAGE)
    $ZeilenAnzahl = GUICtrlCreateInput("0", 100, $size[1]-25, 50, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))

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

    $GUI_Graph = GUICreate("", $size[0]-25, $size[1]-100, 10, 10, $WS_CHILD, $WS_EX_CLIENTEDGE, $hGUI)
    $Label_Graph = GUICtrlCreateLabel("", $size[0]-25, $size[1]-100, 10, 10)

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

    ;~ Scrollbar erzeugen
    _GUIScrollbars_Generate($GUI_Graph, 1575, 700)

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

    ;~ Multigraph erzeugen
    _MG_Graph_entfernen(1)
    _MG_Graph_erstellen (1, $GUI_Graph, 50, 25, 1440, 600)
    _MG_Graph_optionen_position (1, $GUI_Graph, 50, 25, 1440, 600)

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

    _MG_Graph_optionen_allgemein (1, 720, -20, 40, 22.5, 90, 0xFFFFFF, 2)
    _MG_Graph_optionen_Rahmen (1, True, 0x000000, 1)
    _MG_Graph_optionen_Hauptgitterlinien (1, 1, 20, 20, 1,0x000000, 190)
    _MG_Graph_optionen_Hilfsgitterlinien (1, 1, 10, 10, 1,0x000000, 220)

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

    _MG_Graph_optionen_Plottmodus (1, 0, 0, 1, True)

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

    _MG_Graph_Achse_links (1, True, -20, 40, 0, "°C", 0x000000, Default, 8, 70, 0.5)
    _MG_Graph_Achse_rechts (1, True, 22.5, 90.00, 2, " °", 0x000000, Default, 8, 70, 5)
    _MG_Graph_Achse_unten (1, True, 0, 24, 2, "Uhrzeit", 0x000000, Default, 8, 27, 2)

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

    _MG_Kanal_optionen (1, 1, 1, 1, 0x0044FF, 0)
    _MG_Kanal_optionen (1, 2, 1, 1, 0xFF6600, 0)
    _MG_Kanal_optionen (1, 3, 1, 2, 0xDAA520, 0)
    _MG_Kanal_optionen (1, 4, 1, 1, 0x8B0000, 0)
    _MG_Kanal_optionen (1, 5, 1, 1, 0x008000, 0)
    _MG_Kanal_optionen (1, 6, 1, 1, 0x6A5ACD, 0)
    _MG_Kanal_optionen (1, 7, 1, 3, 0x7FFF00, 0)
    _MG_Kanal_optionen (1, 8, 1, 3, 0xFF4500, 0)

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

    _MG_Graph_initialisieren(1)
    GUISetState()
    GUICtrlSetResizing($GUI_Graph, $GUI_DOCKALL)

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

    ; Zur urprünglichen GUI wechseln
    GUISwitch($hGUI)

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

    GUISetState(@SW_SHOW)

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

    Global $plot = 0
    Global $aBuffer = 0

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

    While 1
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Events")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Events")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Events")
    GUICtrlSetOnEvent($OpenLogfile, "_OpenLogfile")
    GUICtrlSetOnEvent($PlotLogfile, "_plot")
    _MG_Graph_updaten (1)

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

    Sleep (10)
    WEnd

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

    Func _Events() ; hier sind die Events der GUI:
    ; Fenster Schliessen, Minimieren, Maximieren,

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

    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit

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

    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE

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

    Case @GUI_CtrlId = $GUI_EVENT_RESTORE

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

    EndSelect

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

    EndFunc

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

    ;~ Öffnen des Logfiles, ermitteln der Zeilenanzahl und Anzeige des gewählten Logfiles
    Func _OpenLogfile()
    $Logfile = FileOpenDialog ("Logfile auswählen", @ScriptDir&"\Archiv_Logimat", "(*.csv)", 1 + 4)
    If $Logfile = "" Then
    MsgBox (0, "Info", "Kein Logfile ausgewählt")
    Else
    _FileReadToArray ($Logfile, $aBuffer)
    EndIf
    GUICtrlSetData ($ViewOpenLogfile, $Logfile)
    GUICtrlSetData ($ZeilenAnzahl, $aBuffer[0])
    EndFunc

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

    ;~ Zeilenweises Aufsplitten der Werte und anschließendes Plotten in den MultiGraph
    Func _plot()
    $SplitWert = StringSplit($aBuffer[2], ";")
    _MG_Graph_Clear (1)
    for $i = 2 to ($aBuffer[0]) Step 1
    $SplitWert = StringSplit($aBuffer[$i], ";")
    _MG_Wert_setzen_Y1 (1, 1, StringReplace($Splitwert[3], ",", "."))
    _MG_Wert_setzen_Y1 (1, 2, StringReplace($Splitwert[4], ",", "."))
    _MG_Wert_setzen_Y1 (1, 3, StringReplace($Splitwert[5], ",", "."))
    _MG_Wert_setzen_Y1 (1, 4, StringReplace($Splitwert[6], ",", "."))
    _MG_Wert_setzen_Y1 (1, 5, StringReplace($Splitwert[7], ",", "."))
    _MG_Wert_setzen_Y1 (1, 6, StringReplace($Splitwert[8], ",", "."))
    _MG_Wert_setzen_Y2 (1, 7, StringReplace($Splitwert[9], ",", "."))
    _MG_Wert_setzen_Y2 (1, 8, StringReplace($Splitwert[10], ",", "."))
    _MG_Graph_plotten (1)
    Next

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

    EndFunc

    [/autoit]

    das vollständige Script , die benötigten UDF´s und ein paar Logfiles sind im Anhang.

    Schon mal recht herzlichen Dank für die Hilfe im Vorraus.

  • Das Problem konnte ich jetzt nach vielem Hin und Her, Nachlesen sowie Probieren selbst in den Griff kriegen. Ursache war, dass die von GDI+ erzeugte Fläche nur absolut zur ChildGUI angezeigt wurde. Beim Scrollen muss der Bezugspunkt sich aber relativ verhalten. Dazu musste ich die Position der Scrollbar ermitteln und um wieviele Pixel sich der GUI-Inhalt verschoben hat.