Jump to content
nitekram

GDI-Plus Questions

Recommended Posts

nitekram

Can someone tell me why this code is not working? I am unable to copy the file to a directory.

 

#include <GDIPlus.au3>
#include <ScreenCapture.au3>

Example()

Func Example()
    Local $hBitmap, $hClone, $hImage, $iX, $iY

    ; Initialize GDI+ library
    _GDIPlus_Startup()

    ; Capture 32 bit bitmap
    $hBitmap = _ScreenCapture_Capture(@ScriptDir & "\temp.jpg", 300, 300, 900, 900)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth($hImage)
    $iY = _GDIPlus_ImageGetHeight($hImage)
    $hClone = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iX, $iY, $GDIP_PXF24RGB)

    ; Save bitmap to file
    _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\GDIPlus_Image66.bmp")

    ; Clean up resources
    _GDIPlus_ImageDispose($hClone)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject($hBitmap)

    ; Shut down GDI+ library
    _GDIPlus_Shutdown()

    ShellExecute(@ScriptDir & "\GDIPlus_Image66.bmp")
EndFunc   ;==>Example

 

 

.

 

Edited by nitekram
changed the code, as it was not the right file

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
UEZ

Try this instead:

#include <GDIPlus.au3>
#include <ScreenCapture.au3>

Example()

Func Example()
    Local $hBitmap, $hClone, $hImage, $iX, $iY

    ; Initialize GDI+ library
    _GDIPlus_Startup()

    ; Capture 32 bit bitmap
    $hBitmap = _ScreenCapture_Capture("", 300, 300, 900, 900)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth($hImage)
    $iY = _GDIPlus_ImageGetHeight($hImage)
    $hClone = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iX, $iY, $GDIP_PXF24RGB)

    ; Save bitmap to file
    _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\GDIPlus_Image66.bmp")

    ; Clean up resources
    _GDIPlus_ImageDispose($hClone)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject($hBitmap)

    ; Shut down GDI+ library
    _GDIPlus_Shutdown()

    ShellExecute(@ScriptDir & "\GDIPlus_Image66.bmp")
EndFunc   ;==>Example

 

;)

 


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
nitekram

Okay, try as I may, I could not get it to work, and I am sure it was something more stupid than trying to open a file name that did not exist.

So I have a question about what I am trying to do. What you posted works, but I am not sure how I need to proceed. I want to create a moving object, and it moves outside the given area, but I want to show that it is moving and still moving, so I want to create a trail of what has happened, so far.

I would post it, but it is two files and I need an idea before I can even start to have a problem. Is it better to  redraw the image, as it pertains to the above, or should I copy or clone a part of the image, and then move that aside, to show a moving affect - sort of a cartoon if you will. And if it is the latter, how do I match the resolution of the area being cloned?

 

EDIT

And if I were to redraw it, would I write a log of what had happened, and then rewrite it that way?

Edited by nitekram

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
UEZ
$hBitmap = _ScreenCapture_Capture(@ScriptDir & "\temp.jpg", 300, 300, 900, 900)

will save the bitmap but will not return a GDI bitmap handle! That was the reason for the empty bitmap!

 

About the 2nd part I cannot image what you want to do - sorry.


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
nitekram

Thanks for you answer, that makes sense.

 

I am trying to create a graph. The line goes through the graph, but it ends when it hits the right side (moving from left to right). I want the graph to continue to the left, meaning the data that was written to the right, needs to be moved to the left.

See below: the data will move out of the screen on the left hand side, always keeping the new data on the right. I am drawing a graph, that continues to move, and draws the lines on the graph...the problem, I want it to appear that it is moving, and want to keep the older data moving off to the left, while the live data is showing on the right.

If I need to, I can get a working example, but was thinking of how to make it happen - like the old flip books, that you drew a figure or car, moving off and jumping a ramp.

.....................>-1->-4->1->-4->

.................>-1->-4->-1>-4->->

............>-1->-4->-1>-4->->2->

....>-1->-4->-1>-4->->2->->3->

>-1->-4->-1>-4->->2->->3->->

>-4->-1>-4->->2->->3->->0->->


All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
jvds

its hard to understand you but i was playing last week with GUICtrlCreateGraphic, and moving lines from right to left, like bandwidth meter graphics , maybe you can draw other things with GUICtrlCreateGraphic and do someting similar
 

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


Global $Grap[3]
Global $Randomlast

$RH = 6
$RW = 4

$Grap0X=8
$Grap0Y=8
$Grap0W=400
$Grap0H=200

$Grap1X=8
$Grap1Y=212
$Grap1W=400
$Grap1H=200

$Grap2X=412
$Grap2Y=8
$Grap2W=200
$Grap2H=404

global $Data0[$Grap0W-$RW][2] ;sumarle +2 al ancho por los bordes del cuadro aparte del $RH, hace lo mismo en altura maxima
global $Data1[$Grap1W-$RW][2] ;sumarle +2 al ancho por los bordes del cuadro aparte del $RH, hace lo mismo en altura maxima
global $Data2[$Grap2W-$RW][2] ;sumarle +2 al ancho por los bordes del cuadro aparte del $RH, hace lo mismo en altura maxima

;~ $Form1 = GUICreate("Form1", 615, 438, 192, 124, -1, BitOR($WS_EX_APPWINDOW,$WS_EX_WINDOWEDGE,$WS_EX_LAYERED,$WS_EX_COMPOSITED))
$Form1 = GUICreate("Form1", 615, 438, 192, 124, -1,$WS_EX_COMPOSITED)
GUISetState(@SW_SHOW)




While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    GUISetState(@SW_LOCK)



    $aPos = MouseGetPos()
    $value= ((100*(@DesktopHeight - $aPos[1]))/@DesktopHeight)*2
;~  $color= '0x'&HEX(round($aPos[0]*(16777215/@DesktopWidth)),6)
;~  $color= '0x'&HEX(round($aPos[0]*(16777215/@DesktopWidth)),6)
    $color= '0x000000'
    _ArrayAdd($Data0,$value&'|'&$color,0,'|')
    _ArrayDelete($Data0,0)
    $Grap[0] = GRAP($Grap0X, $Grap0Y, $Grap0W, $Grap0H,-1,$Grap[0],$Data0,0xff5555,0x008899)


    ;spam ping D=
;~  $value= Ping ('201.217.0.181',198)
;~  _ArrayAdd($Data1,$value&'|0x'&random(000000,999999,1),0,'|')
;~  _ArrayDelete($Data1,0)
;~  $Grap[1] = GRAP($Grap1X, $Grap1Y, $Grap1W, $Grap1H,-1,$Grap[1],$Data1,0x000000,0xffffff)


    $value= random (1,396,1)
    $value = ($value + $Randomlast)/2
    $Randomlast = $value
    _ArrayAdd($Data2,$value&'|',0,'|')
    _ArrayDelete($Data2,0)
    $Grap[2] = GRAP($Grap2X, $Grap2Y, $Grap2W, $Grap2H,-1,$Grap[2],$Data2,0x000000,0xffffff)

    sleep(1)
    GUISetState(@SW_UNLOCK)
WEnd


Func GRAP($GX, $GY, $GW, $GH,$Style,$Graphic,$Data,$BordColor,$FillColor)
    if IsArray($Data) and UBound($Data,0) = 2  Then

        ;borrar grafica
        GUICtrlDelete ( $Graphic )

        ;Volver a Crear grafica
        $Graphic = GUICtrlCreateGraphic($GX, $GY, $GW, $GH,$Style)
        GUICtrlSetColor($Graphic, $BordColor)
        GUICtrlSetBkColor($Graphic, $FillColor)


        ;Dibujar array de data a lineas
        for $it=0 to UBound($Data,1)-1

            ;defaul color, si no hay color
            $color = 0x9f9f9f
