#include-once #include #include #include #include _GDIPlus_Startup() OnAutoItExitRegister("_MG_Graph_Herunterfahren") ; #INDEX# ================================================================================================================================================ ; Title : MultiGraph ; AutoIt Version : 3.3.8.0 ; UDF Version : 1.0.0.3 (modified by Micha_he) ; Date of creation : 22.03.2017 (DD.MM.YYYY) ; UDF-Language : German ; Description : create a dynamic line graph ; Author : SBond, Micha_he ; Dll(s) : --- ; ======================================================================================================================================================== ; #AUTHOR INFORMATION# =================================================================================================================================== ; Author : SBond ; Modifyer : Micha_he@autoit.de ; E-Mail : sbond.softwareinfo@gmail.com ; Language : German (Deutsch) ; Country : Germany (Deutschland) ; Webside : http://www.livesystem-pro.de ; ======================================================================================================================================================== ; #UPDATES# ============================================================================================================================================== ; ; 16.03.2013 - 1.0.0.3 - behoben: die Hintergrundfarbe der Achsenbeschriftung wurde nicht komplett übernommen ; 07.03.2013 - 1.0.0.2 - neue Funktion: _MG_Graph_optionen_position () -> verschiebt einen Graphen in der GUI oder passt die Größe neu an ; 06.03.2013 - 1.0.0.1 - behoben: geplottete Werte an der ersten Position des Graphen waren fehlerhaft ; 01.02.2013 - 1.0.0.0 - erste Veröffentlichung ; ; ======================================================================================================================================================== ; #HINTS AND INFORMATION# ================================================================================================================================ ; ; Allgemeine Informationen über diese UDF ; ---------------------------------------------------------------------- ; ; Dies ist meine erste UDF. Sie entspricht nicht ganz dem UDF coding standard, aber ich hoffe mal dass ihr mit der Dokumentation klar kommt. ; Mit dieser UDF könnt ihr einen oder meherer unabhängige Liniendiagramme (bzw. Graphen) erzeugen. ; ; Es wäre eventuell wichtig zu wissen, dass der absolute Nullpunkt in der linken unteren Ecke des Graphen ist. Eine vier Quadranten-Ansicht, ist ; zwar möglich, aber noch relativ aufwändig (die Berechnungen müssen dann selber gemacht werden). ; ; In der Grundeinstellung, können 10 Graphen mit jeweils 10 Kanälen betrieben werden. Wer mehr benötigt, kann dies einfach in den Variablen einstellen. ; Die Nummerierung der Graphen und der Kanäle beginnt bei 1 und nicht bei 0. Dies ist wichtig, da auf dem Index 0 die Einstellungen der Graphen gespeichert werden. ; ; Zu den Begriffen..... Es könnte eventuell etwas verwirren, aber wenn hier von "Plotten" geschrieben wird, z.B. "die Werte in den Graphen plotten", so meine ich nicht ; dass die Werte in der GUI dargestellt werden. Die Werte werden in den Buffer geplottet. Erst wenn alle Punkte eingezeichnet sind oder die Funktion "_MG_Graph_updaten" ; genutzt wird, wird die Darstellung in der GUI aktualisiert. ; ; ; ; ; ; kurze Aufschlüsselung der Abkürzungen in den Variablen ; ---------------------------------------------------------------------- ; ; $MG_aGraph [ Graphnummer ][ Kanalnummer ][ Kanaleinstellungen ] wobei in der Kanalnummer 0 die ganzen Einstellungen des Graphen hinterlegt sind ; ; $MG_a_ -> MultiGraph allgemeine Einstellungen ; $MG_k_ -> MultiGraph Kanal-Einstellungen ; ; i -> integer ; f -> float ; h -> handle ; b -> boolean ; a -> array ; s -> string ; v -> variable (hier meistens ein Hex-Wert) ; ; ======================================================================================================================================================== ; #CURRENT# ============================================================================================================================================== ; ; Function Parameter ; ---------------------------------------------------------------------- ; _MG_Graph_erstellen ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe) ; _MG_Graph_optionen_position ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe) ; _MG_Graph_optionen_allgemein ($iGraph, $iAufloesung, $iY_min, $iY_max, $vHintergrundfarbe, $iRendermodus) ; _MG_Graph_optionen_Rahmen ($iGraph, $bAnzeigen, $vRahmenfarbe, $iRahmenbreite) ; _MG_Graph_optionen_Hauptgitterlinien ($iGraph, $bHauptgitter_aktiviert, $iHauptgitter_abstand_X, $iHauptgitter_abstand_Y, $iHauptgitter_breite, $vHauptgitter_farbe, $iHauptgitter_Transparenz) ; _MG_Graph_optionen_Hilfsgitterlinien ($iGraph, $bHilfsgitter_aktiviert, $iHilfsgitter_abstand_X, $iHilfsgitter_abstand_Y, $iHilfsgitter_breite, $vHilfsgitter_farbe, $iHilfsgitter_Transparenz) ; _MG_Graph_optionen_Plottmodus ($iGraph, $iPlottmodus, $iPlottfrequenz, $iClearmodus, $bInterpolation) ; _MG_Kanal_optionen ($iGraph, $iKanal, $bKanal_aktivieren, $iLinien_Breite, $vLinien_Farbe, $iLinien_Transparenz) ; _MG_Graph_initialisieren ($iGraph) ; _MG_Wert_setzen ($iGraph, $iKanal, $fWert) ; _MG_Graph_updaten ($iGraph) ; _MG_Graph_clear ($iGraph) ; _MG_Graph_Achse_links ($iGraph, $bAchse_anzeigen, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit, $vSchriftfarbe, $vHintergrundfarbe, $fSchriftgroesse, $iLabelbreite, $fIntervall) ; _MG_Graph_Achse_rechts ($iGraph, $bAchse_anzeigen, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit, $vSchriftfarbe, $vHintergrundfarbe, $fSchriftgroesse, $iLabelbreite, $fIntervall) ; _MG_Graph_Achse_unten ($iGraph, $bAchse_anzeigen, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit, $vSchriftfarbe, $vHintergrundfarbe, $fSchriftgroesse, $iLabelbreite, $fIntervall) ; _MG_Graph_Achse_unten_update ($iGraph, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit) ; _MG_Graph_Achse_links_update ($iGraph, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit) ; _MG_Graph_Achse_rechts_update ($iGraph, $fMin_Wert, $fMax_Wert, $iNachkommastellen, $sEinheit) ; _MG_Graph_plotten ($iGraph) ; _MG_Graph_entfernen ($iGraph) ; ; ======================================================================================================================================================== ; #FUNCTION-DESCRIPTION# ============================================================================================================================================== ; ; Function kurze Beschreibung ; ---------------------------------------------------------------------- ; _MG_Graph_erstellen erstellt einen Graphen ; _MG_Graph_optionen_position verschiebt einen Graphen in der GUI oder passt die Größe neu an ; _MG_Graph_optionen_allgemein ändert die allgemeinen Einstellungen des Graphen ; _MG_Graph_optionen_Rahmen ändert die Rahmen-Einstellungen des Graphen ; _MG_Graph_optionen_Hauptgitterlinien ändert die Einstellungen der Hauptgitterlinien im Graphen ; _MG_Graph_optionen_Hilfsgitterlinien ändert die Einstellungen der Hilfsgitterlinien im Graphen ; _MG_Graph_optionen_Plottmodus ändert die Plott-Einstellungen des Graphen ; _MG_Kanal_optionen ändert die Kanal-Einstellungen des Graphen ; _MG_Graph_initialisieren plottet den Graphen erstmalig in der GUI ; _MG_Wert_setzen legt den neuen Wert für den nächsten Plottvorgang fest ; _MG_Graph_updaten zeichnet den Graph in die GUI bzw. aktualisiert die Darstellung ; _MG_Graph_clear löscht die aktuell geplotteten Werte ; _MG_Graph_Achse_links erzeugt eine Achsbeschriftung auf der linken Seite (Y-Achse), die sich an den horizontalen Hauptgitterlinien richtet ; _MG_Graph_Achse_rechts erzeugt eine Achsbeschriftung auf der rechten Seite (Y-Achse), die sich an den horizontalen Hauptgitterlinien richtet ; _MG_Graph_Achse_unten erzeugt eine Achsbeschriftung auf der unteren Seite (X-Achse), die sich an den vertikalen Hauptgitterlinien richtet ; _MG_Graph_Achse_unten_update aktualisiert die Achsbeschriftung auf der unteren Seite (X-Achse) ; _MG_Graph_Achse_links_update aktualisiert die Achsbeschriftung auf der linken Seite (Y-Achse) ; _MG_Graph_Achse_rechts_update aktualisiert die Achsbeschriftung auf der rechten Seite (Y-Achse) ; _MG_Graph_plotten plottet die neuen Werte in den Graphen und aktualisiert ggf. die Darstellung in der GUI (je nach Einstellungen) ; _MG_Graph_entfernen löscht den Graphen aus der GUI ; ; ======================================================================================================================================================== ; #INTERNAL_USE_ONLY# ==================================================================================================================================== ; ; Function Parameter ; ---------------------------------------------------------------------- ; _MG_Graph_Hauptgitterlinien_plotten ($iGraph, $iModus) ; _MG_Graph_Hilfsgitterlinien_plotten ($iGraph, $iModus) ; _MG_Graph_Herunterfahren () ; ; ======================================================================================================================================================== ; #VARIABLES# ============================================================================================================================================ Global Enum $MG_a_bGraph_aktiviert, _ ; enthält die Information, ob dieser Graph verwendet wird $MG_a_hGUI, _ ; das GUI-handle, auf dem der Graph gezeichnet werden soll $MG_a_iX_Pos, _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_a_iY_Pos, _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_a_iBreite, _ ; die Breite des Graphen $MG_a_iHoehe, _ ; die Höhe des Graphen $MG_a_hGraphic, _ ; handle zum Grafik-Objekt $MG_a_hBitmap, _ ; handle zum Grafik-Kontext $MG_a_hBuffer, _ ; handle zum Grafik-Buffer $MG_a_iAufloesung, _ ; Auflösung bzw. horizontale Skalierung: Ist die Anzahl der Werte, die dargestellt werden. (Wenn die Auflösung gleich die Breite des Graphen ist, dann wird pro Pixel ein Wert dargestellt.) $MG_a_fInkrement_groesse, _ ; der horizontale Pixelabstand zwischen zwei dargestellten Werten $MG_a_iVerschiebung, _ ; Anzahl der horizontalen Pixel, die im "Scroll-Modus" für jede neue Darstellung verschoben werden müssen. $MG_a_iY_min, _ ; der kleinste Wert, der im Graph dargestellt werden kann $MG_a_iY_max, _ ; der größte Wert, der im Graph dargestellt werden kann $MG_a_iWertebereich, _ ; Wertebereich des Graphen (Y-Achse) $MG_a_fWertaufloesung, _ ; Auflösung bzw. vertikale Skalierung: kleinster vertikaler Pixelabstand zwischen 2 Werten $MG_a_vHintergrundfarbe, _ ; die Hintergrundfarbe des Graphen $MG_a_bRahmen, _ ; aktiviert/deaktiviert den Rahmen für den Graphen $MG_a_vRahmenfarbe, _ ; die Rahmenfarbe $MG_a_iRahmenbreite, _ ; die Breite des Rahmens. (der Zeichenbereich des Graphen wird dabei nicht verschoben oder verändert) $MG_a_hRahmen, _ ; handle des Rahmens $MG_a_bHauptgitter_aktiviert, _ ; aktiviert/deaktiviert die Hauptgitterlinien $MG_a_iHauptgitter_abstand_X, _ ; der horizontale Abstand zwischen den Hauptgitterlinien $MG_a_iHauptgitter_abstand_Y, _ ; der vertikale Abstand zwischen den Hauptgitterlinien $MG_a_vHauptgitter_farbe, _ ; die verwendete Farbe der Hauptgitterlinien $MG_a_iHauptgitter_breite, _ ; die Linienbreite $MG_a_iHauptgitter_Transparenz, _ ; die verwendete Transparenz der Hauptgitterlinien (0 bis 255) -> 0: keine Transparenz; 255: unsichtbar $MG_a_hHauptgitter_Pen, _ ; handle zum "Zeichen-Stift" $MG_a_iHauptgitter_Merker, _ ; ein Merker zum Zwischenspeichern von Positionsinformationen $MG_a_bHilfsgitter_aktiviert, _ ; aktiviert/deaktiviert die Hilfsgitterlinien $MG_a_iHilfsgitter_abstand_X, _ ; der horizontale Abstand zwischen den Hilfsgitterlinien $MG_a_iHilfsgitter_abstand_Y, _ ; der vertikale Abstand zwischen den Hilfsgitterlinien $MG_a_vHilfsgitter_farbe, _ ; die verwendete Farbe der Hilfsgitterlinien $MG_a_iHilfsgitter_breite, _ ; die Linienbreite $MG_a_iHilfsgitter_Transparenz, _ ; die verwendete Transparenz der Hilfsgitterlinien (0 bis 255) -> 0: keine Transparenz; 255: unsichtbar $MG_a_hHilfsgitter_Pen, _ ; handle zum "Zeichen-Stift" $MG_a_iHilfsgitter_Merker, _ ; ein Merker zum Zwischenspeichern von Positionsinformationen $MG_a_iRendermodus, _ ; Antialiasing (Kantenglättung) -> 0: keine Glättung; 1: Glättung mit 8 X 4 Rechteckfilter; 2: Glättung mit 8 X 8 kubischem Filter $MG_a_iPlottfrequenz, _ ; ist die Anzahl der Plottvorgänge, bevor der Graph in der GUI aktualisiert wird. (je höher der Wert, desto mehr Werte können pro Sekunde dargestellt werden) $MG_a_iPlott_Counter, _ ; allgemeiner Merker für den Plottvorgang (Zähler für die Plottfrequenz) $MG_a_iPlottmodus, _ ; Anzeigemodus des Graphen -> 0: stehender Graph: Werte werden von links nach rechts gezeichnet; 1: bewegter Graph: Graph "scrollt" kontinuierlich von rechts nach links $MG_a_iClearmodus, _ ; Löschmodus (nur wenn Plottmodus: 0) -> 0: alte Werte nicht löschen; 1: "aktualisieren" der alten Werte; 2: Graphinhalt nach kompletten durchlauf löschen $MG_a_bInterpolation, _ ; aktiviert/deaktiviert die Interpolation zwischen 2 Werten $MG_a_iPosition_aktuell, _ ; aktuelle (horizontale) Position des zu plottenden Wertes im Zeichenbereich $MG_a_iAchsbeschriftungen_rechts, _ ; Anzahl der Beschriftungen der Y-Achse (rechte Seite) $MG_a_iAchsbeschriftungen_rechts_intervall, _ ; Multiplikator: Darstellungsfaktor zwischen den Hauptgitterlinien -> 1: jede Hauptgitterlinie; 2: jede zweite Hauptgitterlinie; ...usw... $MG_a_iAchsbeschriftungen_links, _ ; Anzahl der Beschriftungen der Y-Achse (linke Seite) $MG_a_iAchsbeschriftungen_links_intervall, _ ; Multiplikator: Darstellungsfaktor zwischen den Hauptgitterlinien -> 1: jede Hauptgitterlinie; 2: jede zweite Hauptgitterlinie; ...usw... $MG_a_iAchsbeschriftungen_unten, _ ; Anzahl der Beschriftungen der X-Achse $MG_a_iAchsbeschriftungen_unten_intervall, _ ; Multiplikator: Darstellungsfaktor zwischen den Hauptgitterlinien -> 1: jede Hauptgitterlinie; 2: jede zweite Hauptgitterlinie; ...usw... $MG_a_ANZAHL_EINTRAEGE ; aktuelle Größe des Graph-Arrays (der Wert wird durch den Enum erzeugt; die Variable muss an LETZTER STELLE stehen!) Global Enum $MG_k_bKanal_aktivieren, _ ; aktiviert/deaktivert den jeweiligen Kanal eines Graphen $MG_k_fY_aktueller_Wert, _ ; aktueller Wert $MG_k_fY_letzter_Wert, _ ; letzter Wert $MG_k_iLinien_Transparenz, _ ; die verwendete Transparenz der Linie (0 bis 255) -> 0: keine Transparenz; 255: unsichtbar $MG_k_vLinien_Farbe, _ ; die Farbe der Linie $MG_k_iLinien_Breite, _ ; die Linienbreite $MG_k_hPen ; handle zum "Zeichen-Stift" ; legt die max. Anzahl der verwendeten Graphen und Anzahl der jeweiligen Kanäle fest Global $MG_iMax_Anzahl_Graphen = 10 Global $MG_iMax_Anzahl_Kanaele = 10 Global $MG_aGraph[$MG_iMax_Anzahl_Graphen + 1][$MG_iMax_Anzahl_Kanaele + 1][$MG_a_ANZAHL_EINTRAEGE] ; ======================================================================================================================================================== ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_erstellen ; Beschreibung ..: erstellt einen Graphen ; Syntax.........: _MG_Graph_erstellen ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe) ; ; Parameter .....: $hGUI - das GUI-handle, auf dem der Graph gezeichnet werden soll ; $iGraph - Graph-Index das verwendet werden soll (beginnend mit 1) ; $iX_Pos - X-Koordinate des Zeichenbereiches (linke, obere Ecke) ; $iY_Pos - Y-Koordinate des Zeichenbereiches (linke, obere Ecke) ; $iBreite - die Breite des Graphen ; $iHoehe - die Höhe des Graphen ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Graph ist schon aktiviert ; ; Autor .........: SBond ; Bemerkungen ...: Wichtig: der Graphindex beginnt bei 1. Der Index 0 ist reserviert und sollte nicht verwendet werden. ; ; ======================================================================================================================================================== Func _MG_Graph_erstellen ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Graph schon aktiviert ist If ($MG_aGraph[$iGraph][0][$MG_a_bGraph_aktiviert] = True) Then Return (-2) ; erzeugt den Graphen mit den Voreinstellungen $MG_aGraph[$iGraph][0][$MG_a_bGraph_aktiviert] = True $MG_aGraph[$iGraph][0][$MG_a_hGUI] = $hGUI $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] = $iX_Pos $MG_aGraph[$iGraph][0][$MG_a_iY_Pos] = $iY_Pos $MG_aGraph[$iGraph][0][$MG_a_iBreite] = $iBreite $MG_aGraph[$iGraph][0][$MG_a_iHoehe] = $iHoehe $MG_aGraph[$iGraph][0][$MG_a_hGraphic] = _GDIPlus_GraphicsCreateFromHWND ($hGUI) $MG_aGraph[$iGraph][0][$MG_a_hBitmap] = _GDIPlus_BitmapCreateFromGraphics ($iBreite, $iHoehe, $MG_aGraph[$iGraph][0][$MG_a_hGraphic]) $MG_aGraph[$iGraph][0][$MG_a_hBuffer] = _GDIPlus_ImageGetGraphicsContext ($MG_aGraph[$iGraph][0][$MG_a_hBitmap]) $MG_aGraph[$iGraph][0][$MG_a_iAufloesung] = $iBreite $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse] = $iBreite / $MG_aGraph[$iGraph][0][$MG_a_iAufloesung] $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung] = Ceiling($iBreite - $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse]) $MG_aGraph[$iGraph][0][$MG_a_iY_min] = 0 $MG_aGraph[$iGraph][0][$MG_a_iY_max] = 100 $MG_aGraph[$iGraph][0][$MG_a_iWertebereich] = Abs($MG_aGraph[$iGraph][0][$MG_a_iY_max] - $MG_aGraph[$iGraph][0][$MG_a_iY_min]) $MG_aGraph[$iGraph][0][$MG_a_fWertaufloesung] = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iWertebereich] $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe] = 0xFFFFFF $MG_aGraph[$iGraph][0][$MG_a_bRahmen] = True $MG_aGraph[$iGraph][0][$MG_a_vRahmenfarbe] = 0x000000 $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] = 1 $MG_aGraph[$iGraph][0][$MG_a_hRahmen] = GUICtrlCreateLabel ("", $iX_Pos - 1, $iY_Pos - 1, $iBreite + 2, $iHoehe + 2) $MG_aGraph[$iGraph][0][$MG_a_bHauptgitter_aktiviert] = True $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] = 50 $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] = 50 $MG_aGraph[$iGraph][0][$MG_a_vHauptgitter_farbe] = 0x000000 $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_breite] = 1 $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Transparenz] = 180 $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] = 0 $MG_aGraph[$iGraph][0][$MG_a_bHilfsgitter_aktiviert] = True $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] = 10 $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y] = 10 $MG_aGraph[$iGraph][0][$MG_a_vHilfsgitter_farbe] = 0x000000 $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_breite] = 1 $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Transparenz] = 220 $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] = 0 $MG_aGraph[$iGraph][0][$MG_a_iRendermodus] = 2 $MG_aGraph[$iGraph][0][$MG_a_iPlottfrequenz] = 1 $MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] = 1 $MG_aGraph[$iGraph][0][$MG_a_iPlottmodus] = 0 $MG_aGraph[$iGraph][0][$MG_a_iClearmodus] = 1 $MG_aGraph[$iGraph][0][$MG_a_bInterpolation] = True $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts_intervall] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links_intervall] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten_intervall] = 0 $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] = 0 ; berechnet den ARGB-Farbcode für die Gitterlinien Local $vFarbcode_Hauptgitterlinien = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Transparenz],2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vHauptgitter_farbe],6) Local $vFarbcode_Hilfsgitterlinien = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Transparenz],2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vHilfsgitter_farbe],6) ; ARGB-Farbcode übernehmen $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen] = _GDIPlus_PenCreate($vFarbcode_Hauptgitterlinien, $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_breite]) $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen] = _GDIPlus_PenCreate($vFarbcode_Hilfsgitterlinien, $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_breite]) ; die Farbe des Rahmen übernehmen GUICtrlSetBkColor ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $MG_aGraph[$iGraph][0][$MG_a_vRahmenfarbe]) GUICtrlSetState ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $GUI_SHOW) GUICtrlSetState ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $GUI_DISABLE) ; den Rahmen fest andocken GUICtrlSetResizing ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $GUI_DOCKALL) ; Antialiasing (Kantenglättung) übernehmen und den Zeichenbereich leeren _GDIPlus_GraphicsSetSmoothingMode ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], $MG_aGraph[$iGraph][0][$MG_a_iRendermodus]) _GDIPlus_GraphicsClear ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) ; Grundeinstellung der einzelnen Kanäle For $iKanal = 1 To $MG_iMax_Anzahl_Kanaele Step 1 $MG_aGraph[$iGraph][$iKanal][$MG_k_bKanal_aktivieren] = False $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert] = "" $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = "" $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Transparenz] = 0 $MG_aGraph[$iGraph][$iKanal][$MG_k_vLinien_Farbe] = 0x0055FF $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Breite] = 1 $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen] = _GDIPlus_PenCreate(0xFF000000 + $MG_aGraph[$iGraph][$iKanal][$MG_k_vLinien_Farbe], $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Breite]) Next ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_erstellen ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_optionen_position ; Beschreibung ..: verschiebt einen Graphen in der GUI oder passt die Größe neu an ; Syntax.........: _MG_Graph_optionen_position ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe) ; ; Parameter .....: $hGUI - das GUI-handle, auf dem der Graph gezeichnet werden soll ; $iGraph - Graph-Index das verwendet werden soll (beginnend mit 1) ; $iX_Pos - X-Koordinate des Zeichenbereiches (linke, obere Ecke) ; $iY_Pos - Y-Koordinate des Zeichenbereiches (linke, obere Ecke) ; $iBreite - die Breite des Graphen ; $iHoehe - die Höhe des Graphen ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: Die Achsbeschriftungen müssen manuell aktualisiert werden, damit die neue Position übernommen wird ; ; ======================================================================================================================================================== Func _MG_Graph_optionen_position ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iBreite, $iHoehe) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; die alten Resourcen freigeben _GDIPlus_GraphicsDispose ($MG_aGraph[$iGraph][0][$MG_a_hGraphic]) _GDIPlus_GraphicsDispose ($MG_aGraph[$iGraph][0][$MG_a_hBuffer]) _GDIPlus_BitmapDispose ($MG_aGraph[$iGraph][0][$MG_a_hBitmap]) ; verschiebt den Graphen und passt die Einstellungen an $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] = $iX_Pos $MG_aGraph[$iGraph][0][$MG_a_iY_Pos] = $iY_Pos $MG_aGraph[$iGraph][0][$MG_a_iBreite] = $iBreite $MG_aGraph[$iGraph][0][$MG_a_iHoehe] = $iHoehe $MG_aGraph[$iGraph][0][$MG_a_hGraphic] = _GDIPlus_GraphicsCreateFromHWND ($hGUI) $MG_aGraph[$iGraph][0][$MG_a_hBitmap] = _GDIPlus_BitmapCreateFromGraphics ($iBreite, $iHoehe, $MG_aGraph[$iGraph][0][$MG_a_hGraphic]) $MG_aGraph[$iGraph][0][$MG_a_hBuffer] = _GDIPlus_ImageGetGraphicsContext ($MG_aGraph[$iGraph][0][$MG_a_hBitmap]) $MG_aGraph[$iGraph][0][$MG_a_iAufloesung] = $iBreite $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse] = $iBreite / $MG_aGraph[$iGraph][0][$MG_a_iAufloesung] $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung] = Ceiling($iBreite - $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse]) $MG_aGraph[$iGraph][0][$MG_a_fWertaufloesung] = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iWertebereich] ; den Rahmen neu positionieren GUICtrlSetPos ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], _ ; handle zum Label $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite], _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos] - $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite], _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite] + (2*$MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite]), _ ; breite des Labels $MG_aGraph[$iGraph][0][$MG_a_iHoehe] + (2*$MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite])) ; höhe des Labels ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_optionen_position ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_optionen_allgemein ; Beschreibung ..: ändert die allgemeinen Einstellungen des Graphen ; Syntax.........: _MG_Graph_optionen_allgemein ($iGraph, $iAufloesung, $iY_min, $iY_max, $vHintergrundfarbe, $iRendermodus) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $iAufloesung - Auflösung bzw. horizontale Skalierung: Ist die Anzahl der Werte, die dargestellt werden. ; Wenn die Auflösung gleich die Breite des Graphen ist, dann wird pro Pixel ein Wert dargestellt. ; $iY_min - der kleinste Wert, der im Graph dargestellt werden kann ; $iY_max - der größte Wert, der im Graph dargestellt werden kann ; $vHintergrundfarbe - die Hintergrundfarbe (RGB) des Graphen in Hex-Darstellung (z.B. für Weiß: 0xFFFFFF) ; $iRendermodus - Antialiasing (Kantenglättung) ; | 0 keine Glättung ; | 1 Glättung mit 8 X 4 Rechteckfilter ; | 2 Glättung mit 8 X 8 kubischem Filter ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_optionen_allgemein ($iGraph, $iAufloesung, $iY_min, $iY_max, $vHintergrundfarbe, $iRendermodus) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; neue Einstellungen übernehmen $MG_aGraph[$iGraph][0][$MG_a_iAufloesung] = $iAufloesung $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse] = $MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iAufloesung] $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung] = Ceiling($MG_aGraph[$iGraph][0][$MG_a_iBreite] - $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse]) $MG_aGraph[$iGraph][0][$MG_a_iY_min] = $iY_min $MG_aGraph[$iGraph][0][$MG_a_iY_max] = $iY_max $MG_aGraph[$iGraph][0][$MG_a_iWertebereich] = Abs($iY_max - $iY_min) $MG_aGraph[$iGraph][0][$MG_a_fWertaufloesung] = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iWertebereich] $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe] = $vHintergrundfarbe $MG_aGraph[$iGraph][0][$MG_a_iRendermodus] = $iRendermodus ; Antialiasing (Kantenglättung) übernehmen und den Zeichenbereich leeren _GDIPlus_GraphicsSetSmoothingMode ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], $MG_aGraph[$iGraph][0][$MG_a_iRendermodus]) _GDIPlus_GraphicsClear ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_optionen_allgemein ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_optionen_Rahmen ; Beschreibung ..: ändert die Rahmen-Einstellungen des Graphen ; Syntax.........: _MG_Graph_optionen_Rahmen ($iGraph, $bAnzeigen, $vRahmenfarbe, $iRahmenbreite) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $bAnzeigen - aktiviert/deaktiviert den Rahmen ; | True Rahmen anzeigen ; | False Rahmen nicht anzeigen ; ; $vRahmenfarbe - die Farbe (RGB) des Rahmen in Hex-Darstellung (z.B. für Schwarz: 0x000000) ; $iRahmenbreite - die Breite des Rahmens (in Pixeln) ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: die Änderung der Rahmenbreite verschiebt oder ändert den Zeichenbereich nicht. Der Rahmen dehnt sich demnach nach außen aus. ; ; ======================================================================================================================================================== Func _MG_Graph_optionen_Rahmen ($iGraph, $bAnzeigen, $vRahmenfarbe, $iRahmenbreite) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; neue Einstellungen übernehmen $MG_aGraph[$iGraph][0][$MG_a_bRahmen] = $bAnzeigen $MG_aGraph[$iGraph][0][$MG_a_vRahmenfarbe] = $vRahmenfarbe $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] = $iRahmenbreite ; verschiebt den Rahmen mittig zum Zeichenbereich If ($bAnzeigen = True) Then GUICtrlSetPos ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], _ ; handle zum Label $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - $iRahmenbreite, _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos] - $iRahmenbreite, _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite] + (2*$iRahmenbreite), _ ; breite des Labels $MG_aGraph[$iGraph][0][$MG_a_iHoehe] + (2*$iRahmenbreite)) ; höhe des Labels ; Rahmenfarbe übernehmen GUICtrlSetBkColor ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $vRahmenfarbe) GUICtrlSetState ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $GUI_SHOW) GUICtrlSetState ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $GUI_DISABLE) Else ; Rahmen ausblenden, wenn er deaktiviert wird GUICtrlSetState ($MG_aGraph[$iGraph][0][$MG_a_hRahmen], $GUI_HIDE) EndIf ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_optionen_Rahmen ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_optionen_Hauptgitterlinien ; Beschreibung ..: ändert die Einstellungen der Hauptgitterlinien im Graphen ; Syntax.........: _MG_Graph_optionen_Hauptgitterlinien ($iGraph, $bHauptgitter_aktiviert, $iHauptgitter_abstand_X, $iHauptgitter_abstand_Y, $iHauptgitter_breite, $vHauptgitter_farbe, $iHauptgitter_Transparenz) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $bHauptgitter_aktiviert - aktiviert/deaktiviert die Hauptgitterlinien ; | True Hauptgitterlinien anzeigen ; | False Hauptgitterlinien nicht anzeigen ; ; $iHauptgitter_abstand_X - der horizontale Abstand zwischen den Hauptgitterlinien ; $iHauptgitter_abstand_Y - der vertikale Abstand zwischen den Hauptgitterlinien ; $iHauptgitter_breite - die Linienbreite des Gitters (in Pixeln) ; $vHauptgitter_farbe - die Farbe (RGB) des Rahmen in Hex-Darstellung (z.B. für Dunkelgrau: 0x777777) ; $iHauptgitter_Transparenz - die verwendete Transparenz der Hauptgitterlinien (0 bis 255) ; | 0 keine Transparenz ; | 255 unsichtbar ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_optionen_Hauptgitterlinien ($iGraph, $bHauptgitter_aktiviert, $iHauptgitter_abstand_X, $iHauptgitter_abstand_Y, $iHauptgitter_breite, $vHauptgitter_farbe, $iHauptgitter_Transparenz) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; neue Einstellungen übernehmen $MG_aGraph[$iGraph][0][$MG_a_bHauptgitter_aktiviert] = $bHauptgitter_aktiviert $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] = $iHauptgitter_abstand_X $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] = $iHauptgitter_abstand_Y $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_breite] = $iHauptgitter_breite $MG_aGraph[$iGraph][0][$MG_a_vHauptgitter_farbe] = $vHauptgitter_farbe $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Transparenz] = $iHauptgitter_Transparenz ; den alten "Zeichenstift" löschen und den neuen erstellen Local $vFarbcode = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Transparenz],2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vHauptgitter_farbe],6) _GDIPlus_PenDispose($MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen] = _GDIPlus_PenCreate($vFarbcode, $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_breite]) ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_optionen_Hauptgitterlinien ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_optionen_Hilfsgitterlinien ; Beschreibung ..: ändert die Einstellungen der Hilfsgitterlinien im Graphen ; Syntax.........: _MG_Graph_optionen_Hilfsgitterlinien ($iGraph, $bHilfsgitter_aktiviert, $iHilfsgitter_abstand_X, $iHilfsgitter_abstand_Y, $iHilfsgitter_breite, $vHilfsgitter_farbe, $iHilfsgitter_Transparenz) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $bHilfsgitter_aktiviert - aktiviert/deaktiviert die Hilfsgitterlinien ; | True Hilfsgitterlinien anzeigen ; | False Hilfsgitterlinien nicht anzeigen ; ; $iHilfsgitter_abstand_X - der horizontale Abstand zwischen den Hilfsgitterlinien ; $iHilfsgitter_abstand_Y - der vertikale Abstand zwischen den Hilfsgitterlinien ; $iHilfsgitter_breite - die Linienbreite des Gitters (in Pixeln) ; $vHilfsgitter_farbe - die Farbe (RGB) des Rahmen in Hex-Darstellung (z.B. für Grau: 0x777777) ; $iHilfsgitter_Transparenz - die verwendete Transparenz der Hilfsgitterlinien (0 bis 255) ; | 0 keine Transparenz ; | 255 unsichtbar ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_optionen_Hilfsgitterlinien ($iGraph, $bHilfsgitter_aktiviert, $iHilfsgitter_abstand_X, $iHilfsgitter_abstand_Y, $iHilfsgitter_breite, $vHilfsgitter_farbe, $iHilfsgitter_Transparenz) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; neue Einstellungen übernehmen $MG_aGraph[$iGraph][0][$MG_a_bHilfsgitter_aktiviert] = $bHilfsgitter_aktiviert $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] = $iHilfsgitter_abstand_X $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y] = $iHilfsgitter_abstand_Y $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_breite] = $iHilfsgitter_breite $MG_aGraph[$iGraph][0][$MG_a_vHilfsgitter_farbe] = $vHilfsgitter_farbe $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Transparenz] = $iHilfsgitter_Transparenz ; den alten "Zeichenstift" löschen und den neuen erstellen Local $vFarbcode = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Transparenz],2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vHilfsgitter_farbe],6) _GDIPlus_PenDispose($MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen] = _GDIPlus_PenCreate($vFarbcode, $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_breite]) ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_optionen_Hilfsgitterlinien ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_optionen_Plottmodus ; Beschreibung ..: ändert die Plott-Einstellungen des Graphen ; Syntax.........: _MG_Graph_optionen_Plottmodus ($iGraph, $iPlottmodus, $iPlottfrequenz, $iClearmodus, $bInterpolation) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $iPlottmodus - die grundsätzliche Darstellungsart, der zu plottenden Werte ; | 0 stehender Graph: Werte werden von links nach rechts gezeichnet ; | 1 bewegter Graph: der gesamte Graph "scrollt" kontinuierlich von rechts nach links ; ; $iPlottfrequenz - ist die Anzahl der Plottvorgänge (einzelne Werte), bevor der Graph in der GUI aktualisiert wird. ; | 0 der Graph wird erst aktualisiert, wenn der komplette Bildbereich geplottet wurde. (es werden so viele Werte geplottet, wie der Graph breit ist) ; | >0 je höher der Wert, desto mehr Werte können pro Sekunde dargestellt werden ; ; $iClearmodus - die "Reinigungsmethode" des Graphen. Diese Option wird nur angewendet, wenn der Plottmodus 0 ist. ; | 0 keine Reinigung - nach einem kompletten Bilddurchlauf werden keine alten Werte gelöscht. (es wird dann einfach überzeichnet) ; | 1 partielle Reinigung - nach einem kompletten Bilddurchlauf werden die alten (geplotteten) Werte durch neue überschrieben ; | 2 komplette Reinigung - nach einem kompletten Bilddurchlauf wird der Graphinhalt gelöscht ; ; $bInterpolation - aktiviert/deaktiviert die Interpolation der geplotteten Werte ; | True Interpolation aktivieren ; | False Interpolation deaktivieren ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: Die aktivierte Interpolation ermöglicht einen schnelleren Plottvorgang, da die gezeichnete Linie direkt von Punkt zu Punkt verbunden wird. ; Wird die Interpolation deaktiviert, so werden nur horizontale und vertikale Linien gezeichnet. In diesem Fall werden meistens 2 Zeichenvorgänge ; zwischen 2 Punkten benötigt. ; ; Um möglichst viele Werte pro Sekunde zu plotten, sollte man den Plottmodus auf 0 und den Clearmodus auf 2 setzen. ; Dadurch kommt Darstellung einem Oszilloskop sehr nahe. ; ; ======================================================================================================================================================== Func _MG_Graph_optionen_Plottmodus ($iGraph, $iPlottmodus, $iPlottfrequenz, $iClearmodus, $bInterpolation) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; neue Einstellungen übernehmen $MG_aGraph[$iGraph][0][$MG_a_iPlottfrequenz] = $iPlottfrequenz $MG_aGraph[$iGraph][0][$MG_a_iPlottmodus] = $iPlottmodus $MG_aGraph[$iGraph][0][$MG_a_iClearmodus] = $iClearmodus $MG_aGraph[$iGraph][0][$MG_a_bInterpolation] = $bInterpolation ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_optionen_Plottmodus ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Kanal_optionen ; Beschreibung ..: ändert die Kanal-Einstellungen des Graphen ; Syntax.........: _MG_Kanal_optionen ($iGraph, $iKanal, $bKanal_aktivieren, $iLinien_Breite = 1, $vLinien_Farbe = 0xCCCCCC, $iLinien_Transparenz = 0) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $iKanal - Kanal-Index, auf dem sich die Einstellungen beziehen ; $bKanal_aktivieren - aktiviert/deaktiviert die Darstellung des Kanals im Graphen ; | True Kanal aktivieren ; | False Kanal deaktivieren ; ; $iLinien_Breite - die Breite der geplotteten Linie (in Pixeln) ; $vLinien_Farbe - die Farbe (RGB) der Linie in Hex-Darstellung (z.B. für Dunkelgrau: 0xCCCCCC) ; $iLinien_Transparenz - die verwendete Transparenz der Linie (0 bis 255) ; | 0 keine Transparenz ; | 255 unsichtbar ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Kanal-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: Je mehr Kanäle geplottet werden, desto langsamer wird die Geschwindigkeit des Graphen. ; ; ======================================================================================================================================================== Func _MG_Kanal_optionen ($iGraph, $iKanal, $bKanal_aktivieren, $iLinien_Breite = 1, $vLinien_Farbe = 0xCCCCCC, $iLinien_Transparenz = 0) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Kanal-Index außerhalb des gültigen Bereichs liegt If ($iKanal > $MG_iMax_Anzahl_Kanaele) OR ($iKanal <= 0) Then Return (-2) ; neue Einstellungen übernehmen $MG_aGraph[$iGraph][$iKanal][$MG_k_bKanal_aktivieren] = $bKanal_aktivieren $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Breite] = $iLinien_Breite $MG_aGraph[$iGraph][$iKanal][$MG_k_vLinien_Farbe] = $vLinien_Farbe $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Transparenz] = $iLinien_Transparenz ; den alten "Zeichenstift" löschen und den neuen erstellen Local $vFarbcode = "0x" & Hex(255 - $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Transparenz],2) & Hex($MG_aGraph[$iGraph][$iKanal][$MG_k_vLinien_Farbe],6) _GDIPlus_PenDispose($MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen] = _GDIPlus_PenCreate($vFarbcode, $MG_aGraph[$iGraph][$iKanal][$MG_k_iLinien_Breite]) ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Kanal_optionen ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_initialisieren ; Beschreibung ..: plottet den Graphen erstmalig in der GUI ; Syntax.........: _MG_Graph_initialisieren ($iGraph) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: Diese Funktion sollte verwendet werden, nachdem der Graph erstellt und konfiguriert wurde. Es dient nur zur sauberen Darstellung ; und muss daher nicht zwangsweise verwendet werden. Wird diese Funktion nicht verwendet, so wird der Graph erst sichtbar, wenn mit dem ; Plottvorgang begonnen wurde. (ggf. kann es sein, das solange nur der Rahmen sichtbar ist) ; ; ======================================================================================================================================================== Func _MG_Graph_initialisieren ($iGraph) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; die Gitterlinien plotten und anschließend den Graphen in der GUI darstellen _GDIPlus_GraphicsClear ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) _MG_Graph_Hauptgitterlinien_plotten($iGraph, 0) _MG_Graph_Hilfsgitterlinien_plotten($iGraph, 0) _MG_Graph_updaten($iGraph) ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_initialisieren ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Wert_setzen ; Beschreibung ..: legt den neuen Wert für den nächsten Plottvorgang fest ; Syntax.........: _MG_Wert_setzen ($iGraph, $iKanal, $fWert) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $iKanal - Kanal-Index, auf dem sich die Einstellungen beziehen ; $fWert - der Wert, der beim nächsten Plottvorgang dargestellt werden soll ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Kanal-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Wert_setzen ($iGraph, $iKanal, $fWert) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Kanal-Index außerhalb des gültigen Bereichs liegt If ($iKanal > $MG_iMax_Anzahl_Kanaele) OR ($iKanal <= 0) Then Return (-2) ; Berechnung der vertikalen Position des Wertes Local $fWert_neu = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - (($fWert - $MG_aGraph[$iGraph][0][$MG_a_iY_min])* $MG_aGraph[$iGraph][0][$MG_a_fWertaufloesung]) ; den letzten Wert und den neuen Wert speichern If ($MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = "") Then $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = $fWert_neu $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert] = $fWert_neu ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Wert_setzen ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_updaten ; Beschreibung ..: zeichnet den Graph in die GUI bzw. aktualisiert die Darstellung ; Syntax.........: _MG_Graph_updaten ($iGraph) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: Es werden keine Werte geplottet. Es wird lediglich nur die Darstellung in der GUI aktualisiert. ; ; ======================================================================================================================================================== Func _MG_Graph_updaten ($iGraph) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; den Graph in die GUI zeichnen _GDIPlus_GraphicsDrawImageRect ($MG_aGraph[$iGraph][0][$MG_a_hGraphic], _ ; handle zum Graphic-Objekt $MG_aGraph[$iGraph][0][$MG_a_hBitmap], _ ; handle zum Bitmap-Objekt $MG_aGraph[$iGraph][0][$MG_a_iX_Pos], _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos], _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; die Breite des Zeichenbereiches $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Höhe des Zeichenbereiches ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_updaten ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_clear ; Beschreibung ..: löscht die aktuell geplotteten Werte ; Syntax.........: _MG_Graph_clear ($iGraph) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: Es werden dabei keine Einstellungen am Graphen verändert ; ; ======================================================================================================================================================== Func _MG_Graph_clear ($iGraph) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; die aktuelle Position auf Null setzen, die geplotteten Werte löschen und die Gitterlinien neu zeichnen $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] = 0 _GDIPlus_GraphicsClear($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) _MG_Graph_Hauptgitterlinien_plotten($iGraph, 0) _MG_Graph_Hilfsgitterlinien_plotten($iGraph, 0) ; die Plottwerte der einzelnen Kanäle zurücksetzen For $iKanal = 1 To $MG_iMax_Anzahl_Kanaele Step 1 $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert] = "" $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = "" Next ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_clear ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_Achse_links ; Beschreibung ..: erzeugt eine Achsbeschriftung auf der linken Seite (Y-Achse), die sich an den horizontalen Hauptgitterlinien richtet ; Syntax.........: _MG_Graph_Achse_links ($iGraph, $bAchse_anzeigen = True, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%", $vSchriftfarbe = 0x000000, $vHintergrundfarbe = Default, $fSchriftgroesse = 8.5, $iLabelbreite = 60, $fIntervall = 1) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $bAchse_anzeigen - aktiviert/deaktiviert die Beschriftung der linken Achse ; | True Achsbeschriftung aktivieren ; | False Achsbeschriftung deaktivieren ; ; $fMin_Wert - der unterste Wert, der angezeigt werden kann ; $fMax_Wert - der oberste Wert, der angezeigt werden kann ; $iNachkommastellen - die Anzahl der Nachkommastellen, die angezeigt werden sollen (Nachkommastellen werden gerundet) ; $sEinheit - die Einheit die angezeigt werden soll (z.B. " sek", " %", " KG", ....) ; $vSchriftfarbe - die Farbe (RGB) der Schrift in Hex-Darstellung (z.B. für Blau: 0x0000FF) ; $vHintergrundfarbe - die Hintergrund (RGB) der Beschriftung in Hex-Darstellung (oder 'Default', wenn keine Hintergrundfarbe verwendet werden soll) ; $fSchriftgroesse - die Schriftgröße (Standard 9.0) ; $iLabelbreite - die Breite, die für jede Beschriftungseinheit reserviert wird (50 bis 70 sollte in der Regel ausreichen) ; $fIntervall - Faktor (mindestens >= 0.1): vertikaler Abstandsfaktor zwischen den Beschriftungen im Bezug auf die Hauptgitterlinien (siehe Bemerkungen) ; ; Rückgabewerte .: Erfolg | >0 gibt die Anzahl der Beschriftungen der linken Y-Achse zurück ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Abstand der Hauptgitterlinien wurde zu klein gewählt ; ; Autor .........: SBond ; Bemerkungen ...: Beispiele für die Intervalle, mit der Annahme, dass 5 vertikale Hauptgitterlinien im Graphen sichtbar sind: ; ; Intervall = 1: neben jeder Hauptgitterlinie wird eine Beschriftung angezeigt (insgesamt 5) ; Intervall = 2: neben jeder zweiten Hauptgitterlinie wird eine Beschriftung angezeigt (insgesamt 3) ; Intervall = 0.5: neben jeder Hauptgitterlinie wird eine Beschriftung angezeigt und zwischen den Hauptgitterlinien wird eine Beschriftung angezeigt (insgesamt 10) ; ; ======================================================================================================================================================== Func _MG_Graph_Achse_links ($iGraph, $bAchse_anzeigen = True, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%", $vSchriftfarbe = 0x000000, $vHintergrundfarbe = Default, $fSchriftgroesse = 9.0, $iLabelbreite = 60, $fIntervall = 1) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Abstand der Hauptgitterlinien zu klein gewählt wurde If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] < 1) Then Return (-2) ; begrenzt den Intervall auf min. 0.1 If ($fIntervall < 0.1) Then $fIntervall = 0.1 ; alte Achsbeschriftung löschen, sofern welche vorhanden sind If ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] <> 0) Then For $i = 0 to $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] Step 1 GUICtrlDelete (Eval("_MG_Graph_Achse_links" & $iGraph & $i)) GUICtrlDelete (Eval("_MG_Graph_Achse_links_Strich" & $iGraph & $i)) Next $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] = 0 EndIf ; Achsbeschriftungen erzeugen, wenn die Option aktiviert wurde If ($bAchse_anzeigen = True) Then ; diverse Vorberechnungen Local $iLabelhoehe = $fSchriftgroesse + 2 Local $fAnzahl_Hauptgitterlinien = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] Local $fAbstand = $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] Local $iX_Pos_Strich = $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] - 8 Local $iX_Pos_Beschriftung = $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - ($iLabelbreite + $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] + 8) Local $fWertebereich = $fMax_Wert - $fMin_Wert Local $fWertdifferenz = $fWertebereich / $fAnzahl_Hauptgitterlinien Local $iCounter = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links_intervall] = $fIntervall ; Anzahl und Abstand der Beschriftungen berechnen und anschließend anzeigen For $i = 0 to $fAnzahl_Hauptgitterlinien Step $fIntervall $iCounter += 1 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] += 1 Local $iY_Pos_Strich = ($MG_aGraph[$iGraph][0][$MG_a_iHoehe] + $MG_aGraph[$iGraph][0][$MG_a_iY_Pos]) - ($fAbstand*$i) - 12 Local $iY_Pos_Beschriftung = ($MG_aGraph[$iGraph][0][$MG_a_iHoehe] + $MG_aGraph[$iGraph][0][$MG_a_iY_Pos]) - ($fAbstand*$i) - ($iLabelhoehe/2) Local $fWert = $fMin_Wert + ($i*$fWertdifferenz) Local $vBeschriftung = StringFormat("%." & $iNachkommastellen & "f", $fWert) & $sEinheit Assign ("_MG_Graph_Achse_links_Strich" & $iGraph & $iCounter, GUICtrlCreateLabel("_", $iX_Pos_Strich, $iY_Pos_Strich, 8, 14, BitOR($SS_CENTERIMAGE, $SS_RIGHT)),2) GUICtrlSetColor (Eval("_MG_Graph_Achse_links_Strich" & $iGraph & $iCounter), $vSchriftfarbe) GUICtrlSetBkColor (Eval("_MG_Graph_Achse_links_Strich" & $iGraph & $iCounter), $vHintergrundfarbe) GUICtrlSetResizing (Eval("_MG_Graph_Achse_links_Strich" & $iGraph & $iCounter), $GUI_DOCKALL) Assign ("_MG_Graph_Achse_links" & $iGraph & $iCounter, GUICtrlCreateLabel($vBeschriftung, $iX_Pos_Beschriftung, $iY_Pos_Beschriftung, $iLabelbreite, $iLabelhoehe, BitOR($SS_CENTERIMAGE, $SS_RIGHT)),2) GUICtrlSetColor (Eval("_MG_Graph_Achse_links" & $iGraph & $iCounter), $vSchriftfarbe) GUICtrlSetBkColor (Eval("_MG_Graph_Achse_links" & $iGraph & $iCounter), $vHintergrundfarbe) GUICtrlSetFont (Eval("_MG_Graph_Achse_links" & $iGraph & $iCounter), $fSchriftgroesse) GUICtrlSetResizing (Eval("_MG_Graph_Achse_links" & $iGraph & $iCounter), $GUI_DOCKALL) Next EndIf ; Rückgabewert: gibt die Anzahl der Beschriftungen der linken Y-Achse zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links]) EndFunc ;==> _MG_Graph_Achse_links ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_Achse_rechts ; Beschreibung ..: erzeugt eine Achsbeschriftung auf der rechten Seite (Y-Achse), die sich an den horizontalen Hauptgitterlinien richtet ; Syntax.........: _MG_Graph_Achse_rechts ($iGraph, $bAchse_anzeigen = True, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%", $vSchriftfarbe = 0x000000, $vHintergrundfarbe = Default, $fSchriftgroesse = 8.5, $iLabelbreite = 60, $fIntervall = 1) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $bAchse_anzeigen - aktiviert/deaktiviert die Beschriftung der rechten Achse ; | True Achsbeschriftung aktivieren ; | False Achsbeschriftung deaktivieren ; ; $fMin_Wert - der unterste Wert, der angezeigt werden kann ; $fMax_Wert - der oberste Wert, der angezeigt werden kann ; $iNachkommastellen - die Anzahl der Nachkommastellen, die angezeigt werden sollen (Nachkommastellen werden gerundet) ; $sEinheit - die Einheit die angezeigt werden soll (z.B. " sek", " %", " KG", ....) ; $vSchriftfarbe - die Farbe (RGB) der Schrift in Hex-Darstellung (z.B. für Blau: 0x0000FF) ; $vHintergrundfarbe - die Hintergrund (RGB) der Beschriftung in Hex-Darstellung (oder 'Default', wenn keine Hintergrundfarbe verwendet werden soll) ; $fSchriftgroesse - die Schriftgröße (Standard 9.0) ; $iLabelbreite - die Breite, die für jede Beschriftungseinheit reserviert wird (50 bis 70 sollte in der Regel ausreichen) ; $fIntervall - Faktor (mindestens >= 0.1): vertikaler Abstandsfaktor zwischen den Beschriftungen im Bezug auf die Hauptgitterlinien (siehe Bemerkungen) ; ; Rückgabewerte .: Erfolg | >0 gibt die Anzahl der Beschriftungen der rechten Y-Achse zurück ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Abstand der Hauptgitterlinien wurde zu klein gewählt ; ; Autor .........: SBond ; Bemerkungen ...: Beispiele für die Intervalle, mit der Annahme, dass 5 vertikale Hauptgitterlinien im Graphen sichtbar sind: ; ; Intervall = 1: neben jeder Hauptgitterlinie wird eine Beschriftung angezeigt (insgesamt 5) ; Intervall = 2: neben jeder zweiten Hauptgitterlinie wird eine Beschriftung angezeigt (insgesamt 3) ; Intervall = 0.5: neben jeder Hauptgitterlinie wird eine Beschriftung angezeigt und zwischen den Hauptgitterlinien wird eine Beschriftung angezeigt (insgesamt 10) ; ; ======================================================================================================================================================== Func _MG_Graph_Achse_rechts ($iGraph, $bAchse_anzeigen = True, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%", $vSchriftfarbe = 0x000000, $vHintergrundfarbe = Default, $fSchriftgroesse = 9.0, $iLabelbreite = 60, $fIntervall = 1) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Abstand der Hauptgitterlinien zu klein gewählt wurde If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] < 1) Then Return (-2) ; begrenzt den Intervall auf min. 0.1 If ($fIntervall < 0.1) Then $fIntervall = 0.1 ; alte Achsbeschriftung löschen, sofern welche vorhanden sind If ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] <> 0) Then For $i = 0 to $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] Step 1 GUICtrlDelete (Eval("_MG_Graph_Achse_rechts" & $iGraph & $i)) GUICtrlDelete (Eval("_MG_Graph_Achse_rechts_Strich" & $iGraph & $i)) Next $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] = 0 EndIf ; Achsbeschriftungen erzeugen, wenn die Option aktiviert wurde If ($bAchse_anzeigen = True) Then ; diverse Vorberechnungen Local $iLabelhoehe = $fSchriftgroesse + 2 Local $fAnzahl_Hauptgitterlinien = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] Local $fAbstand = $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] Local $iX_Pos_Strich = $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] + $MG_aGraph[$iGraph][0][$MG_a_iBreite] + $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] Local $iX_Pos_Beschriftung = $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] + $MG_aGraph[$iGraph][0][$MG_a_iBreite] + $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] + 10 Local $fWertebereich = $fMax_Wert - $fMin_Wert Local $fWertdifferenz = $fWertebereich / $fAnzahl_Hauptgitterlinien Local $iCounter = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts_intervall] = $fIntervall ; Anzahl und Abstand der Beschriftungen berechnen und anschließend anzeigen For $i = 0 to $fAnzahl_Hauptgitterlinien Step $fIntervall $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] += 1 $iCounter += 1 Local $iY_Pos_Strich = ($MG_aGraph[$iGraph][0][$MG_a_iHoehe] + $MG_aGraph[$iGraph][0][$MG_a_iY_Pos]) - ($fAbstand*$i) - 12 Local $iY_Pos_Beschriftung = ($MG_aGraph[$iGraph][0][$MG_a_iHoehe] + $MG_aGraph[$iGraph][0][$MG_a_iY_Pos]) - ($fAbstand*$i) - ($iLabelhoehe/2) Local $fWert = $fMin_Wert + ($i*$fWertdifferenz) Local $vBeschriftung = StringFormat("%." & $iNachkommastellen & "f", $fWert) & $sEinheit Assign ("_MG_Graph_Achse_rechts_Strich" & $iGraph & $iCounter, GUICtrlCreateLabel("_", $iX_Pos_Strich, $iY_Pos_Strich, 8, 14, BitOR($SS_CENTERIMAGE, $SS_LEFT)),2) GUICtrlSetColor (Eval("_MG_Graph_Achse_rechts_Strich" & $iGraph & $iCounter), $vSchriftfarbe) GUICtrlSetBkColor (Eval("_MG_Graph_Achse_rechts_Strich" & $iGraph & $iCounter), $vHintergrundfarbe) GUICtrlSetResizing (Eval("_MG_Graph_Achse_rechts_Strich" & $iGraph & $iCounter), $GUI_DOCKALL) Assign ("_MG_Graph_Achse_rechts" & $iGraph & $iCounter, GUICtrlCreateLabel($vBeschriftung, $iX_Pos_Beschriftung, $iY_Pos_Beschriftung, $iLabelbreite, $iLabelhoehe, BitOR($SS_CENTERIMAGE, $SS_LEFT)),2) GUICtrlSetColor (Eval("_MG_Graph_Achse_rechts" & $iGraph & $iCounter), $vSchriftfarbe) GUICtrlSetBkColor (Eval("_MG_Graph_Achse_rechts" & $iGraph & $iCounter), $vHintergrundfarbe) GUICtrlSetFont (Eval("_MG_Graph_Achse_rechts" & $iGraph & $iCounter), $fSchriftgroesse) GUICtrlSetResizing (Eval("_MG_Graph_Achse_rechts" & $iGraph & $iCounter), $GUI_DOCKALL) Next EndIf ; Rückgabewert: gibt die Anzahl der Beschriftungen der linken Y-Achse zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts]) EndFunc ;==> _MG_Graph_Achse_rechts ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_Achse_unten ; Beschreibung ..: erzeugt eine Achsbeschriftung auf der unteren Seite (X-Achse), die sich an den vertikalen Hauptgitterlinien richtet ; Syntax.........: _MG_Graph_Achse_unten ($iGraph, $bAchse_anzeigen = True, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%", $vSchriftfarbe = 0x000000, $vHintergrundfarbe = Default, $fSchriftgroesse = 8.5, $iLabelbreite = 60, $fIntervall = 1) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $bAchse_anzeigen - aktiviert/deaktiviert die Beschriftung der unteren Achse ; | True Achsbeschriftung aktivieren ; | False Achsbeschriftung deaktivieren ; ; $fMin_Wert - der unterste Wert, der angezeigt werden kann ; $fMax_Wert - der oberste Wert, der angezeigt werden kann ; $iNachkommastellen - die Anzahl der Nachkommastellen, die angezeigt werden sollen (Nachkommastellen werden gerundet) ; $sEinheit - die Einheit die angezeigt werden soll (z.B. " sek", " %", " KG", ....) ; $vSchriftfarbe - die Farbe (RGB) der Schrift in Hex-Darstellung (z.B. für Blau: 0x0000FF) ; $vHintergrundfarbe - die Hintergrund (RGB) der Beschriftung in Hex-Darstellung (oder 'Default', wenn keine Hintergrundfarbe verwendet werden soll) ; $fSchriftgroesse - die Schriftgröße (Standard 9.0) ; $iLabelbreite - die Breite, die für jede Beschriftungseinheit reserviert wird (50 bis 70 sollte in der Regel ausreichen) ; $fIntervall - Faktor (mindestens >= 0.1): vertikaler Abstandsfaktor zwischen den Beschriftungen im Bezug auf die Hauptgitterlinien (siehe Bemerkungen) ; ; Rückgabewerte .: Erfolg | >0 gibt die Anzahl der Beschriftungen der X-Achse zurück ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Abstand der Hauptgitterlinien wurde zu klein gewählt ; ; Autor .........: SBond ; Bemerkungen ...: Beispiele für die Intervalle, mit der Annahme, dass 5 vertikale Hauptgitterlinien im Graphen sichtbar sind: ; ; Intervall = 1: neben jeder Hauptgitterlinie wird eine Beschriftung angezeigt (insgesamt 5) ; Intervall = 2: neben jeder zweiten Hauptgitterlinie wird eine Beschriftung angezeigt (insgesamt 3) ; Intervall = 0.5: neben jeder Hauptgitterlinie wird eine Beschriftung angezeigt und zwischen den Hauptgitterlinien wird eine Beschriftung angezeigt (insgesamt 10) ; ; ======================================================================================================================================================== Func _MG_Graph_Achse_unten ($iGraph, $bAchse_anzeigen = True, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%", $vSchriftfarbe = 0x000000, $vHintergrundfarbe = Default, $fSchriftgroesse = 9.0, $iLabelbreite = 60, $fIntervall = 1) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Abstand der Hauptgitterlinien zu klein gewählt wurde If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] < 1) Then Return (-2) ; begrenzt den Intervall auf min. 0.1 If ($fIntervall < 0.1) Then $fIntervall = 0.1 ; alte Achsbeschriftung löschen, sofern welche vorhanden sind If ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] <> 0) Then For $i = 0 to $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] Step 1 GUICtrlDelete (Eval("_MG_Graph_Achse_unten" & $iGraph & $i)) GUICtrlDelete (Eval("_MG_Graph_Achse_unten_Strich" & $iGraph & $i)) Next $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] = 0 EndIf ; Achsbeschriftungen erzeugen, wenn die Option aktiviert wurde If ($bAchse_anzeigen = True) Then ; diverse Vorberechnungen Local $iLabelhoehe = $fSchriftgroesse + 2 Local $fAnzahl_Hauptgitterlinien = $MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] Local $fAbstand = $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] Local $iY_Pos_Strich = ($MG_aGraph[$iGraph][0][$MG_a_iY_Pos] + $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) + $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] Local $iY_Pos_Beschriftung = ($MG_aGraph[$iGraph][0][$MG_a_iY_Pos] + $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) + $MG_aGraph[$iGraph][0][$MG_a_iRahmenbreite] + 10 Local $fWertebereich = $fMax_Wert - $fMin_Wert Local $fWertdifferenz = $fWertebereich / $fAnzahl_Hauptgitterlinien Local $iCounter = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] = 0 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten_intervall] = $fIntervall ; Anzahl und Abstand der Beschriftungen berechnen und anschließend anzeigen For $i = 0 to $fAnzahl_Hauptgitterlinien Step $fIntervall $iCounter += 1 $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] += 1 ; die Achsenbeschriftung rechts anordnen, wenn der Scrollmodus (Plottmodus = 1) aktiviert wurde If ($MG_aGraph[$iGraph][0][$MG_a_iPlottmodus] = 1) Then Local $iX_Pos_Strich = $MG_aGraph[$iGraph][0][$MG_a_iBreite] + $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - ($fAbstand * $i) - 2 Local $iX_Pos_Beschriftung = $MG_aGraph[$iGraph][0][$MG_a_iBreite] + $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - ($fAbstand * $i) - ($iLabelbreite/2) Else ;ansonsten links anordnen Local $iX_Pos_Strich = $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] + $fAbstand * $i - 2 Local $iX_Pos_Beschriftung = $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] + $fAbstand * $i - ($iLabelbreite/2) EndIf Local $fWert = $fMin_Wert + ($i*$fWertdifferenz) Local $vBeschriftung = StringFormat("%." & $iNachkommastellen & "f", $fWert) & $sEinheit Assign ("_MG_Graph_Achse_unten_Strich" & $iGraph & $iCounter, GUICtrlCreateLabel("|", $iX_Pos_Strich, $iY_Pos_Strich, 4, 9, BitOR($SS_CENTERIMAGE, $SS_CENTER)),2) GUICtrlSetColor (Eval("_MG_Graph_Achse_unten_Strich" & $iGraph & $iCounter), $vSchriftfarbe) GUICtrlSetBkColor (Eval("_MG_Graph_Achse_unten_Strich" & $iGraph & $iCounter), $vHintergrundfarbe) GUICtrlSetFont (Eval("_MG_Graph_Achse_unten_Strich" & $iGraph & $iCounter), 9) GUICtrlSetResizing (Eval("_MG_Graph_Achse_unten_Strich" & $iGraph & $iCounter), $GUI_DOCKALL) Assign ("_MG_Graph_Achse_unten" & $iGraph & $iCounter, GUICtrlCreateLabel($vBeschriftung, $iX_Pos_Beschriftung, $iY_Pos_Beschriftung, $iLabelbreite, $iLabelhoehe, BitOR($SS_CENTERIMAGE, $SS_CENTER)),2) GUICtrlSetColor (Eval("_MG_Graph_Achse_unten" & $iGraph & $iCounter), $vSchriftfarbe) GUICtrlSetBkColor (Eval("_MG_Graph_Achse_unten" & $iGraph & $iCounter), $vHintergrundfarbe) GUICtrlSetFont (Eval("_MG_Graph_Achse_unten" & $iGraph & $iCounter), $fSchriftgroesse) GUICtrlSetResizing (Eval("_MG_Graph_Achse_unten" & $iGraph & $iCounter), $GUI_DOCKALL) Next EndIf ; Rückgabewert: gibt die Anzahl der Beschriftungen der X-Achse zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten]) EndFunc ;==> _MG_Graph_Achse_unten ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_Achse_unten_update ; Beschreibung ..: aktualisiert die Achsbeschriftung auf der unteren Seite (X-Achse) ; Syntax.........: _MG_Graph_Achse_unten_update ($iGraph, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%") ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $fMin_Wert - der unterste Wert, der angezeigt werden kann ; $fMax_Wert - der oberste Wert, der angezeigt werden kann ; $iNachkommastellen - die Anzahl der Nachkommastellen, die angezeigt werden sollen (Nachkommastellen werden gerundet) ; $sEinheit - die Einheit die angezeigt werden soll (z.B. " sek", " %", " KG", ....) ; ; Rückgabewerte .: Erfolg | >0 gibt die Anzahl der Beschriftungen der X-Achse zurück ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Abstand der Hauptgitterlinien wurde zu klein gewählt ; ; Autor .........: SBond ; Bemerkungen ...: Die Anzahl und Position der Beschriftungen werden dabei nicht verändert ; ; ======================================================================================================================================================== Func _MG_Graph_Achse_unten_update ($iGraph, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%") ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Abstand der Hauptgitterlinien zu klein gewählt wurde If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] < 1) Then Return (-2) ; diverse Vorberechnungen Local $fIntervall = $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten_intervall] Local $fAnzahl_Hauptgitterlinien = $MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] Local $fWertebereich = $fMax_Wert - $fMin_Wert Local $fWertdifferenz = ($fWertebereich * $fIntervall) / $fAnzahl_Hauptgitterlinien ; neue Einstellungen übernehmen For $i = 1 to $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten] Step 1 Local $fWert = $fMin_Wert + (($i-1)*$fWertdifferenz) Local $vBeschriftung = StringFormat("%." & $iNachkommastellen & "f", $fWert) & $sEinheit GUICtrlSetData (Eval("_MG_Graph_Achse_unten" & $iGraph & $i), $vBeschriftung) Next ; Rückgabewert: gibt die Anzahl der Beschriftungen der X-Achse zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_unten]) EndFunc ;==> _MG_Graph_Achse_unten_update ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_Achse_links_update ; Beschreibung ..: aktualisiert die Achsbeschriftung auf der linken Seite (Y-Achse) ; Syntax.........: _MG_Graph_Achse_links_update ($iGraph, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%") ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $fMin_Wert - der unterste Wert, der angezeigt werden kann ; $fMax_Wert - der oberste Wert, der angezeigt werden kann ; $iNachkommastellen - die Anzahl der Nachkommastellen, die angezeigt werden sollen (Nachkommastellen werden gerundet) ; $sEinheit - die Einheit die angezeigt werden soll (z.B. " sek", " %", " KG", ....) ; ; Rückgabewerte .: Erfolg | >0 gibt die Anzahl der Beschriftungen der linken Y-Achse zurück ; ; Fehler | -1 der Graph-Index liegt über dem eingestellten Limit (Anzahl der max. Graphen) ; | -2 der Abstand der Hauptgitterlinien wurde zu klein gewählt ; ; Autor .........: SBond ; Bemerkungen ...: Die Anzahl und Position der Beschriftungen werden dabei nicht verändert ; ; ======================================================================================================================================================== Func _MG_Graph_Achse_links_update ($iGraph, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%") ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Abstand der Hauptgitterlinien zu klein gewählt wurde If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] < 1) Then Return (-2) ; diverse Vorberechnungen Local $fIntervall = $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links_intervall] Local $fAnzahl_Hauptgitterlinien = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] Local $fWertebereich = $fMax_Wert - $fMin_Wert Local $fWertdifferenz = ($fWertebereich * $fIntervall) / $fAnzahl_Hauptgitterlinien ; neue Einstellungen übernehmen For $i = 1 to $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links] Step 1 Local $fWert = $fMin_Wert + (($i-1)*$fWertdifferenz) Local $vBeschriftung = StringFormat("%." & $iNachkommastellen & "f", $fWert) & $sEinheit GUICtrlSetData(Eval("_MG_Graph_Achse_links" & $iGraph & $i), $vBeschriftung) Next ; Rückgabewert: gibt die Anzahl der Beschriftungen der linken Y-Achse zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_links]) EndFunc ;==> _MG_Graph_Achse_links_update ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_Achse_rechts_update ; Beschreibung ..: aktualisiert die Achsbeschriftung auf der rechten Seite (Y-Achse) ; Syntax.........: _MG_Graph_Achse_rechts_update ($iGraph, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%") ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $fMin_Wert - der unterste Wert, der angezeigt werden kann ; $fMax_Wert - der oberste Wert, der angezeigt werden kann ; $iNachkommastellen - die Anzahl der Nachkommastellen, die angezeigt werden sollen (Nachkommastellen werden gerundet) ; $sEinheit - die Einheit die angezeigt werden soll (z.B. " sek", " %", " KG", ....) ; ; Rückgabewerte .: Erfolg | >0 gibt die Anzahl der Beschriftungen der rechten Y-Achse zurück ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Abstand der Hauptgitterlinien wurde zu klein gewählt ; ; Autor .........: SBond ; Bemerkungen ...: Die Anzahl und Position der Beschriftungen werden dabei nicht verändert ; ; ======================================================================================================================================================== Func _MG_Graph_Achse_rechts_update ($iGraph, $fMin_Wert = 0, $fMax_Wert = 100, $iNachkommastellen = 1, $sEinheit = "%") ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Abstand der Hauptgitterlinien zu klein gewählt wurde If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] < 1) Then Return (-2) ; diverse Vorberechnungen Local $fIntervall = $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts_intervall] Local $fAnzahl_Hauptgitterlinien = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] Local $fWertebereich = $fMax_Wert - $fMin_Wert Local $fWertdifferenz = ($fWertebereich * $fIntervall) / $fAnzahl_Hauptgitterlinien ; neue Einstellungen übernehmen For $i = 1 to $MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts] Step 1 Local $fWert = $fMin_Wert + (($i-1)*$fWertdifferenz) Local $vBeschriftung = StringFormat("%." & $iNachkommastellen & "f", $fWert) & $sEinheit GUICtrlSetData(Eval("_MG_Graph_Achse_rechts" & $iGraph & $i), $vBeschriftung) Next ; Rückgabewert: gibt die Anzahl der Beschriftungen der rechten Y-Achse zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iAchsbeschriftungen_rechts]) EndFunc ;==> _MG_Graph_Achse_rechts_update ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_plotten ; Beschreibung ..: plottet die neuen Werte in den Graphen und aktualisiert ggf. die Darstellung in der GUI (je nach Einstellungen) ; Syntax.........: _MG_Graph_plotten ($iGraph) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; ; Rückgabewerte .: Erfolg | >=0 gibt die aktuelle Plottposition zurück (max. Wert = Breite des Graphen) ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Graph ist deaktiviert ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_plotten ($iGraph) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Graph deaktiviert ist If ($MG_aGraph[$iGraph][0][$MG_a_bGraph_aktiviert] = False) Then Return (-2) ; ##################################################### Plottmodus 1: "stehender Graph" ##################################################### If ($MG_aGraph[$iGraph][0][$MG_a_iPlottmodus] = 0) Then ; Wenn Clearmodus = 1: löscht an der aktuellen Plottposition die alten Werte aus dem Graphen, bevor die neuen Werte geplottet werden If ($MG_aGraph[$iGraph][0][$MG_a_iClearmodus] = 1) Then ; den Löschbereich und die Füllfarbe definieren Local $hBrush_temp = _GDIPlus_BrushCreateSolid (0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) Local $iX_Pos = $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] + 2 Local $iBreite = $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse] + 2 ; den Löschbereich neu definieren, wenn sich die aktuelle Plottposition am Anfang des Graphen befindet If ($MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] <= 2) Then $iX_Pos = $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] - 1 $iBreite = $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse] + 4 EndIf ; löschen der alten geplotteten Werte im Löschbereich _GDIPlus_GraphicsFillRect($MG_aGraph[$iGraph][0][$MG_a_hBuffer],$iX_Pos, 0 ,$iBreite, $MG_aGraph[$iGraph][0][$MG_a_iHoehe], $hBrush_temp) ; Gitterlinien im Löschbereich neu zeichnen _MG_Graph_Hauptgitterlinien_plotten($iGraph, 1) _MG_Graph_Hilfsgitterlinien_plotten($iGraph, 1) ; die GDI+ Resourcen wieder freigeben _GDIPlus_BrushDispose ($hBrush_temp) EndIf ; die Werte der einzelnen Kanäle plotten For $iKanal = 1 To $MG_iMax_Anzahl_Kanaele Step 1 ; prüfen, welche Kanäle geplottet werden sollen If ($MG_aGraph[$iGraph][$iKanal][$MG_k_bKanal_aktivieren] = True) Then ; Werte plotten (interpoliert) If ($MG_aGraph[$iGraph][0][$MG_a_bInterpolation] = True) Then ; direkte Linie zwischen den Punkten zeichnen _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] - $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse], _ ; Position 1: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell], _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) ; handle zum Zeichenstift Else ; Werte plotten (nicht interpoliert) ; die horizontale Linie zeichen _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] - $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse], _ ; Position 1: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell], _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) ; handle zum Zeichenstift ; die vertikale Linie zeichen _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell], _ ; Position 1: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell], _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) ; handle zum Zeichenstift EndIf ; aktuellen Punkt für den nächsten Plottvorgang speichern $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert] EndIf Next ; ggf. die geplotteten Werte in der GUI darstellen If ($MG_aGraph[$iGraph][0][$MG_a_iPlottfrequenz] > 0) Then If ($MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] = $MG_aGraph[$iGraph][0][$MG_a_iPlottfrequenz]) Then _GDIPlus_GraphicsDrawImageRect ($MG_aGraph[$iGraph][0][$MG_a_hGraphic], _ ; handle zum Grafik-Objekt $MG_aGraph[$iGraph][0][$MG_a_hBitmap], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iX_Pos], _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos], _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; die Breite des Graphen $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Höhe des Graphen $MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] = 0 Else $MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] += 1 EndIf EndIf ; die geplotteten Werte in der GUI darstellen, sobald der Zeichenbereich komplett ist und die Plottposition wieder auf Null setzen If ($MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] > $MG_aGraph[$iGraph][0][$MG_a_iBreite]) Then $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] = 0 _GDIPlus_GraphicsDrawImageRect ($MG_aGraph[$iGraph][0][$MG_a_hGraphic], _ ; handle zum Grafik-Objekt $MG_aGraph[$iGraph][0][$MG_a_hBitmap], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iX_Pos], _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos], _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; die Breite des Graphen $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Höhe des Graphen ; Wenn Clearmodus = 2: löscht alle geplotteten Werte aus dem Buffer If ($MG_aGraph[$iGraph][0][$MG_a_iClearmodus] = 2) Then _GDIPlus_GraphicsClear ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) ; Gitterlinien neu zeichnen _MG_Graph_Hauptgitterlinien_plotten($iGraph, 0) _MG_Graph_Hilfsgitterlinien_plotten($iGraph, 0) EndIf ; die alten Werte der Kanäle löschen For $iKanal = 1 To $MG_iMax_Anzahl_Kanaele Step 1 ; prüfen, welche Kanäle aktiviert sind If ($MG_aGraph[$iGraph][$iKanal][$MG_k_bKanal_aktivieren] = True) Then $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = "" EndIf Next Else ; ...ansonsten die aktuelle Plottposition weiter verschieben $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] += $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse] EndIf ; ##################################################### Plottmodus 2: "bewegter Graph" ##################################################### ElseIf ($MG_aGraph[$iGraph][0][$MG_a_iPlottmodus] = 1) Then ; den zu verschiebenen Teil des Graphen kopieren Local $hVerschiebung = _GDIPlus_BitmapCloneArea($MG_aGraph[$iGraph][0][$MG_a_hBitmap], _ ; handle zum Bitmap-Objekt $MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse], _ ; X-Koordinate des Kopierbereiches (linke, obere Ecke) 0, _ ; Y-Koordinate des Kopierbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung], _ ; die Breite des Kopierbereiches $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Höhe des Kopierbereiches ; den Buffer komplett löschen _GDIPlus_GraphicsClear($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vHintergrundfarbe]) ; den kopierten Teil des Graphen in den Buffer schreiben _GDIPlus_GraphicsDrawImageRect($MG_aGraph[$iGraph][0][$MG_a_hBuffer], $hVerschiebung, 0, 0, $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung], $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Werte der einzelnen Kanäle plotten For $iKanal = 1 To $MG_iMax_Anzahl_Kanaele Step 1 ; prüfen, welche Kanäle geplottet werden sollen If ($MG_aGraph[$iGraph][$iKanal][$MG_k_bKanal_aktivieren] = True) Then ; Werte plotten (interpoliert) If ($MG_aGraph[$iGraph][0][$MG_a_bInterpolation] = True) Then ; direkte Linie zwischen den Punkten zeichnen _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung]-1, _ ; Position 1: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite]-1, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) ; handle zum Zeichenstift Else ; Werte plotten (nicht interpoliert) ; die horizontale Linie zeichen _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung]-1, _ ; Position 1: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite]-1, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) ; handle zum Zeichenstift ; die vertikale Linie zeichen _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iBreite]-1, _ ; Position 1: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert], _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite]-1, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) ; handle zum Zeichenstift EndIf ; aktuellen Punkt für den nächsten Plottvorgang speichern $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_letzter_Wert] = $MG_aGraph[$iGraph][$iKanal][$MG_k_fY_aktueller_Wert] EndIf Next ; ggf. Gitterlinien zeichnen _MG_Graph_Hauptgitterlinien_plotten($iGraph, 2) _MG_Graph_Hilfsgitterlinien_plotten($iGraph, 2) ; ggf. die geplotteten Werte in der GUI darstellen If ($MG_aGraph[$iGraph][0][$MG_a_iPlottfrequenz] > 0) Then If ($MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] = $MG_aGraph[$iGraph][0][$MG_a_iPlottfrequenz]) Then _GDIPlus_GraphicsDrawImageRect ($MG_aGraph[$iGraph][0][$MG_a_hGraphic], _ ; handle zum Grafik-Objekt $MG_aGraph[$iGraph][0][$MG_a_hBitmap], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iX_Pos], _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos], _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; die Breite des Graphen $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Höhe des Graphen $MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] = 1 Else $MG_aGraph[$iGraph][0][$MG_a_iPlott_Counter] += 1 EndIf EndIf ; die geplotteten Werte in der GUI darstellen, sobald der Zeichenbereich komplett ist und die Plottposition wieder auf Null setzen If ($MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] > $MG_aGraph[$iGraph][0][$MG_a_iBreite]) Then $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] = 0 _GDIPlus_GraphicsDrawImageRect ($MG_aGraph[$iGraph][0][$MG_a_hGraphic], _ ; handle zum Grafik-Objekt $MG_aGraph[$iGraph][0][$MG_a_hBitmap], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iX_Pos], _ ; X-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iY_Pos], _ ; Y-Koordinate des Zeichenbereiches (linke, obere Ecke) $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; die Breite des Graphen $MG_aGraph[$iGraph][0][$MG_a_iHoehe]) ; die Höhe des Graphen Else ; ...ansonsten die aktuelle Plottposition weiter verschieben --> dient in diesem Fall nur als Counter, da sich die Plottposition immer am Ende des Zeichenbereiches befindet $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] += int($MG_aGraph[$iGraph][0][$MG_a_fInkrement_groesse]) EndIf ; die GDI+ Resourcen wieder freigeben _GDIPlus_BitmapDispose($hVerschiebung) EndIf ; gibt die aktuelle Plottposition zurück Return ($MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell]) EndFunc ;==> _MG_Graph_plotten ; #INTERNAL_USE_ONLY# ;=================================================================================================================================== ; ; Name...........: _MG_Graph_Hauptgitterlinien_plotten ; Beschreibung ..: zeichnet die Hauptgitterlinien in den Graphen ein ; Syntax.........: _MG_Graph_Hauptgitterlinien_plotten ($iGraph, $iModus = 0) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $iModus - zeichnet die Hauptgitterlinien in bestimmten Bereichen ein ; | 0 zeichnet die Hauptgitterlinien in den gesamten Zeichenbereich des Graphen ; | 1 zeichnet die Hauptgitterlinien nur an der aktuellen Plottposition des Graphen ; | 2 zeichnet die Hauptgitterlinien nur an der letzen Plottposition des Graphen (für den Modus: "bewegter Graph") ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_Hauptgitterlinien_plotten ($iGraph, $iModus = 0) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; zeichnet die Hauptgitterlinien in den gesamten Zeichenbereich des Graphen If ($iModus = 0) AND ($MG_aGraph[$iGraph][0][$MG_a_bHauptgitter_aktiviert] = True) Then ; zeichnet die vertikalen Hauptgitterlinien ein If Not ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] < 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $i * $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] - 1 _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $iLinie, _ ; Position 1: X-Koordinate 0, _ ; Position 1: Y-Koordinate $iLinie, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iHoehe], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) ; handle zum Zeichenstift Next EndIf ; zeichnet die horizontalen Hauptgitterlinien ein If Not ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] < 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y]) For $i=1 to $iAnzahl_Linien Step 1 Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - ($i * $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y]) _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer 0, _ ; Position 1: X-Koordinate $iLinie, _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; Position 2: X-Koordinate $iLinie, _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) ; handle zum Zeichenstift Next EndIf ; zeichnet die Hauptgitterlinien nur an der aktuellen Plottposition des Graphen ElseIf ($iModus = 1) AND ($MG_aGraph[$iGraph][0][$MG_a_bHauptgitter_aktiviert] = True) Then ; zeichnet die vertikalen Hauptgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] >= 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $i * $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] - 1 If ($iLinie >= $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker]) AND ($iLinie < $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell]) Then _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $iLinie, _ ; Position 1: X-Koordinate 0, _ ; Position 1: Y-Koordinate $iLinie, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iHoehe], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) ; handle zum Zeichenstift EndIf Next EndIf ; zeichnet die horizontalen Hauptgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] >= 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - ($i * $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y]) If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] < $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell]) Then _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker], _ ; Position 1: X-Koordinate $iLinie, _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell], _ ; Position 2: X-Koordinate $iLinie, _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) ; handle zum Zeichenstift EndIf Next EndIf $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] = $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] ; zeichnet die Hauptgitterlinien nur an der letzen Plottposition des Graphen (für den Modus: "bewegter Graph") ElseIf ($iModus = 2) AND ($MG_aGraph[$iGraph][0][$MG_a_bHauptgitter_aktiviert] = True) Then ; zeichnet die vertikalen Hauptgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] >= 1) Then While ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] >= $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X]) Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iBreite] - (1 + $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] - $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X]) _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $iLinie, _ ; Position 1: X-Koordinate 0, _ ; Position 1: Y-Koordinate $iLinie, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iHoehe], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) ; handle zum Zeichenstift $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] -= $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_X] WEnd $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_Merker] += $MG_aGraph[$iGraph][0][$MG_a_iBreite] - $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung] EndIf ; zeichnet die horizontalen Hauptgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y] >= 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - ($i * $MG_aGraph[$iGraph][0][$MG_a_iHauptgitter_abstand_Y]) _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung], _ ; Position 1: X-Koordinate $iLinie, _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; Position 2: X-Koordinate $iLinie, _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) ; handle zum Zeichenstift Next EndIf EndIf ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_Hauptgitterlinien_plotten ; #INTERNAL_USE_ONLY# ;=================================================================================================================================== ; ; Name...........: _MG_Graph_Hilfsgitterlinien_plotten ; Beschreibung ..: zeichnet die Hilfsgitterlinien in den Graphen ein ; Syntax.........: _MG_Graph_Hilfsgitterlinien_plotten ($iGraph, $iModus = 0) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; $iModus - zeichnet die Hilfsgitterlinien in bestimmten Bereichen ein ; | 0 zeichnet die Hilfsgitterlinien in den gesamten Zeichenbereich des Graphen ; | 1 zeichnet die Hilfsgitterlinien nur an der aktuellen Plottposition des Graphen ; | 2 zeichnet die Hilfsgitterlinien nur an der letzen Plottposition des Graphen (für den Modus: "bewegter Graph") ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_Hilfsgitterlinien_plotten ($iGraph, $iModus = 0) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; zeichnet die Hilfsgitterlinien in den gesamten Zeichenbereich des Graphen If ($iModus = 0) AND ($MG_aGraph[$iGraph][0][$MG_a_bHilfsgitter_aktiviert] = True) Then ; zeichnet die vertikalen Hilfsgitterlinien ein If Not ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] < 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $i * $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] - 1 _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $iLinie, _ ; Position 1: X-Koordinate 0, _ ; Position 1: Y-Koordinate $iLinie, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iHoehe], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) ; handle zum Zeichenstift Next EndIf ; zeichnet die horizontalen Hilfsgitterlinien ein If Not ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y] < 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y]) For $i=1 to $iAnzahl_Linien Step 1 Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - ($i * $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y]) _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer 0, _ ; Position 1: X-Koordinate $iLinie, _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; Position 2: X-Koordinate $iLinie, _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) ; handle zum Zeichenstift Next EndIf ; zeichnet die Hilfsgitterlinien nur an der aktuellen Plottposition des Graphen ElseIf ($iModus = 1) AND ($MG_aGraph[$iGraph][0][$MG_a_bHilfsgitter_aktiviert] = True) Then ; zeichnet die vertikalen Hilfsgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] >= 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iBreite] / $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $i * $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] - 1 If ($iLinie >= $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker]) AND ($iLinie < $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell]) Then _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $iLinie, _ ; Position 1: X-Koordinate 0, _ ; Position 1: Y-Koordinate $iLinie, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iHoehe], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) ; handle zum Zeichenstift EndIf Next EndIf ; zeichnet die horizontalen Hilfsgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y] >= 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - ($i * $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y]) If ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] < $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell]) Then _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker], _ ; Position 1: X-Koordinate $iLinie, _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell], _ ; Position 2: X-Koordinate $iLinie, _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) ; handle zum Zeichenstift EndIf Next EndIf $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] = $MG_aGraph[$iGraph][0][$MG_a_iPosition_aktuell] ; zeichnet die Hilfsgitterlinien nur an der letzen Plottposition des Graphen (für den Modus: "bewegter Graph") ElseIf ($iModus = 2) AND ($MG_aGraph[$iGraph][0][$MG_a_bHilfsgitter_aktiviert] = True) Then ; zeichnet die vertikalen Hilfsgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] >= 1) Then While ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] >= $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X]) Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iBreite] - (1 + $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] - $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X]) _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $iLinie, _ ; Position 1: X-Koordinate 0, _ ; Position 1: Y-Koordinate $iLinie, _ ; Position 2: X-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iHoehe], _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) ; handle zum Zeichenstift $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] -= $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_X] WEnd $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_Merker] += $MG_aGraph[$iGraph][0][$MG_a_iBreite] - $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung] EndIf ; zeichnet die horizontalen Hilfsgitterlinien ein If ($MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y] >= 1) Then Local $iAnzahl_Linien = Int($MG_aGraph[$iGraph][0][$MG_a_iHoehe] / $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y]) For $i = 1 to $iAnzahl_Linien Step 1 Local $iLinie = $MG_aGraph[$iGraph][0][$MG_a_iHoehe] - ($i * $MG_aGraph[$iGraph][0][$MG_a_iHilfsgitter_abstand_Y]) _GDIPlus_GraphicsDrawLine ($MG_aGraph[$iGraph][0][$MG_a_hBuffer], _ ; handle zum Grafik-Buffer $MG_aGraph[$iGraph][0][$MG_a_iVerschiebung], _ ; Position 1: X-Koordinate $iLinie, _ ; Position 1: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_iBreite], _ ; Position 2: X-Koordinate $iLinie, _ ; Position 2: Y-Koordinate $MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) ; handle zum Zeichenstift Next EndIf EndIf ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_Hilfsgitterlinien_plotten ; #FUNCTION# ;============================================================================================================================================ ; ; Name...........: _MG_Graph_entfernen ; Beschreibung ..: löscht den Graphen aus der GUI ; Syntax.........: _MG_Graph_entfernen ($iGraph) ; ; Parameter .....: $iGraph - Graph-Index, auf dem sich die Einstellungen beziehen ; ; Rückgabewerte .: Erfolg | 0 ; ; Fehler | -1 der Graph-Index liegt außerhalb des gültigen Bereichs ; | -2 der Graph ist schon deaktiviert ; ; Autor .........: SBond ; Bemerkungen ...: Wichtig: der Graphindex beginnt bei 1. Der Index 0 ist reserviert und sollte nicht verwendet werden. ; ; ======================================================================================================================================================== Func _MG_Graph_entfernen ($iGraph) ; Fehler, wenn der Graph-Index außerhalb des gültigen Bereichs liegt If ($iGraph > $MG_iMax_Anzahl_Graphen) OR ($iGraph <= 0) Then Return (-1) ; Fehler, wenn der Graph schon deaktiviert ist If ($MG_aGraph[$iGraph][0][$MG_a_bGraph_aktiviert] = False) Then Return (-2) ; Graphen deaktivieren $MG_aGraph[$iGraph][0][$MG_a_bGraph_aktiviert] = False ; Rahmen und Beschriftungen löschen _MG_Graph_optionen_Rahmen ($iGraph, False, 0x000000, 1) _MG_Graph_Achse_unten ($iGraph, False) _MG_Graph_Achse_links ($iGraph, False) _MG_Graph_Achse_rechts ($iGraph, False) ; die GDI+ Resourcen wieder freigeben _GDIPlus_GraphicsDispose ($MG_aGraph[$iGraph][0][$MG_a_hGraphic]) _GDIPlus_GraphicsDispose ($MG_aGraph[$iGraph][0][$MG_a_hBuffer]) _GDIPlus_BitmapDispose ($MG_aGraph[$iGraph][0][$MG_a_hBitmap]) _GDIPlus_PenDispose ($MG_aGraph[$iGraph][0][$MG_a_hHauptgitter_Pen]) _GDIPlus_PenDispose ($MG_aGraph[$iGraph][0][$MG_a_hHilfsgitter_Pen]) For $iKanal = 1 To $MG_iMax_Anzahl_Kanaele Step 1 _GDIPlus_PenDispose ($MG_aGraph[$iGraph][$iKanal][$MG_k_hPen]) Next ; Rückgabewert: Erfolgreich Return (0) EndFunc ;==> _MG_Graph_entfernen ; #INTERNAL_USE_ONLY# ;=================================================================================================================================== ; ; Name...........: _MG_Graph_Herunterfahren ; Beschreibung ..: gibt die GDI+ Resourcen beim Beenden wieder frei ; Syntax.........: _MG_Graph_Herunterfahren () ; ; Parameter .....: ; ; Rückgabewerte .: ; ; Autor .........: SBond ; Bemerkungen ...: ; ; ======================================================================================================================================================== Func _MG_Graph_Herunterfahren () ; die GDI+ Resourcen wieder freigeben For $i = 1 to $MG_iMax_Anzahl_Graphen _MG_Graph_entfernen ($i) Next _GDIPlus_Shutdown () EndFunc ;==> _MG_Graph_Herunterfahren