;~          $color = 0x9f0000
;~          $color = 0x9f9f00
;~          $color = 0x009f00

            ;si hay color, setearlo
            if StringInStr ($Data[$it][1],'0x',1) Then $color = $Data[$it][1]

            ;Altura maxima usar >=, sumarle +2 por los bordes del cuadro aparte del $RH
            if $Data[$it][0] >= $GH-$RH+2 then $Data[$it][0] = $GH-$RH+2

            ;dibujar grafica restando los bordes para no salir del cuadrado
            GUICtrlSetGraphic($Graphic, $GUI_GR_COLOR, $color)
            GUICtrlSetGraphic($Graphic, $GUI_GR_MOVE, $it+($RW/2), $GH-($RH/2)) ;GUICtrlSetGraphic($Graphic, $GUI_GR_MOVE, $it, 0)
            GUICtrlSetGraphic($Graphic, $GUI_GR_LINE, $it+($RW/2), $GH-($RH/2)-$Data[$it][0])

        Next

    Else
        ConsoleWrite ("!eRROR="&IsArray($Data)&"="&UBound($Data,0)&@LF)
    EndIf
    Return $Graphic
EndFunc

 

Share this post


Link to post
Share on other sites
nitekram

I have a working example, though my script does not look anything like this, I was able to get this so show what I am trying to to do.

I want the horizontal bar to move to the left, bringing the history of the items that are being produced on the rights side. The new data has to show, otherwise the value will not be seen. I slow it down to show the affect. I am just not sure how to remove the lines - I just cannot over write them (BLANK out that area) , as there is info under it, but I could use some type array...I even messed with it, but could not figure it out i.e. write the data to an array, and then use that array to redraw the data, but then I would have to redraw the graph, and it will/is going to be glitchy.

#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

#include <Array.au3>

Example()

Func Example()
    Local $hGUI, $hGraphic, $hPen
    $sData = ''
    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState(@SW_SHOW)

    ; Draw line
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hPen = _GDIPlus_PenCreate(0xffff0000, 5)
    ; get data
    #cs
        $iX1 The X coordinate of the starting point of the line
        $iY1 The Y coordinate of the starting point of the line
        $iX2 The X coordinate of the ending point of the line
        $iY2 The Y coordinate of the ending point of the line
    #CE

Global $aRawData[300][4]

$x1 = 100
$y1 = 100
For $x = $x1 To 500 Step 10
    _GDIPlus_GraphicsDrawLine($hGraphic, $x1, $y1 , $x1 +$x, $y1 , $hPen)
    Sleep(30)
    _GDIPlus_GraphicsDrawLine($hGraphic, $x1 + $x, $y1 + Random(-400, 200), $x1 + $x, $y1 , $hPen)
Next

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

EndFunc   ;==>Example

 

 

.

 


All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
nitekram

its hard to understand you but i was playing last week with GUICtrlCreateGraphic, and moving lines from right to left, like bandwidth meter graphics , maybe you can draw other things with GUICtrlCreateGraphic and do someting similar
 

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


Global $Grap[3]
Global $Randomlast

$RH = 6
$RW = 4

$Grap0X=8
$Grap0Y=8
$Grap0W=400
$Grap0H=200

$Grap1X=8
$Grap1Y=212
$Grap1W=400
$Grap1H=200

$Grap2X=412
$Grap2Y=8
$Grap2W=200
$Grap2H=404

global $Data0[$Grap0W-$RW][2] ;sumarle +2 al ancho por los bordes del cuadro aparte del $RH, hace lo mismo en altura maxima
global $Data1[$Grap1W-$RW][2] ;sumarle +2 al ancho por los bordes del cuadro aparte del $RH, hace lo mismo en altura maxima
global $Data2[$Grap2W-$RW][2] ;sumarle +2 al ancho por los bordes del cuadro aparte del $RH, hace lo mismo en altura maxima

;~ $Form1 = GUICreate("Form1", 615, 438, 192, 124, -1, BitOR($WS_EX_APPWINDOW,$WS_EX_WINDOWEDGE,$WS_EX_LAYERED,$WS_EX_COMPOSITED))
$Form1 = GUICreate("Form1", 615, 438, 192, 124, -1,$WS_EX_COMPOSITED)
GUISetState(@SW_SHOW)




While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    GUISetState(@SW_LOCK)



    $aPos = MouseGetPos()
    $value= ((100*(@DesktopHeight - $aPos[1]))/@DesktopHeight)*2
;~  $color= '0x'&HEX(round($aPos[0]*(16777215/@DesktopWidth)),6)
;~  $color= '0x'&HEX(round($aPos[0]*(16777215/@DesktopWidth)),6)
    $color= '0x000000'
    _ArrayAdd($Data0,$value&'|'&$color,0,'|')
    _ArrayDelete($Data0,0)
    $Grap[0] = GRAP($Grap0X, $Grap0Y, $Grap0W, $Grap0H,-1,$Grap[0],$Data0,0xff5555,0x008899)


    ;spam ping D=
;~  $value= Ping ('201.217.0.181',198)
;~  _ArrayAdd($Data1,$value&'|0x'&random(000000,999999,1),0,'|')
;~  _ArrayDelete($Data1,0)
;~  $Grap[1] = GRAP($Grap1X, $Grap1Y, $Grap1W, $Grap1H,-1,$Grap[1],$Data1,0x000000,0xffffff)


    $value= random (1,396,1)
    $value = ($value + $Randomlast)/2
    $Randomlast = $value
    _ArrayAdd($Data2,$value&'|',0,'|')
    _ArrayDelete($Data2,0)
    $Grap[2] = GRAP($Grap2X, $Grap2Y, $Grap2W, $Grap2H,-1,$Grap[2],$Data2,0x000000,0xffffff)

    sleep(1)
    GUISetState(@SW_UNLOCK)
WEnd


Func GRAP($GX, $GY, $GW, $GH,$Style,$Graphic,$Data,$BordColor,$FillColor)
    if IsArray($Data) and UBound($Data,0) = 2  Then

        ;borrar grafica
        GUICtrlDelete ( $Graphic )

        ;Volver a Crear grafica
        $Graphic = GUICtrlCreateGraphic($GX, $GY, $GW, $GH,$Style)
        GUICtrlSetColor($Graphic, $BordColor)
        GUICtrlSetBkColor($Graphic, $FillColor)


        ;Dibujar array de data a lineas
        for $it=0 to UBound($Data,1)-1

            ;defaul color, si no hay color
            $color = 0x9f9f9f
;~          $color = 0x9f0000
;~          $color = 0x9f9f00
;~          $color = 0x009f00

            ;si hay color, setearlo
            if StringInStr ($Data[$it][1],'0x',1) Then $color = $Data[$it][1]

            ;Altura maxima usar >=, sumarle +2 por los bordes del cuadro aparte del $RH
            if $Data[$it][0] >= $GH-$RH+2 then $Data[$it][0] = $GH-$RH+2

            ;dibujar grafica restando los bordes para no salir del cuadrado
            GUICtrlSetGraphic($Graphic, $GUI_GR_COLOR, $color)
            GUICtrlSetGraphic($Graphic, $GUI_GR_MOVE, $it+($RW/2), $GH-($RH/2)) ;GUICtrlSetGraphic($Graphic, $GUI_GR_MOVE, $it, 0)
            GUICtrlSetGraphic($Graphic, $GUI_GR_LINE, $it+($RW/2), $GH-($RH/2)-$Data[$it][0])

        Next

    Else
        ConsoleWrite ("!eRROR="&IsArray($Data)&"="&UBound($Data,0)&@LF)
    EndIf
    Return $Graphic
EndFunc

 

I had not looked at this, but it may do what I need, I just have to convert it, to GDI, as that is now what I am learning. But it appears to be exactly it

 

EDIT

Maybe not, you comments are in Spanish? Trying to turn it into English is as hard as trying to figure it out lol

Edited by nitekram

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
jvds

oh well sorry about that, i commit all kinds of English and Spanish dictionary crimes when i write so i dont think the translator will translate it either xD

the drawing happens in the function, it basicaly delete the whole graphic control, or whatever you can call it, then it redraws the grapick with the fresh new array, so the array changes and it just delete, redraw, delete, redraw the graphic over an over from 0, im not pro with autoit, but i just try whatever i can until i get it to work, this worked for me,  but there are probably better ways to do this, here is the func with english comments and some lines explaining the variables

;$GX x axix where grapgh border start 
;$GY y axis there graphic border start
;$GW wide of graphic border
;$GH height of graphic border
;$Style style of GUICtrlCreateGraphic
;$Graphic what the hell do you call this? xD, the GUICtrlCreateGraphic variable?
;$Data the data in an array that you want to draw
;$BordColor the graph border color
;$FillColor the grap inside color

Func GRAP($GX, $GY, $GW, $GH,$Style,$Graphic,$Data,$BordColor,$FillColor)
    if IsArray($Data) and UBound($Data,0) = 2  Then

        ;Delete $Graphic
        GUICtrlDelete ( $Graphic )

        ;Create the $Graphic
        $Graphic = GUICtrlCreateGraphic($GX, $GY, $GW, $GH,$Style)
        GUICtrlSetColor($Graphic, $BordColor)
        GUICtrlSetBkColor($Graphic, $FillColor)


        ;Draw data in arrays to graph vertical lines
        for $it=0 to UBound($Data,1)-1

            ;use this defaul color, if no default color is set
            $color = 0x9f9f9f
;~          $color = 0x9f0000
;~          $color = 0x9f9f00
;~          $color = 0x009f00

            ;check if '0x' string was found in $Data[$it][1], if not then set the default color '$color = 0x9f9f9f'
            if StringInStr ($Data[$it][1],'0x',1) Then $color = $Data[$it][1]

            ;Maximum height, use >=, add +2 for the borders lines apart drom $RH
            if $Data[$it][0] >= $GH-$RH+2 then $Data[$it][0] = $GH-$RH+2

            ;Draw $Graphic substracting borders so drawing does not go outside the borfer frame
            GUICtrlSetGraphic($Graphic, $GUI_GR_COLOR, $color)
            GUICtrlSetGraphic($Graphic, $GUI_GR_MOVE, $it+($RW/2), $GH-($RH/2)) ;GUICtrlSetGraphic($Graphic, $GUI_GR_MOVE, $it, 0)
            GUICtrlSetGraphic($Graphic, $GUI_GR_LINE, $it+($RW/2), $GH-($RH/2)-$Data[$it][0])

        Next

    Else
        ConsoleWrite ("!eRROR="&IsArray($Data)&"="&UBound($Data,0)&@LF)
    EndIf
    Return $Graphic
EndFunc

 

Share this post


Link to post
Share on other sites
UEZ

I don't know whether this will help you: https://autoit.de/index.php/Thread/36667-MultiGraph-UDF-dynamischer-GDI-LineGraph-als-Software-Oszilloskop-geeignet

The attachments are broken on German AutoIt site!

MultiGraph.au3

#include-once
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

_GDIPlus_Startup()
OnAutoItExitRegister("_MG_Graph_Herunterfahren")


; #INDEX# ================================================================================================================================================
; Title             : MultiGraph
; AutoIt Version    : 3.3.8.0
; UDF Version       : 1.0.0.3
; Date of creation  : 01.02.2013 (DD.MM.YYYY)
; UDF-Language      : German
; Description       : create a dynamic line graph
; Author            : SBond
; Dll(s)            : ---
; ========================================================================================================================================================



; #AUTHOR INFORMATION# ===================================================================================================================================
; Author    : SBond
; 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]                            = 0
    $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] = 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


        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

Example:

#include "MultiGraph.au3"


; GUI erzeugen
$hGUI = GUICreate("", 800, 600)
Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hGUI)
GUISetState()



; Function                              Parameter
; ----------------------------------------------------------------------
; _MG_Graph_erstellen                   ($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)
;
;
; genauere Details und Parameterinfos findet ihr in der UDF ;)
;





; Graph 1 erstellen
_MG_Graph_erstellen                     (1, $hGUI, 70, 20, 660, 200)

_MG_Graph_optionen_allgemein            (1, 220, 0, 200, 0xFFFFFF, 2)
_MG_Graph_optionen_Plottmodus           (1, 0, 1, 1, True)

_MG_Graph_optionen_Rahmen               (1, True, 0x000000, 1)
_MG_Graph_optionen_Hauptgitterlinien    (1, 1, 50, 50, 1,0x000000, 190)
_MG_Graph_optionen_Hilfsgitterlinien    (1, 1, 10, 10, 1,0x000000, 220)

_MG_Graph_Achse_links                   (1, True,  0, 200, 0, "", 0x000000, Default, 9, 70, 1)
_MG_Graph_Achse_rechts                  (1, False, 0, 0,   1, "", 0x000000, Default, 9, 70, 1)
_MG_Graph_Achse_unten                   (1, True,  0, 250, 2, "", 0x000000, Default, 9, 70, 2)


; Kanäle für Graph 1 erstellen
_MG_Kanal_optionen                      (1, 1, 1, 1, 0x0044FF, 0)
_MG_Kanal_optionen                      (1, 2, 1, 1, 0xFF6600, 0)


; Graph 1 mit den aktuellen Einstellungen in der GUI darstellen
_MG_Graph_initialisieren (1)

#cs
        zu Graph 1:

        Graphbreite = 660
        Auflösung = 220

        --> d.h. alle 3 Pixel wird ein Wert dargestellt

        die lineare Interpolation und die Kantenglättung sind aktiviert

#ce










; Graph 2 erstellen
_MG_Graph_erstellen                     (2, $hGUI, 70, 300, 660, 220)

_MG_Graph_optionen_allgemein            (2, 110, 0, 200, 0x000000, 0)
_MG_Graph_optionen_Plottmodus           (2, 1, 1, 1, False)

_MG_Graph_optionen_Rahmen               (2, True, 0x000000, 1)
_MG_Graph_optionen_Hauptgitterlinien    (2, 1, 50, 50, 1,0xFFFFFF, 190)
_MG_Graph_optionen_Hilfsgitterlinien    (2, 1, 10, 10, 1,0xFFFFFF, 220)

_MG_Graph_Achse_links                   (2, True,  0, 220, 0, "", 0x000000, Default, 9, 70, 1)
_MG_Graph_Achse_rechts                  (2, False, 0, 0,   1, "", 0x000000, Default, 9, 70, 1)
_MG_Graph_Achse_unten                   (2, True,  0, 110, 2, "", 0x000000, Default, 9, 70, 2)


; Kanäle für Graph 2 erstellen
_MG_Kanal_optionen                      (2, 1, 1, 2, 0xFFFF00, 0)
_MG_Kanal_optionen                      (2, 2, 1, 1, 0x00FFBB, 0)


; Graph 2 mit den aktuellen Einstellungen in der GUI darstellen
_MG_Graph_initialisieren (2)


#cs
        zu Graph 2:

        Graphbreite = 660
        Auflösung = 110

        --> d.h. alle 6 Pixel wird ein Wert dargestellt

        die lineare Interpolation und die Kantenglättung sind deaktiviert

#ce







$counter = 0

While 1

    $counter += 0.04

    _MG_Wert_setzen (1, 1, 100+(sin($counter))*80)      ; Werte setzen für: Graph 1 / Kanal 1
    _MG_Wert_setzen (1, 2, 100+(tan($counter))*80)      ; Werte setzen für: Graph 1 / Kanal 2
    _MG_Graph_plotten (1)                               ; Graph 1 plotten



    _MG_Wert_setzen (2, 1, Random(50,150,1))            ; Werte setzen für: Graph 2 / Kanal 1
    _MG_Wert_setzen (2, 2, 100+(cos($counter))*80)      ; Werte setzen für: Graph 2 / Kanal 2
    _MG_Graph_plotten (2)                               ; Graph 2 plotten

WEnd








Func _Exit()
    Exit
EndFunc

 

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
nitekram

Have not had time to check out the code, but this is exactly what I wanted - thanks so much for reposting the code.

I am going to have to really look at this, to see why I could not make it happen, again thanks

 

EDIT

I guess first I will have to put it in English, as I just looked and it is german.

Edited by nitekram

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
nitekram

I read (translated) some of it, but I cannot believe this is his first posting (UDF) - he/she had to have some experience going in, otherwise, I might just give up this hobby - lol


All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
UEZ

As far as I can remember he was a (physic or math) student with (very) good coding experiences.

Yes, the UDF is in German but shouldn't be a big problem to translate to english because we use many english words.


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
nitekram

@UEZ I have about 1/4 of it done, and have yet to find out where you I can slow down the gragh (the refresh rate? not sure what it would be called, but want it so the rolling image is slowed down - can you suggest a function that I might look at?

EDIT

Found it - MG_a_iPlott_Counter $MG_a_iPlottfrequenz

Edited by nitekram

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
UEZ

There is no slow down possible as far as I can see. You have to put a sleep to the loop to slow down the draw speed.


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
nitekram

I cannot believe, I did  not think of that as a way to slow it down. But I did find, if I changed this around, it does something to the graph, just not sure about the difference in values. I just found it, so I have not had a lot of time to play with it. Do you see the change?

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] = 500 ;500 seems to be a good value ;1 ; 1 - 1000 ; $iPlottfrequenz changes the speed, the higher the number the slower the rate of refresh
    $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

 

.EDIT

After further study, it does not appear that I will be able to use the above, and will have to use a sleep() in the while loop. But it does want I want

Edited by nitekram

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
nitekram

I seem to be having issues with integrating this into my existing script. I read on the OP, that there was a messaging issue - can you explain that to me? got it working by lowering the width of the graphic to 660 (duh, but this cannot be right, otherwise, I would assume it would flag an ERROR)

Also, for some reason, the graph is only able to get so big, as it sits with the examples, if you raise the width more that 660, it does not work. Playing around you can see it trying to work depending on the width. I am still in the process of transcribing it, so maybe I will find the answer, but I find it strange.

Edited by nitekram

All by me:

"Sometimes you have to go back to where you started, to get to where you want to go." 

"Everybody catches up with everyone, eventually" 

"As you teach others, you are really teaching yourself."

From my dad

"Do not worry about yesterday, as the only thing that you can control is tomorrow."

 

WindowsError.gif

WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF

AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send

StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2

AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit  Docs

SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF

Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language

Programming Tips

Excel Changes

ControlHover.UDF

GDI_Plus

Draw_On_Screen

GDI Basics

GDI_More_Basics

GDI Rotate

GDI Graph

GDI  CheckExistingItems

GDI Trajectory

Replace $ghGDIPDll with $__g_hGDIPDll

DLL 101?

Array via Object

GDI Swimlane

GDI Plus French 101 Site

GDI Examples UEZ

GDI Basic Clock

GDI Detection

Ternary operator

Share this post


Link to post
Share on other sites
nitekram

I translated this...to the best of my ability - there are still some confusing parts, where I left a few different translations, along with the German text. Hope someone finds it helpful. I did find some issues with the UDF. I would like others to test and see what they come up with - thanks

 

#include-once
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <staticConstants.au3>

_GDIPlus_Startup()
OnAutoItExitRegister("_MG_Graph_Shutdown")

; #INDEX# ================================================================================================================================================
; Title             : MultiGraph
; AutoIt Version    : 3.3.8.0
; UDF Version       : 1.0.0.3
; Date of creation  : 01.02.2013 (DD.MM.YYYY)
; UDF-Language      : German
; Description       : create a dynamic line graph
; Author            : SBond
; Dll(s)            : ---
; ========================================================================================================================================================



; #AUTHOR INFORMATION# ===================================================================================================================================
; Author    : SBond
; E-Mail    : sbond.softwareinfo@gmail.com
; Language  : German  (Deutsch)
; Country   : Germany (Deutschland)
; Webside   : http://www.livesystem-pro.de
; ========================================================================================================================================================



; #UPbecfromeTIt# ==============================================================================================================================================
;
; 16.03.2013    -   1.0.0.3 - Fixed the background color of the axis label was not completely taken over
; 07.03.2013    -   1.0.0.2 - new feature: _MG_Graph_Options_Position () -> move a graph in the GUI or resizes to new
; 06.03.2013    -   1.0.0.1 - Fixed values Plotted on the first position of the graph were flawed
; 01.02.2013    -   1.0.0.0 - first release
;
; ========================================================================================================================================================



; # HinTS And inFORMATION# ================================================================================================================================
;
; General informationen about this UDF
; ----------------------------------------------------------------------
;
; This is my first UDF. You equivalent Not all the UDF coding sttWhetherecfromhed, but ich hope timIt that ihr With the Documentation clear comIt.
; With this UDF cto ihr a othe HAndleMultiple indepenthet LineCharts (or. Graphs) pheduce.
;
; It possibly would be important to know that the absolute zero point is in the lower left corner of the graph.
; A four-quandrant view is possible but still relatively lavish (in this case the calculations have to be done by oneself).
;
; By default, 10 graphs can be operated with 10 channels. Who needs more, it can easily be adjusted in the variables.
; The numbering of the graph and the channels starts at position 1 and not 0. This is important, since the adjustments of the graph are stored in the index 0.
;
; Regarding the terms ..... It could possibly be a bit confusing, but is here if written by "plotting", eg "the values in the graph plot", I do not mean
; that the values are represented in the GUI. The values are plotted in the Buffer. Only when all the points are drawn, or "_MG_Graph_updaten" function
; is used, the display in the GUI is updated.
;
;
;
;
;
; short breakdown of the abbreviations in the variables
; ----------------------------------------------------------------------
; whereby the complete settings of the graph are sent to channel 0
; $MG_aGraph [ GraphNumber] [ChannelNumber] [ChannelSettings] are being deposited all the settings of the graphs in the channel number 0
;
; $MG_a_            -> MultiGraph General Settings
; $MG_k_            -> MultiGraph Channel-Settings
;
; i                 -> integer
; f                 -> float
; h                 -> handle
; b                 -> booleen
; a                 -> array
; s                 -> string
; v                 -> Variable  (here mostly a hex value)
;
; ========================================================================================================================================================



; #CURRENT# ==============================================================================================================================================
;
; Function                              Parameter
; ----------------------------------------------------------------------
; _MG_Graph_Create                      ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iWidth, $iHeight)
; _MG_Graph_Options_Position            ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iWidth, $iHeight)
; _MG_Graph_Options_general             ($iGraph, $iDisplayResolution, $iY_min, $iY_max, $vBackgroundColor, $iSmoothingMode)
; _MG_Graph_Options_FrameBorder         ($iGraph, $bShow, $vFrameBordercolor, $iFrameBorderWidth)
; _MG_Graph_Options_MainGridLines       ($iGraph, $bMainGrid_Activate, $iMainGrid_Spacing_X, $iMainGrid_Spacing_Y, $iMainGrid_Width, $vMainGrid_color, $iMainGrid_Transparency)
; _MG_Graph_Options_AuxiliaryGridLines  ($iGraph, $bAuxiliaryGrid_Activate, $iAuxiliaryGrid_Spacing_X, $iAuxiliaryGrid_Spacing_Y, $iAuxiliaryGrid_Width, $vAuxiliaryGrid_color, $iAuxiliaryGrid_Transparency)
; _MG_Graph_Options_PlotMode            ($iGraph, $iPlotMode, $iPlotFrequency, $iClearMode, $bInterpolation)
; _MG_Channel_Options                   ($iGraph, $iChannel, $bChannel_Activate, $iLines_Width, $vLines_color, $iLines_Transparency)
; _MG_Graph_Initialize                  ($iGraph)
; _MG_Set_Channel_Value                 ($iGraph, $iChannel, $fValue)
; _MG_Graph_Update                      ($iGraph)
; _MG_Graph_clear                       ($iGraph)
; _MG_Graph_Axis_left               ($iGraph, $bAxis_Show, $fMin_Value, $fMax_Value, $iDecimalPlaces, $UnitType, $vFontColor, $vBackgroundColor, $fFontSize, $iLabelWidth, $fInterval)
; _MG_Graph_Axis_right              ($iGraph, $bAxis_Show, $fMin_Value, $fMax_Value, $iDecimalPlaces, $UnitType, $vFontColor, $vBackgroundColor, $fFontSize, $iLabelWidth, $fInterval)
; _MG_Graph_Axis_down               ($iGraph, $bAxis_Show, $fMin_Value, $fMax_Value, $iDecimalPlaces, $UnitType, $vFontColor, $vBackgroundColor, $fFontSize, $iLabelWidth, $fInterval)
; _MG_Graph_Axis_down_Update        ($iGraph, $fMin_Value, $fMax_Value, $iDecimalPlaces, $UnitType)
; _MG_Graph_Axis_left_Update        ($iGraph, $fMin_Value, $fMax_Value, $iDecimalPlaces, $UnitType)
; _MG_Graph_Axis_right_Update       ($iGraph, $fMin_Value, $fMax_Value, $iDecimalPlaces, $UnitType)
; _MG_Graph_Plotting                ($iGraph)
; _MG_Graph_Remove                  ($iGraph)
;
; ========================================================================================================================================================



; #FUNCTION-DESCRIPTIONS# ==============================================================================================================================================
;
; Function                              short Description
; ----------------------------------------------------------------------
; _MG_Graph_Create                      created a graph
; _MG_Graph_Options_position            shifts a graph in the GUI or resizes to new
; _MG_Graph_Options_general             Change the General Settings of the Graphs
; _MG_Graph_Options_FrameBorder         Change the FrameBorder-Settings of the Graphs
; _MG_Graph_Options_MainGridLines       Change the Settings the MainGridLines im Graphs
; _MG_Graph_Options_AuxiliaryGridLines  Change the Settings the AuxiliaryGridLines im Graphs
; _MG_Graph_Options_PlotMode            Plot mode changes the settings of the graph
; _MG_Channel_Options                   Change the Channel-Settings of the Graphs
; _MG_Graph_Initialize                  Plotting the Graphs for the first time in the GUI
; _MG_Set_Channel_Value                 Places the New Value for the next Plot operations fItt
; _MG_Graph_Update                      draws the graph in the GUI or updates the display records the Graph in the GUI or. Updated the representation
; _MG_Graph_clear                       deletes the current Plotted Valuee
; _MG_Graph_Axis_left                   created A Axis labeling on the left Side (Y-Axis), the himself to the horizontal MainGridLines directed
; _MG_Graph_Axis_right                  created A Axis labeling on the right Side (Y-Axis), the himself to the horizontal MainGridLines directed
; _MG_Graph_Axis_down                   created A Axis labeling on the Lower Side (X-Axis), the himself to the Vertical MainGridLines directed
; _MG_Graph_Axis_down_Update            Updated the Axis labeling on the Lower Side (X-Axis)
; _MG_Graph_Axis_left_Update            Updated the Axis labeling on the left Side (Y-Axis)
; _MG_Graph_Axis_right_Update           Updated the Axis labeling on the right Side (Y-Axis)
; _MG_Graph_Plotting                    Plotting the New Valuee in the Graphs And Updated if necessary. the representation in the GUI (depending on the settings)
; _MG_Graph_Remove                      deletes the Graphs from the GUI
;
; ========================================================================================================================================================



; #INTERNAL_USE_ONLY# ====================================================================================================================================
;
; Function                              Parameter
; ----------------------------------------------------------------------
; _MG_Graph_MainGridLines_Plotting          ($iGraph, $iMode)
; _MG_Graph_AuxiliaryGridLines_Plotting     ($iGraph, $iMode)
; _MG_Graph_Shutdown                        ()
;
; ========================================================================================================================================================



; #VARIABLIt# ============================================================================================================================================
Global Enum $MG_a_bGraph_Activate, _                                ; contains information on whether this graph is used/Activated or not
        $MG_a_hGUI, _                                               ; the GUI-handle on which the graph is to be drawn
        $MG_a_iX_Pos, _                                             ; X coordinate of the drawing area (upper left corner)
        $MG_a_iY_Pos, _                                             ; Y coordinate of the drawing area (upper left corner)
        $MG_a_iWidth, _                                             ; the Width of the Graphs
        $MG_a_iHeight, _                                            ; the Height of the Graphs
        $MG_a_hGraphic, _                                           ; handle to the graphics object
        $MG_a_hBitmap, _                                            ; handle the graphics context
        $MG_a_hBuffer, _                                            ; handle the graphics buffer
        $MG_a_iDisplayResolution, _                                 ; Resolution or horizontal scaling: If the number of values that are displayed. (When the resolution is equal to the width of the graph, then one value is displayed per pixel.)
        $MG_a_Increment_Sizes, _                                    ; the horizontal pixel distance between two displayed values
        $MG_a_iShift, _                                             ; Number the horizontal pixels, the in "scroll mode" need to be moved for each new presentation
        $MG_a_iY_min, _                                             ; the smallest value that can be represented in graph
        $MG_a_iY_max, _                                             ; the largest value that can be displayed in graph
        $MG_a_iValueRange_Yaxis, _                                  ; ValueRange of the Graphs (Y-Axis)
        $MG_a_fValueDisplayResolution, _                            ; Resolution or vertical scale: the smallest vertical distance between 2 pixel values
        $MG_a_vBackground_Color, _                                  ; the Background_Color of the Graphs
        $MG_a_bFrameBorder, _                                       ; Activate/deActivate the FrameBorder for the Graphs
        $MG_a_vFrameBordercolor, _                                  ; the FrameBorder color
        $MG_a_iFrameBorderWidth, _                                  ; the Width of the FrameBorders. (the DrawingArea of the Graphs shall becfromeat Not vheschWhetheren othe vheChange)
        $MG_a_hFrameBorder, _                                       ; hAndle of the FrameBorders
        $MG_a_bMainGrid_Activate, _                                 ; Activate/deActivate the MainGridLines
        $MG_a_iMainGrid_Spacing_X, _                                ; the horizontal Spacing between the MainGridLines
        $MG_a_iMainGrid_Spacing_Y, _                                ; the Vertical Spacing between the MainGridLines
        $MG_a_vMainGrid_color, _                                    ; the color used on the main grid lines
        $MG_a_iMainGrid_Width, _                                    ; the LinesWidth
        $MG_a_iMainGrid_Transparency, _                             ; the transparency of the MainGridLines used (0 to 255) -> 0: no transparency; 255: invisible
        $MG_a_hMainGrid_Pen, _                                      ; Handle of the "Pen"
        $MG_a_iMainGrid_Marker, _                                   ; a flag for temporarily storing location information
        $MG_a_bAuxiliaryGrid_Activate, _                            ; Activate/deActivate the AuxiliaryGridLines
        $MG_a_iAuxiliaryGrid_Spacing_X, _                           ; the horizontal Spacing between the AuxiliaryGridLines
        $MG_a_iAuxiliaryGrid_Spacing_Y, _                           ; the Vertical Spacing between the AuxiliaryGridLines
        $MG_a_vAuxiliaryGrid_color, _                               ; the usede color the AuxiliaryGridLines
        $MG_a_iAuxiliaryGrid_Width, _                               ; the LinesWidth
        $MG_a_iAuxiliaryGrid_Transparency, _                        ; the transparency of the MainGridLines used (0 to 255) -> 0: no transparency; 255: invisible
        $MG_a_hAuxiliaryGrid_Pen, _                                 ; Handle of the "Pen"
        $MG_a_iAuxiliaryGrid_Marker, _                              ; a flag for temporarily storing location information
        $MG_a_iSmoothingMode, _                                     ; Antialiasing (antialiasing) -> 0: no smoothing; 1: smoothing with 8 X 4 box filter; 2: smoothing with 8 X 8 cubic filter
        $MG_a_iPlotFrequency, _                                     ; is the number of Plot operations before the graph is updated in the GUI. (the higher the value, the more values can be displayed per second)
        $MG_a_iPlot_Counter, _                                      ; general flag for the plotting process (counters for the Plot frequency)
        $MG_a_iPlotMode, _                                          ;Display mode of the graph -> 0: standing Graph: Values are drawn from left to right; 1: moving graph: Graph "scroll" continuously from right to left
        $MG_a_iClearMode, _                                         ; Erase mode (only if Plotmodus: 0) -> 0: do not delete old values; 1: "upgrade" the old values; Graph delete content after complete run: 2
        $MG_a_bInterpolation, _                                     ; Activate/deActivate the Interpolation between 2 Values
        $MG_a_iPosition_current, _                                  ; current (horizontal) position of the value to be Plotted in the drawing area
        $MG_a_iAxisLabels_right, _                                  ; Number of labels the Y axis (right side)
        $MG_a_iAxisLabels_right_Interval, _                         ; Multiplier: view factor between the main gridlines -> 1: each MainGridLine; 2: every other main grid line; ... etc ...
        $MG_a_iAxisLabels_left, _                                   ; Number of labels the Y-axis (left side)
        $MG_a_iAxisLabels_left_Interval, _                          ; Multiplier: view factor between the main gridlines -> 1: each MainGridLine; 2: every other main grid line; ... etc ...
        $MG_a_iAxisLabels_down, _                                   ; Number of labels of the X-axis
        $MG_a_iAxisLabels_down_Interval, _                          ; Multiplier: view factor between the MainGridLines -> 1: each MainGridLines; 2: every other main grid line; ... etc ...
        $MG_a_NumberOfGraphElements ; current size of the graph arrays (the value is generated by the Enum; the variable must be the last one!)



Global Enum $MG_k_bChannel_Activate, _                              ; activates / deactivates the respective channel of a graph
        $MG_k_fY_Current_Value, _                                   ; current value
        $MG_k_fY_LAST_Value, _                                      ; LAST Value
        $MG_k_iLines_Transparency, _                                ; transparency used the line (0 to 255) -> 0: no transparency; 255: invisible
        $MG_k_vLines_color, _                                       ; the color the Line
        $MG_k_iLines_Width, _                                       ; the LinesWidth
        $MG_k_hPen ;handle to the "Pen"



; sets the max. number of graphs and number of channels tha can be used
Global $MG_iMax_Number_Graphs = 10
Global $MG_iMax_Number_Channels = 10


Global $MG_aGraph[$MG_iMax_Number_Graphs + 1][$MG_iMax_Number_Channels + 1][$MG_a_NumberOfGraphElements]
; ========================================================================================================================================================






; #FUNCTION# ;============================================================================================================================================
;
; Name...........:  _MG_Graph_Create
; Description ..: create a graph, and gives all the default values to the one that is created...
; Syntax.........:  _MG_Graph_Create ($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iWidth, $iHeight)
;
; Parameter .....:  $hGUI       - becfromes GUI-hAndle, on the the Graph subscribed will shall
;                   $iGRAPH     - Graph index to be used (starting with 1)
;                   $iX_Pos     - X-Coordinate of the DrawingAreaIt (top left corner)
;                   $iY_Pos     - Y-Coordinate of the DrawingAreaIt (top left corner)
;                   $iWidth     - the Width of the Graphs
;                   $iHeight    - the Height of the Graphs
;
; RücKGabeValuee .:    Success         |  0
;
;                   ERROR       | -1 Graph index is out of bounds
;                               | -2, the graph is already activated
;
; Autor .........:  SBond
; Comments ...: Important: the graph starts at index 1. The index 0 is reserved and should not be used.
;
; ========================================================================================================================================================
Func _MG_Graph_Create($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iWidth, $iHeight)

    ; ERROR, if the Graph-index outside of the valid Area lies
    If ($iGraph > $MG_iMax_Number_Graphs) Or ($iGraph <= 0) Then Return (-1)


    ; ERROR, if the Graph already Activate ist
    If ($MG_aGraph[$iGraph][0][$MG_a_bGraph_Activate] = True) Then Return (-2)



    ; generates the graph with the default settings
    $MG_aGraph[$iGraph][0][$MG_a_bGraph_Activate] = 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_iWidth] = $iWidth
    $MG_aGraph[$iGraph][0][$MG_a_iHeight] = $iHeight
    $MG_aGraph[$iGraph][0][$MG_a_hGraphic] = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $MG_aGraph[$iGraph][0][$MG_a_hBitmap] = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $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_iDisplayResolution] = $iWidth
    $MG_aGraph[$iGraph][0][$MG_a_Increment_Sizes] = $iWidth / $MG_aGraph[$iGraph][0][$MG_a_iDisplayResolution]
    $MG_aGraph[$iGraph][0][$MG_a_iShift] = Ceiling($iWidth - $MG_aGraph[$iGraph][0][$MG_a_Increment_Sizes])
    $MG_aGraph[$iGraph][0][$MG_a_iY_min] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iY_max] = 100
    $MG_aGraph[$iGraph][0][$MG_a_iValueRange_Yaxis] = Abs($MG_aGraph[$iGraph][0][$MG_a_iY_max] - $MG_aGraph[$iGraph][0][$MG_a_iY_min])
    $MG_aGraph[$iGraph][0][$MG_a_fValueDisplayResolution] = $MG_aGraph[$iGraph][0][$MG_a_iHeight] / $MG_aGraph[$iGraph][0][$MG_a_iValueRange_Yaxis]
    $MG_aGraph[$iGraph][0][$MG_a_vBackground_Color] = 0xFFFFFF
    $MG_aGraph[$iGraph][0][$MG_a_bFrameBorder] = True
    $MG_aGraph[$iGraph][0][$MG_a_vFrameBordercolor] = 0x000000
    $MG_aGraph[$iGraph][0][$MG_a_iFrameBorderWidth] = 1
    $MG_aGraph[$iGraph][0][$MG_a_hFrameBorder] = GUICtrlCreateLabel("", $iX_Pos - 1, $iY_Pos - 1, $iWidth + 2, $iHeight + 2)
    $MG_aGraph[$iGraph][0][$MG_a_bMainGrid_Activate] = True
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Spacing_X] = 50
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Spacing_Y] = 50
    $MG_aGraph[$iGraph][0][$MG_a_vMainGrid_color] = 0x000000
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Width] = 1
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Transparency] = 180
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Marker] = 0
    $MG_aGraph[$iGraph][0][$MG_a_bAuxiliaryGrid_Activate] = True
    $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Spacing_X] = 10
    $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Spacing_Y] = 10
    $MG_aGraph[$iGraph][0][$MG_a_vAuxiliaryGrid_color] = 0x000000
    $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Width] = 1
    $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Transparency] = 220
    $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Marker] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iSmoothingMode] = 2
    $MG_aGraph[$iGraph][0][$MG_a_iPlotFrequency] = 1 ; default was 1
    $MG_aGraph[$iGraph][0][$MG_a_iPlot_Counter] = 0 ; default was 0  ; 2.5 ; value was 0 (zero) but if you raise the value the graph slows down $MG_aGraph[$iGraph][0][$MG_a_iPlotMode] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iClearMode] = 1
    $MG_aGraph[$iGraph][0][$MG_a_bInterpolation] = True
    $MG_aGraph[$iGraph][0][$MG_a_iAxisLabels_right] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iAxisLabels_left] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iAxisLabels_down] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iAxisLabels_right_Interval] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iAxisLabels_left_Interval] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iAxisLabels_down_Interval] = 0
    $MG_aGraph[$iGraph][0][$MG_a_iPosition_current] = 0


    ; Calculate ARGB color code of the guide lines
    Local $vColorCode_MainGridLines = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Transparency], 2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vMainGrid_color], 6)
    Local $vColorCode_AuxiliaryGridLines = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Transparency], 2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vAuxiliaryGrid_color], 6)


    ; Set ARGB color code of the pen for the GuideLines
    $MG_aGraph[$iGraph][0][$MG_a_hMainGrid_Pen] = _GDIPlus_PenCreate($vColorCode_MainGridLines, $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Width])
    $MG_aGraph[$iGraph][0][$MG_a_hAuxiliaryGrid_Pen] = _GDIPlus_PenCreate($vColorCode_AuxiliaryGridLines, $MG_aGraph[$iGraph][0][$MG_a_iAuxiliaryGrid_Width])


    ; Set ARGB color code to the control
    GUICtrlSetBkColor($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $MG_aGraph[$iGraph][0][$MG_a_vFrameBordercolor])
    GUICtrlSetState($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $GUI_SHOW)
    GUICtrlSetState($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $GUI_DISABLE)


    ; Freeze the GUI controls
    GUICtrlSetResizing($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $GUI_DOCKALL)


    ; Set anti-aliasing (Smoothing) and empty the drawing area
    _GDIPlus_GraphicsSetSmoothingMode($MG_aGraph[$iGraph][0][$MG_a_hBuffer], $MG_aGraph[$iGraph][0][$MG_a_iSmoothingMode])
    _GDIPlus_GraphicsClear($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vBackground_Color])


    ; Basic setting for each channel
    For $iChannel = 1 To $MG_iMax_Number_Channels Step 1

        $MG_aGraph[$iGraph][$iChannel][$MG_k_bChannel_Activate] = False
        $MG_aGraph[$iGraph][$iChannel][$MG_k_fY_Current_Value] = ""
        $MG_aGraph[$iGraph][$iChannel][$MG_k_fY_LAST_Value] = ""
        $MG_aGraph[$iGraph][$iChannel][$MG_k_iLines_Transparency] = 0
        $MG_aGraph[$iGraph][$iChannel][$MG_k_vLines_color] = 0x0055FF
        $MG_aGraph[$iGraph][$iChannel][$MG_k_iLines_Width] = 1
        $MG_aGraph[$iGraph][$iChannel][$MG_k_hPen] = _GDIPlus_PenCreate(0xFF000000 + $MG_aGraph[$iGraph][$iChannel][$MG_k_vLines_color], $MG_aGraph[$iGraph][$iChannel][$MG_k_iLines_Width])

    Next


    ; Return Value: Successful
    Return (0)


EndFunc   ;==>_MG_Graph_Create






; # FUNCTION # ;============================================================================================================================================
;
; Name ...........: _MG_Graph_Options_position
; Description ..: Moves a graph in the GUI or resizes to new
; Syntax .........: _MG_Graph_Options_position ($iGRAPH, $hGUI, $iX_Pos, $iY_Pos, $iWidth, $iHeight)
;
; Parameters .....: $hGUI - the GUI handle on which the graph is to be drawn
; $iGRAPH - Graph index to be used (starting with 1)
; $iX_Pos - X coordinate of the drawing area (upper left corner)
; $iY_Pos - Y coordinate of the drawing area (upper left corner)
; $iWidth - the width of the graph
; $iHeight - the height of the graph
;
; . Returns: Success | 0
;
; Error | -1 the graph index is out of bounds
;
; Author .........: sbond
; Comments ...: The Axis labels must be manually updated to the new position is shifted
; Bemerkungen ...:  Die Achsbeschriftungen müssen manuell aktualisiert werden, damit die neue Position übernommen wird
; Comments ...: you must manually update the Text labels Axis so that the new position is taken
; you must manually update the Text labels Axis so that the new position is updated?
; ========================================================================================================================================================
Func _MG_Graph_Options_position($iGraph, $hGUI, $iX_Pos, $iY_Pos, $iWidth, $iHeight)

    ; ERROR, if the Graph-index outside of the valid Area lies
    If ($iGraph > $MG_iMax_Number_Graphs) Or ($iGraph <= 0) Then Return (-1)


    ; Release the old resources
    _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])


    ; shifts the graph, and adjusts the settings
    ; Creates or shifts the graph, and adjusts the settings
    $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_iWidth] = $iWidth
    $MG_aGraph[$iGraph][0][$MG_a_iHeight] = $iHeight
    $MG_aGraph[$iGraph][0][$MG_a_hGraphic] = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $MG_aGraph[$iGraph][0][$MG_a_hBitmap] = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $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_iDisplayResolution] = $iWidth
    $MG_aGraph[$iGraph][0][$MG_a_Increment_Sizes] = $iWidth / $MG_aGraph[$iGraph][0][$MG_a_iDisplayResolution]
    $MG_aGraph[$iGraph][0][$MG_a_iShift] = Ceiling($iWidth - $MG_aGraph[$iGraph][0][$MG_a_Increment_Sizes])
    $MG_aGraph[$iGraph][0][$MG_a_fValueDisplayResolution] = $MG_aGraph[$iGraph][0][$MG_a_iHeight] / $MG_aGraph[$iGraph][0][$MG_a_iValueRange_Yaxis]


    ; reposition the frame
    GUICtrlSetPos($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], _                                                     ; handle of the label
            $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - $MG_aGraph[$iGraph][0][$MG_a_iFrameBorderWidth], _           ; X-Coordinate of the DrawingAreaIt (top left corner)
            $MG_aGraph[$iGraph][0][$MG_a_iY_Pos] - $MG_aGraph[$iGraph][0][$MG_a_iFrameBorderWidth], _           ; Y-Coordinate of the DrawingAreaIt (top left corner)
            $MG_aGraph[$iGraph][0][$MG_a_iWidth] + (2 * $MG_aGraph[$iGraph][0][$MG_a_iFrameBorderWidth]), _     ; Width of the Labels
            $MG_aGraph[$iGraph][0][$MG_a_iHeight] + (2 * $MG_aGraph[$iGraph][0][$MG_a_iFrameBorderWidth])) ; Height of the Labels



    ; Return Value: Successful
    Return (0)


EndFunc   ;==>_MG_Graph_Options_position






; # FUNCTION # ;============================================================================================================================================
;
; Name ...........: _MG_Graph_Options_General
; Description ..: change the general settings of the graph
; Syntax .........: _MG_Graph_Options_General ($iGRAPH, $iDisplayResolution, $iY_min, $iY_max, $vBackgroundColor, $iSmoothingMode)
;
; Parameters .....: $iGRAPH - Graph Index, ond the related settings
; $iDisplayResolution - Resolution or horizontal scaling: If the number of values that are represented
; If the resolution is equal to the width of the graph, then one value is displayed per pixel.
; $iY_min - the smallest value that can be displayed in graph
; $iY_max - the largest value that can be displayed in graph
; $vBackgroundColor - the background color (RGB) of the graph in hex format (eg for white: 0xFFFFFF)
; $iSmoothingMode - antialiasing (smoothing)
; | 0 no smoothing
; | 1 smoothing with 8 X 4 box filter
; | 2 smoothing with 8 X 8 cubic filter
;
; . Returns: Success | 0
;
; Error | -1 the graph index is out of bounds
;
; Author .........: sbond
; Comments ...:
;
; ========================================================================================================================================================
Func _MG_Graph_Options_general($iGraph, $iDisplayResolution, $iY_min, $iY_max, $vBackgroundColor, $iSmoothingMode)

    ; ERROR, if the Graph-index outside of the valid Area lies
    If ($iGraph > $MG_iMax_Number_Graphs) Or ($iGraph <= 0) Then Return (-1)


    ; apply new settings
    $MG_aGraph[$iGraph][0][$MG_a_iDisplayResolution] = $iDisplayResolution
    $MG_aGraph[$iGraph][0][$MG_a_Increment_Sizes] = $MG_aGraph[$iGraph][0][$MG_a_iWidth] / $MG_aGraph[$iGraph][0][$MG_a_iDisplayResolution]
    $MG_aGraph[$iGraph][0][$MG_a_iShift] = Ceiling($MG_aGraph[$iGraph][0][$MG_a_iWidth] - $MG_aGraph[$iGraph][0][$MG_a_Increment_Sizes])
    $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_iValueRange_Yaxis] = Abs($iY_max - $iY_min)
    $MG_aGraph[$iGraph][0][$MG_a_fValueDisplayResolution] = $MG_aGraph[$iGraph][0][$MG_a_iHeight] / $MG_aGraph[$iGraph][0][$MG_a_iValueRange_Yaxis]
    $MG_aGraph[$iGraph][0][$MG_a_vBackground_Color] = $vBackgroundColor
    $MG_aGraph[$iGraph][0][$MG_a_iSmoothingMode] = $iSmoothingMode


    ; Set anti-aliasing (smoothing) and empty the drawing area
    _GDIPlus_GraphicsSetSmoothingMode($MG_aGraph[$iGraph][0][$MG_a_hBuffer], $MG_aGraph[$iGraph][0][$MG_a_iSmoothingMode])
    _GDIPlus_GraphicsClear($MG_aGraph[$iGraph][0][$MG_a_hBuffer], 0xFF000000 + $MG_aGraph[$iGraph][0][$MG_a_vBackground_Color])


    ; Return Value: Successful
    Return (0)


EndFunc   ;==>_MG_Graph_Options_general








; #FUNCTION# ;============================================================================================================================================
;
; Name...........:  _MG_Graph_Options_FrameBorder
; Description ..:   Change the FrameBorder-Settings of the Graphs
; Syntax.........:  _MG_Graph_Options_FrameBorder ($iGraph, $bShow, $vFrameBordercolor, $iFrameBorderWidth)
;
; Parameter .....:  $iGraph             - Graph Index, and the related settings/options
;                   $bShow          - Activate/deActivate the FrameBorder
;                                       | True      FrameBorder Show
;                                       | False     FrameBorder Not Show
;
;                   $vFrameBordercolor      - the color (RGB) of the FrameBorder in Hex-representation (z.B. for Black: 0x000000)
;                   $iFrameBorderWidth      - the Width of the FrameBorders (in Pixels)
;
; RücKGabeValuee .:    Success                 |  0
;
;                   ERROR               | -1 the Graph-index lies outside of the valid Area
;
; Autor .........:  SBond
; Comments ...:                     the Äntheung the FrameBorderWidth shifts othe Change the DrawingArea Not. the FrameBorder expANDs himself theafthe afthe outside from.
;Comments ...: changing the frame width shifts or does not change the drawing area. The frame expands accordingly outward.
; Bemerkungen ...:  die Änderung der Rahmenbreite verschiebt oder ändert den Zeichenbereich nicht. Der Rahmen dehnt sich demnach nach außen aus.
; Changing the frame width does not move or change the drawing area.  The frame will stretch outward accordingly.
; ========================================================================================================================================================
Func _MG_Graph_Options_FrameBorder($iGraph, $bShow, $vFrameBordercolor, $iFrameBorderWidth)

    ; ERROR, if the Graph-index outside of the valid Area lies
    If ($iGraph > $MG_iMax_Number_Graphs) Or ($iGraph <= 0) Then Return (-1)


    ; apply new settings
    $MG_aGraph[$iGraph][0][$MG_a_bFrameBorder] = $bShow
    $MG_aGraph[$iGraph][0][$MG_a_vFrameBordercolor] = $vFrameBordercolor
    $MG_aGraph[$iGraph][0][$MG_a_iFrameBorderWidth] = $iFrameBorderWidth



    ; shifts the FrameBorder Withtig tom DrawingArea
    If ($bShow = True) Then

        GUICtrlSetPos($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], _                         ; handle of the label
                $MG_aGraph[$iGraph][0][$MG_a_iX_Pos] - $iFrameBorderWidth, _            ; X-Coordinate of the DrawingAreaIt (top left corner)
                $MG_aGraph[$iGraph][0][$MG_a_iY_Pos] - $iFrameBorderWidth, _            ; Y-Coordinate of the DrawingAreaIt (top left corner)
                $MG_aGraph[$iGraph][0][$MG_a_iWidth] + (2 * $iFrameBorderWidth), _      ; Width of the Labels
                $MG_aGraph[$iGraph][0][$MG_a_iHeight] + (2 * $iFrameBorderWidth)) ; Height of the Labels

        ; FrameBordercolor TakeOver
        GUICtrlSetBkColor($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $vFrameBordercolor)
        GUICtrlSetState($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $GUI_SHOW)
        GUICtrlSetState($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $GUI_DISABLE)

    Else

        ; FrameBorder fromblenthe, if he deActivate shall
        GUICtrlSetState($MG_aGraph[$iGraph][0][$MG_a_hFrameBorder], $GUI_HIDE)

    EndIf



    ; Return Value: Successful
    Return (0)


EndFunc   ;==>_MG_Graph_Options_FrameBorder








; #FUNCTION# ;============================================================================================================================================
;
; Name...........:  _MG_Graph_Options_MainGridLines
; Description ..:   Change the Settings the MainGridLines im Graphs
; Syntax.........:  _MG_Graph_Options_MainGridLines ($iGraph, $bMainGrid_Activate, $iMainGrid_Spacing_X, $iMainGrid_Spacing_Y, $iMainGrid_Width, $vMainGrid_color, $iMainGrid_Transparency)
;
; Parameter .....:  $iGraph                     - Graph Index, and the related settings/options
;                   $bMainGrid_Activate     - Activate/deActivate the MainGridLines
;                                               | True      MainGridLines Show
;                                               | False     MainGridLines Not Show
;
;                   $iMainGrid_Spacing_X        - the horizontal Spacing between the MainGridLines
;                   $iMainGrid_Spacing_Y        - the Vertical Spacing between the MainGridLines
;                   $iMainGrid_Width        - the LinesWidth of the Gitthes (in Pixels)
;                   $vMainGrid_color            - the color (RGB) of the FrameBorder in Hex-representation (z.B. for Dark Grey: 0x777777)
;                   $iMainGrid_Transparency - the transparency of the MainGridLines used ( 0 to 255)
;                                               | 0         No Transparency
;                                               | 255       Invisible
;
; RücKGabeValuee .:    Success                         |  0
;
;                   ERROR                       | -1 the Graph-index lies outside of the valid Area
;
; Autor .........:  SBond
; Comments ...:
;
; ========================================================================================================================================================
Func _MG_Graph_Options_MainGridLines($iGraph, $bMainGrid_Activate, $iMainGrid_Spacing_X, $iMainGrid_Spacing_Y, $iMainGrid_Width, $vMainGrid_color, $iMainGrid_Transparency)

    ; ERROR, if the Graph-index outside of the valid Area lies
    If ($iGraph > $MG_iMax_Number_Graphs) Or ($iGraph <= 0) Then Return (-1)


    ; apply new settings
    $MG_aGraph[$iGraph][0][$MG_a_bMainGrid_Activate] = $bMainGrid_Activate
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Spacing_X] = $iMainGrid_Spacing_X
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Spacing_Y] = $iMainGrid_Spacing_Y
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Width] = $iMainGrid_Width
    $MG_aGraph[$iGraph][0][$MG_a_vMainGrid_color] = $vMainGrid_color
    $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Transparency] = $iMainGrid_Transparency


    ; delete the old "pen" and create the new
    Local $vColorCode = "0x" & Hex(255 - $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Transparency], 2) & Hex($MG_aGraph[$iGraph][0][$MG_a_vMainGrid_color], 6)
    _GDIPlus_PenDispose($MG_aGraph[$iGraph][0][$MG_a_hMainGrid_Pen])
    $MG_aGraph[$iGraph][0][$MG_a_hMainGrid_Pen] = _GDIPlus_PenCreate($vColorCode, $MG_aGraph[$iGraph][0][$MG_a_iMainGrid_Width])


    ; Return Value: Successful
    Return (0)


EndFunc   ;==>_MG_Graph_Options_MainGridLines








; #FUNCTION# ;============================================================================================================================================
;
; Name...........:  _MG_Graph_Options_AuxiliaryGridLines
; Description ..:   Change the Settings the AuxiliaryGridLines im Graphs
; Syntax.........:  _MG_Graph_Options_AuxiliaryGridLines ($iGraph, $bAuxiliaryGrid_Activate, $iAuxiliaryGrid_Spacing_X, $iAuxiliaryGrid_Spacing_Y, $iAuxiliaryGrid_Width, $vAuxiliaryGrid_color, $iAuxiliaryGrid_Transparency)
;
; Parameter .....:  $iGraph                     - Graph Index, and the related settings/options
;                   $bAuxiliaryGrid_Activate        - Activate/deActivate the AuxiliaryGridLines
;                                               | True      AuxiliaryGridLines Show
;                                               | False     AuxiliaryGridLines Not Show
;
;                   $iAuxiliaryGrid_Spacing_X       - the horizontal Spacing between the AuxiliaryGridLines
;                   $iAuxiliaryGrid_Spacing_Y       - the Vertical Spacing between the AuxiliaryGridLines
;                   $iAuxiliaryGrid_Width       - the line width of the grid (in pixels)
;                   $vAuxiliaryGrid_color           - the color (RGB) of the FrameBorder in Hex-representation (z.B. for Grau: 0x777777)
;                   $iAuxiliaryGrid_Transparency    - the transparency of the AuxiliaryGridLines used ( 0 to 255)
;                                               | 0         No Transparency
;                                       &nb