Jump to content

GDI+ Gauges


Recommended Posts

Hello folks, I've been working on a couple of GDI+ gauges, they need a bit of polish here and there I'd appreciate it if you guys/girls could play around and give me some suggestions. Cheers.

 

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=Gauges With Sliders.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>
#include <GDIplus.au3>
#include <ColorConstants.au3>
#include <Array.au3>

Global Const $width = @DesktopWidth * 3 / 4
Global Const $height = @DesktopHeight
Global $title = "GDI+"

; Build your GUI here
Opt("GUIOnEventMode", 1)
Global $hwnd = GUICreate($title, @DesktopWidth, @DesktopHeight, -1, -1, $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "close")
GUISetState()


#Region Sliders

Global $VariableMaxValue = 100
Global $SecondaryMaxValue = 100
Global $VariableMinValue = 0
Global $HexLabel = GUICtrlCreateLabel("Hex Value: ", @DesktopWidth - 300, 50, 150, 20)
GUICtrlSetColor($HexLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSliderThick = GUICtrlCreateSlider(@DesktopWidth - 300, 100, 250, 20)
GUICtrlSetLimit(-1, 240, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $ThickLabel = GUICtrlCreateLabel("Thickness Value: " & GUICtrlRead($idSliderThick), @DesktopWidth - 300, 120, 150, 20)
GUICtrlSetColor($ThickLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSliderVal = GUICtrlCreateSlider(@DesktopWidth - 300, 150, 250, 20)
GUICtrlSetLimit(-1, $VariableMaxValue, $VariableMinValue) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $ValLabel = GUICtrlCreateLabel("Variable Value: " & GUICtrlRead($idSliderVal), @DesktopWidth - 300, 170, 150, 20)
GUICtrlSetColor($ValLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSliderScale = GUICtrlCreateSlider(@DesktopWidth - 300, 200, 250, 20)
GUICtrlSetLimit(-1, 20, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $ScaleLabel = GUICtrlCreateLabel("Scale Value: " & (GUICtrlRead($idSliderScale) * .1), @DesktopWidth - 300, 220, 150, 20)
GUICtrlSetColor($ScaleLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idStartAngleScale = GUICtrlCreateSlider(@DesktopWidth - 300, 250, 250, 20)
GUICtrlSetLimit(-1, 360, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $StartAngleLabel = GUICtrlCreateLabel("Angle Value: " & GUICtrlRead($idStartAngleScale), @DesktopWidth - 300, 270, 150, 20)
GUICtrlSetColor($StartAngleLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSweepScale = GUICtrlCreateSlider(@DesktopWidth - 300, 300, 250, 20)
GUICtrlSetLimit(-1, 360, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $SweepLabel = GUICtrlCreateLabel("Sweep Value: " & GUICtrlRead($idSweepScale), @DesktopWidth - 300, 320, 150, 20)
GUICtrlSetColor($SweepLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idCheckmarksScale = GUICtrlCreateSlider(@DesktopWidth - 300, 350, 250, 20)
GUICtrlSetLimit(-1, 20, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $CheckmarkLabel = GUICtrlCreateLabel("No. of Checkmarks: " & GUICtrlRead($idCheckmarksScale), @DesktopWidth - 300, 370, 150, 20)
GUICtrlSetColor($CheckmarkLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idVarMin = GUICtrlCreateSlider(@DesktopWidth - 300, 450, 250, 20)
GUICtrlSetLimit(-1, 0, -50) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $MinLabel = GUICtrlCreateLabel("Min Value: " & GUICtrlRead($idVarMin), @DesktopWidth - 300, 470, 150, 20)
GUICtrlSetColor($MinLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $RadioGroup1 = GUICtrlCreateGroup("", @DesktopWidth - 300, 500, 200, 50)
Global $clockwiseCtrl = GUICtrlCreateRadio("Clockwise", @DesktopWidth - 280, 520, 80, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $antiClockwiseCtrl = GUICtrlCreateRadio("Anti-clockwise", @DesktopWidth - 200, 520, 85, 20)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $RadioGroup2 = GUICtrlCreateGroup("", @DesktopWidth - 300, 550, 200, 50)
Global $RadialCtrl = GUICtrlCreateRadio("Radial", @DesktopWidth - 280, 570, 80, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $SquareCtrl = GUICtrlCreateRadio("Linear", @DesktopWidth - 200, 570, 85, 20)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
GUICtrlSetData($idSliderThick, 35)
GUICtrlSetData($idSliderScale, 10)
GUICtrlSetData($idStartAngleScale, 180)
GUICtrlSetData($idSweepScale, 180)
GUICtrlSetData($idCheckmarksScale, 10)
#EndRegion Sliders

GUISetBkColor(0x303030)
Global $aWindowSize = WinGetClientSize($hwnd)


; Load your GDI+ resources here:
_GDIPlus_Startup()
Global $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
Global $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
Global $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)


While 1
    _GDIPlus_GraphicsClear($backbuffer, 0xFF303030)
    Sleep(50)

    #Region Test Variables
    Global $Thickness = GUICtrlRead($idSliderThick)
    Global $Variable = GUICtrlRead($idSliderVal)
    Global $tValue = 0xFF000000
    Global $rValue = 0x00FF0000
    Global $gValue = BitShift((255 - (($Variable / $VariableMaxValue) * 255)), -8)
    Global $bValue = 0x00
    Global $ScalingFactor = GUICtrlRead($idSliderScale) / 10
    GUICtrlSetData($HexLabel, "Hex Value: " & HEX(BitOR($tValue, $rValue, $gValue, $bValue)))
    Global $PenColour = ("0x" & HEX(BitOR($tValue, $rValue, $gValue, $bValue)))
    GUICtrlSetData($ValLabel, "Variable Value: " & GUICtrlRead($idSliderVal))
    GUICtrlSetData($ThickLabel, "Thickness Value: " & GUICtrlRead($idSliderThick))
    GUICtrlSetData($ScaleLabel, "Scale Value: " & (GUICtrlRead($idSliderScale) * .1))
    GUICtrlSetData($StartAngleLabel, "Angle Value: " & GUICtrlRead($idStartAngleScale))
    GUICtrlSetData($SweepLabel, "Sweep Value: " & GUICtrlRead($idSweepScale))
    GUICtrlSetData($CheckmarkLabel, "No. Of Checkmarks: " & GUICtrlRead($idCheckmarksScale))
    GUICtrlSetData($MinLabel, "Min Value: " & GUICtrlRead($idVarMin))
    GUICtrlSetLimit($idSliderVal, $VariableMaxValue, $VariableMinValue)
    Local $Radius = 300
    If GUICtrlRead($clockwiseCtrl) = $GUI_CHECKED Then
        Local $Clockwise = True
    Else
        Local $Clockwise = False
    EndIf
    Local $StartAngle = GUICtrlRead($idStartAngleScale)
    Local $SweepAngle = GUICtrlRead($idSweepScale)
    Local $CentrePointX = 500
    Local $CentrePointY = 500
    Local $NoOfCheckmarks = GUICtrlRead($idCheckmarksScale)
    Local $CheckLength = 15
    Local $AllowedLimit = 75
    Local $VariableLimit = True
    Local $VariableMinValue = GUICtrlRead($idVarMin)
    #EndRegion Test Variables

    #Region Function Call
    If GUICtrlRead($RadialCtrl) = $GUI_CHECKED Then
        _GDIPlus_GraphicsDrawPath($backbuffer, _Gauges_DrawRadialGauge($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $VariableLimit, $AllowedLimit, $VariableMinValue))
        GUICtrlSetState($idSliderThick, $GUI_SHOW)
        GUICtrlSetState($ThickLabel, $GUI_SHOW)
        GUICtrlSetState($idStartAngleScale, $GUI_SHOW)
        GUICtrlSetState($StartAngleLabel, $GUI_SHOW)
        GUICtrlSetState($idSweepScale, $GUI_SHOW)
        GUICtrlSetState($SweepLabel, $GUI_SHOW)
        GUICtrlSetState($RadioGroup1, $GUI_SHOW)
        GUICtrlSetState($clockwiseCtrl, $GUI_SHOW)
        GUICtrlSetState($antiClockwiseCtrl, $GUI_SHOW)
    Else
        _GDIPlus_GraphicsDrawPath($backbuffer, _Gauges_DrawLinearGauge($backbuffer, $CentrePointX, $CentrePointY, 600, 100, $Variable, $ScalingFactor, $NoOfCheckmarks, $CheckLength, $VariableMaxValue, $VariableLimit, $AllowedLimit, $VariableMinValue))
        GUICtrlSetState($idSliderThick, $GUI_HIDE)
        GUICtrlSetState($ThickLabel, $GUI_HIDE)
        GUICtrlSetState($idStartAngleScale, $GUI_HIDE)
        GUICtrlSetState($StartAngleLabel, $GUI_HIDE)
        GUICtrlSetState($idSweepScale, $GUI_HIDE)
        GUICtrlSetState($SweepLabel, $GUI_HIDE)
        GUICtrlSetState($RadioGroup1, $GUI_HIDE)
        GUICtrlSetState($clockwiseCtrl, $GUI_HIDE)
        GUICtrlSetState($antiClockwiseCtrl, $GUI_HIDE)
    EndIf
    #EndRegion Function Call

    _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $width, $height)
WEnd

Func close()
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>close


#Region Functions

#Region Draw Linear Gauge
; #FUNCTION# ====================================================================================================================
; Name...........: _Gauges_DrawLinearGauge
; Description ...: Creates a horizontal or vertical gauge in the graphics backbuffer
; Syntax.........: _Gauges_DrawLinearGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, [$ScalingFactor = 1, [$NoOfCheckmarks = 6, [$CheckLength = 20,
;                   + [$VariableMaxValue = 256, [$VariableLimit = False, [$AllowedLimit = 0,  [$VariableMinValue = 0]]]]]]] )
; Parameters ....:  $backbuffer             - [byref] The graphics object to draw the gauge to.
;                           $CentrePointX           - The horizontal coordinate of the centre of the gauge.
;                           $CentrePointY           - The vertical coordinate of the centre of the gauge.
;                           $GaugeWidth             - The width of the gauge (Duh).
;                           $GaugeHeight        - The height of the gauge.
;                           $Variable               - The variable used to change the gauge.
;                           $ScalingFactor          - [optional] Scales the gauge by this factor. Default is 1, i.e. no scaling.
;                           $NoOfCheckmarks - [optional] The number of dashes indicating a scale around the gauge. Default is 6.
;                           $CheckLength            - [optional] The length of the checkmarks in pixels. Default is 20.
;                           $VariableMaxValue   - [optional] The maximum value of the variable. Default is 256.
;                           $VariableLimit          - [optional] Boolean, if TRUE, displays a red limit indicator on the scale. Default is FALSE.
;                           $AllowedLimit           -[optional] The value of the above limit if it is drawn. Default is 0.
;                           $VariableMinValue   -[optional] The minimum value of the variable. Only used if negative numbers are required. Default is 0.
; Author ........: Simon Renardson (Sidley)
; Modified.......:
; Remarks .......:  There is a more comprehensive function available, but I deemed it overkill for the majority of people.
; Related .......:  _GDIPlus_
; Example .......: Yes
; ===============================================================================================================================
;Draw a Linear gauge to the screen
Func _Gauges_DrawLinearGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, $ScalingFactor = 1, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = False, $AllowedLimit = 0,  $VariableMinValue = 0)
If $Variable >= 0 Then
        Local $BrushColour = ("0xFF4BF221")
    Else
        Local $BrushColour = ("0xFFFF0000")
    EndIf
    If $GaugeWidth >= $GaugeHeight Then
        Local $GaugeBrush = _GDIPlus_HatchBrushCreate(1, 0x00000000, $BrushColour) ;Set to vertical hatch if the gauge is horizontal
    Else
        Local $GaugeBrush = _GDIPlus_HatchBrushCreate(0, 0x00000000, $BrushColour) ;Set to horizontal hatch if the gauge is vertical
    EndIf
    Local $TextBrush = _GDIPlus_BrushCreateSolid($BrushColour)
    Local $Path = _GDIPlus_PathCreate()
    Local $hPen = _GDIPlus_PenCreate("0xFF96A29F", 2 * $ScalingFactor) ; Off-white pen for outlines
    Local $AllowedPen = _GDIPlus_PenCreate("0xFFFF0000", 8 * $ScalingFactor) ;Red pen for allowed speed indicators

    If $GaugeWidth >= $GaugeHeight Then ;If the gauge is to be length wise
        _GDIPlus_PathAddLine($Path, $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor), ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor), $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor) + ($Variable * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor))
        _GDIPlus_PathAddLine($Path, $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor) + ($Variable * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointY - ($GaugeHeight / 2) * $ScalingFactor), $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor), ($CentrePointY - ($GaugeHeight / 2) * $ScalingFactor))
        _GDIPlus_PathCloseFigure($Path)
    Else ;If the gauge is to be height wise
        _GDIPlus_PathAddLine($Path, ($CentrePointX + ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointX + ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) - $Variable * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor)
        _GDIPlus_PathAddLine($Path, ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) - $Variable * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor))
        _GDIPlus_PathCloseFigure($Path)
    EndIf
    _GDIPlus_GraphicsFillPath($backbuffer, $Path, $GaugeBrush) ;Draw the gauge

    _DrawBar($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, $hPen, $ScalingFactor) ;Draw the outline for the gauge
    _DrawLinearGaugeCheckMarks($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $hPen) ;Draw the checkmarks for the gauge
    If $VariableLimit Then
        _DrawLinearAllowedSpeed($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $AllowedLimit, $AllowedPen, $ScalingFactor, $VariableLimit) ;Draw the allowed speed indicator(s) for the gauge
    EndIf
    _LinearGaugeText($backbuffer, $Variable, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $TextBrush) ;Put the gauge text above the gauge

    _GDIPlus_PathDispose($Path) ;Tidy up
    _GDIPlus_BrushDispose($GaugeBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($AllowedPen)
    _GDIPlus_BrushDispose($TextBrush)
EndFunc   ;==>_DrawLinearGauge

;Draw the text for the main gauge
Func _LinearGaugeText(ByRef $backbuffer, $Variable, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, ByRef $TextBrush)
    Local $FontSize = 80 * $ScalingFactor ;Linear gauge font size
    Local $Path = _GDIPlus_PathCreate()
    Local $Format = _GDIPlus_StringFormatCreate()
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") ;Centre text font
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    _GDIPlus_StringFormatSetAlign($Format, 2) ;Right align
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2) ;Change smoothing mode for text
    If $GaugeWidth >= $GaugeHeight Then
        Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($FontSize * $ScalingFactor / 2), $CentrePointY - ($GaugeHeight / 2 * $ScalingFactor) - $FontSize * 1.5 * $ScalingFactor) ;Set text position for inner text
    Else
        Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - $FontSize * 2, ($CentrePointY - $FontSize * $ScalingFactor / 2)) ;Set text positionfor inner text
    EndIf
    _GDIPlus_PathAddString($Path, $Variable, $Layout, $Family, 0, $FontSize * $ScalingFactor)

    _GDIPlus_GraphicsFillPath($backbuffer, $Path, $TextBrush)

    $Layout = 0
    _GDIPlus_PathDispose($Path)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_LinearGaugeText

;Draw the outline of the gauge
Func _DrawBar(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, ByRef $hPen, $ScalingFactor = 1)
    Local $Path = _GDIPlus_PathCreate()

    _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor)
    _GDIPlus_PathAddLine($Path, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor)
    _GDIPlus_PathCloseFigure($Path)
    If $GaugeWidth >= $GaugeHeight Then
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $hPen)
    Else
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), $CentrePointX + ($GaugeWidth / 2 * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), $hPen)
    EndIf
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) ;Draw the outline

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawBar

;Draw the checkmarks
Func _DrawLinearGaugeCheckMarks(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, ByRef $hPen)
    Local $TextBrush = _GDIPlus_BrushCreateSolid("0xFFFFFFFF") ;Solid white brush for the checkmarks
    Local $aPoints[$NoOfCheckmarks][2] ;Two cartesian coordinates for each checkmark
    Local $aMarkText[$NoOfCheckmarks] ; The text for each checkmark
    ;Create the font for the checkmarks
    Local $FontSize = 15 * $ScalingFactor ;The font size (Scaled)
    Local $Format = _GDIPlus_StringFormatCreate()
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB")
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    For $i = 0 to($NoOfCheckmarks - 1)
        $aMarkText[$i] = Round($VariableMinValue + (($VariableMaxValue - $VariableMinValue) / ($NoOfCheckmarks - 1)) * $i)
    Next

    If $GaugeWidth >= $GaugeHeight Then
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor, $hPen)
        For $i = 0 to($NoOfCheckmarks - 1) ;Set the coordinates of each checkmark
            $aPoints[$i][0] = ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor) + ($GaugeWidth * $ScalingFactor / ($NoOfCheckmarks - 1)) * $i ;Set x position depending on the number of checkmarks and the length of the gauge
            $aPoints[$i][1] = $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor ;Height remains uniform
        Next
        For $i = 0 to($NoOfCheckmarks - 1)
            _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][0], ($aPoints[$i][1] - $CheckLength * $ScalingFactor), $hPen) ;Draw a line $Checklength long
            $Layout = _GDIPlus_RectFCreate(($aPoints[$i][0] - $FontSize), ($aPoints[$i][1] - $CheckLength * $ScalingFactor - ($FontSize * 1.5) * $ScalingFactor), 0, 0)
            _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush) ;Draw the sext for the checkmark
        Next
    Else
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - 10 * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - 10 * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $hPen)
        For $i = 0 to($NoOfCheckmarks - 1)
            $aPoints[$i][0] = $CentrePointX - ($GaugeWidth / 2 + 10) * $ScalingFactor
            $aPoints[$i][1] = ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) - ($GaugeHeight * $ScalingFactor / ($NoOfCheckmarks - 1)) * $i
        Next
        For $i = 0 to($NoOfCheckmarks - 1)
            _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][0] - $CheckLength * $ScalingFactor, $aPoints[$i][1], $hPen)
            $Layout = _GDIPlus_RectFCreate(($aPoints[$i][0] - $CheckLength * $ScalingFactor - $FontSize * 2.5), $aPoints[$i][1] - $FontSize / 1.5, 0, 0)
            _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush)
        Next
    EndIf

    $Layout = 0
    _GDIPlus_BrushDispose($TextBrush)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_DrawLinearGaugeCheckMarks

Func _DrawLinearAllowedSpeed(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $MaxValue, $AllowedLimit, ByRef $AllowedPen, $ScalingFactor, $PrimaryAllowedSpeed)
    Local $Path = _GDIPlus_PathCreate()

    If $PrimaryAllowedSpeed Then
        If $GaugeWidth >= $GaugeHeight Then
            _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 15) * $ScalingFactor + 3 * $ScalingFactor, ($CentrePointX - (($GaugeWidth / 2) * $ScalingFactor)) + ($GaugeWidth * $AllowedLimit / 100 * $ScalingFactor), $CentrePointY - ($GaugeHeight / 2 + 15) * $ScalingFactor + 3 * $ScalingFactor)
        Else
            _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - 10 * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - 10 * $ScalingFactor, ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) - ($GaugeHeight * $AllowedLimit / 100 * $ScalingFactor))
        EndIf
    EndIf

    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $AllowedPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawLinearAllowedSpeed
#EndRegion Draw Linear Gauge

#Region Draw Radial Gauge
; #FUNCTION# ====================================================================================================================
; Name...........: _Gauges_DrawRadialGauge
; Description ...: Creates a radial gauge in the graphics backbuffer
; Syntax.........: _Gauges_DrawRadialGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor = 1, $Clockwise = True, $StartAngle = 0,
;                   + $SweepAngle = 180, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = True, $AllowedLimit = 0, $VariableMinValue = 0)
; Parameters ....:  $backbuffer             - [byref] The graphics object to draw the gauge to.
;                           $CentrePointX           - The horizontal coordinate of the centre of the gauge.
;                           $CentrePointY           - The vertical coordinate of the centre of the gauge.
;                           $Radius                     - The radius of the outer edge of the gauge.
;                           $Thickness              - The thickness of the gauge in pixels.
;                           $Variable               - The variable used to change the gauge.
;                           $ScalingFactor          - [optional] Scales the gauge by this factor. Default is 1, i.e. no scaling.
;                           $Clockwise              - [optional] Boolean, determines whether the gauge fills clockwise or anti-clockwise. Default is TRUE, i.e. clockwise.
;                           $StartAngle             - [optional] The starting angle of the gauge. Default is 0 (East).
;                           $SweepAngle         - [optional] The sweep angle of the gauge (How many degrees it rotates through). The default is 180.
;                           $NoOfCheckmarks - [optional] The number of dashes indicating a scale around the gauge. Default is 6.
;                           $CheckLength            - [optional] The length of the checkmarks in pixels. Default is 20.
;                           $VariableMaxValue   - [optional] The maximum value of the variable. Default is 256.
;                           $VariableLimit          - [optional] Boolean, if TRUE, displays a red limit indicator on the scale. Default is FALSE.
;                           $AllowedLimit           -[optional] The value of the above limit if it is drawn. Default is 0.
;                           $VariableMinValue   -[optional] The minimum value of the variable. Only used if negative numbers are required. Default is 0.
; Author ........: Simon Renardson (Sidley)
; Modified.......:
; Remarks .......:  There is a more comprehensive function available, but I deemed it overkill for the majority of people.
; Related .......:  _GDIPlus_
; Example .......: Yes
; ===============================================================================================================================
;Draw Gauge (Speed/Load Level)
;Creates Completed Radial Gauge
;~ _DrawRadialGauge($CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, [$ScalingFactor = 1, [$Clockwise = True, [$StartAngle = 0, [$SweepAngle = 180, [$MaxValue = 256, [$NoOfCheckmarks = 10, [$CheckLength = 20]]]]]]])
Func _Gauges_DrawRadialGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor = 1, $Clockwise = True, $StartAngle = 0, $SweepAngle = 180, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = True, $AllowedLimit = 0, $VariableMinValue = 0)
Local $BrushColour = ("0x" & HEX(BitOR(0xFFFF0000, BitShift((255 - (($Variable / $VariableMaxValue) * 255)), -8))))
    Local $GaugeBrush = _GDIPlus_HatchBrushCreate(39, 0xFF000000, $BrushColour)
    Local $TextBrush = _GDIPlus_BrushCreateSolid($BrushColour)
    Local $Path = _GDIPlus_PathCreate()
    Local $hPen = _GDIPlus_PenCreate("0xFF96A29F", 2 * $ScalingFactor) ;Pen colour
    Local $AllowedPen = _GDIPlus_PenCreate("0xFFFF0000", 10 * $ScalingFactor)
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2) ;TODO may need to be removed

    If $Clockwise Then ;If clockwise rotation
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)), $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)) ;Add outer arc of gauge
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc by the thickness of the gauge
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)) + ($Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)), (-1 * $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue))) ;Add inner arc of Gauge
    Else ;If anti-clockwise rotation
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)), (-1 * $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue))) ;Add outer arc of gauge
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arcby the thickness of the gauge
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)) - ($Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)), $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)) ;Add inner arc of Gauge
    EndIf
    $Radius += ($Thickness * $ScalingFactor) ;Return radius to original size
    _GDIPlus_PathCloseFigure($Path) ;Close the two arcs
    _GDIPlus_GraphicsFillPath($backbuffer, $Path, $GaugeBrush) ;Fill the gauge and centre text with colour
    _DrawRadialGaugeText($backbuffer, $Variable, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, $TextBrush) ;Draw the centre text
    _DrawGaugeOutline($backbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $hPen) ;Draw the gauge outline
    _DrawIndicators($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale arc
    _DrawCheckMarks($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale checkmarks
    If $VariableLimit Then
        _DrawRadialAllowedSpeed($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $AllowedLimit, $AllowedPen, True) ;Draw allowed speed limits
    EndIf

    _GDIPlus_PathDispose($Path) ;Tidy up
    _GDIPlus_BrushDispose($GaugeBrush)
    _GDIPlus_BrushDispose($TextBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($AllowedPen)
EndFunc   ;==>_DrawRadialGauge

;Draw Variable Value (Text, Load/Speed Value)
;Creates The Centre Text of the Radial Gauge
;~ Func _DrawRadialGaugeText($ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor)
Func _DrawRadialGaugeText(ByRef $backbuffer, $ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, ByRef $TextBrush)
    Local $FontSize = 180 * $ScalingFactor ;Default font size (Scaled)
    Local $Text = _GDIPlus_PathCreate()
    Local $Format = _GDIPlus_StringFormatCreate()
    _GDIPlus_StringFormatSetAlign($Format, 2) ;Align right (Doesn't seem to make a difference)
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") ;Centre text font
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($FontSize / 1.3) * $ScalingFactor, $CentrePointY - $FontSize * $ScalingFactor / 2) ;Set position (Top left)
    _GDIPlus_PathAddString($Text, Round($ValueText, 1), $Layout, $Family, 0, $FontSize * $ScalingFactor) ;Add value to path (To 1 decimal place)
    _GDIPlus_GraphicsFillPath($backbuffer, $Text, $TextBrush)

    $Layout = 0 ;Tidy up
    _GDIPlus_PathDispose($Text)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_DrawRadialGaugeText

;Draw Gauge Outline
;Creates the Outline of the Radial Gauge
;~ Func _DrawGaugeOutline($CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle)
Func _DrawGaugeOutline(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, ByRef $hPen)
    Local $Path = _GDIPlus_PathCreate()
    Local Const $PI = 3.141592653589793


    $Radius += 2 ;Put the outline 2 px outside the gauge
    If $Clockwise Then ;If the gauge is to be filled clockwise
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle)
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX + ($Radius * $ScalingFactor * Cos(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointY + ($Radius * $ScalingFactor * Sin(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointX + (($Radius - ($Thickness * $ScalingFactor) - (4 * $ScalingFactor)) * Cos(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)))) * $ScalingFactor), $CentrePointY + (($Radius - ($Thickness * $ScalingFactor) - 4) * $ScalingFactor * Sin(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $hPen)
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc
        $Radius -= 4
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), ($StartAngle + $SweepAngle), -$SweepAngle)
    Else
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle)
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX + ($Radius * $ScalingFactor * Cos(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointY + ($Radius * $ScalingFactor * Sin(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointX + (($Radius - ($Thickness * $ScalingFactor) - (4 * $ScalingFactor)) * Cos(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)))) * $ScalingFactor), $CentrePointY + (($Radius - ($Thickness * $ScalingFactor) - 4) * $ScalingFactor * Sin(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $hPen)
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc
        $Radius -= 4
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $SweepAngle, $SweepAngle)
    EndIf
    _GDIPlus_PathCloseFigure($Path) ;Close the path
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) ;Draw the path
    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawGaugeOutline

;Draw Scale(s)
;Creates a number of indicative markings around the centre of the radial gauge
;~ Func _DrawIndicators($CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle)
Func _DrawIndicators(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, ByRef $hPen, $Inside)
    Local $Path = _GDIPlus_PathCreate()
    $Radius -= ($Thickness + 20) * $ScalingFactor
    If $Clockwise Then
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle)
    Else ;Doesn't make much difference, but it will be 180 degrees out
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle)
    EndIf
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawIndicators

;Draw the allowed speed marker
Func _DrawRadialAllowedSpeed(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, _
        $AllowedLimit, ByRef $AllowedPen, $Inside)
    Local $Path = _GDIPlus_PathCreate()
    $Radius -= ($Thickness + 24) * $ScalingFactor
    If $Clockwise Then ;Display in a clockwise direction
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle * $AllowedLimit / 100)
    ElseIf NOT $Clockwise Then ;Display in an anti-clockwise direction
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle * $AllowedLimit / 100)
    EndIf
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $AllowedPen) ;Draw with the red pen ($AllowedPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawRadialAllowedSpeed

;DrawCheckmarks (Checkmarks)
;Creates the checkmarks and text around the indicator gauge
;~ Func _DrawCheckMarks($CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $MaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen)
Func _DrawCheckMarks(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, _
        $SweepAngle, ByRef $hPen, $Inside)
    Local Const $PI = 3.141592653589793
    Local $TextBrush = _GDIPlus_BrushCreateSolid("0xFFFFFFFF")
    Local $aPoints[$NoOfCheckmarks][4] ;Creates an array of four points for each check line
    Local $aMarkText[$NoOfCheckmarks] ;Creates the text for the checkmarks

    $Radius -= ($Thickness + 20) * $ScalingFactor
    For $i = 0 to ($NoOfCheckmarks-1)
        $aMarkText[$i] = Round((($VariableMaxValue - $VariableMinValue) / ($NoOfCheckmarks - 1)) * $i) + $VariableMinValue ;Round checkmark values to one decimal place
    Next

    Local $aAngles[$NoOfCheckmarks] = [] ;Create an array to hold the angles at which the checkmarks should be
    If $Clockwise Then
        For $i = 0 to($NoOfCheckmarks - 1)
            $aAngles[$i] = $StartAngle + (($SweepAngle / ($NoOfCheckmarks - 1)) * $i) ;Spread out checkmarks evenly over the gauge
        Next
    Else ;For anticlockwise filling gauge
        For $i = 0 to($NoOfCheckmarks - 1)
            $aAngles[$i] = $StartAngle - (($SweepAngle / ($NoOfCheckmarks - 1)) * $i) ;Spread out checkmarks evenly over the gauge
        Next
    EndIf

    For $i = 0 to($NoOfCheckmarks - 1)
        $aAngles[$i] = $aAngles[$i] * $PI / 180 ;Convert degrees to radians
        $aPoints[$i][0] = $CentrePointX + ($Radius * Cos($aAngles[$i]) * $ScalingFactor) ;Create cartesian coordinates for the check lines from polar coordinates (Radius, angle)
        $aPoints[$i][1] = $CentrePointY + ($Radius * Sin($aAngles[$i]) * $ScalingFactor)
        $aPoints[$i][2] = $CentrePointX + (($Radius - ($CheckLength * $ScalingFactor)) * Cos($aAngles[$i]) * $ScalingFactor)
        $aPoints[$i][3] = $CentrePointY + (($Radius - ($CheckLength * $ScalingFactor)) * Sin($aAngles[$i]) * $ScalingFactor)
    Next
    ;Font data for checkmark text
    Local $Format = _GDIPlus_StringFormatCreate()
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB")
    Local $FontSize = 15
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize * $ScalingFactor, 2)
    For $i = 0 to($NoOfCheckmarks - 1) ;For each checkmark
        _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][2], $aPoints[$i][3], $hPen) ;Draw the lines
        $Layout = _GDIPlus_RectFCreate($aPoints[$i][2] - ($FontSize * Cos($aAngles[$i])) - (18 * $ScalingFactor), $aPoints[$i][3] - ($FontSize * Sin($aAngles[$i]) + 10), 0, 0)
        _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush)
    Next

    $Layout = 0
    _GDIPlus_BrushDispose($TextBrush)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_DrawCheckMarks
#EndRegion Draw Radial Gauge

#EndRegion Functions

 

Link to comment
Share on other sites

The code above has an error in the parameter order. Sorry about that, this should make it look less like an acid trip 😀

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=Gauges With Sliders.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>
#include <GDIplus.au3>
#include <ColorConstants.au3>
#include <Array.au3>

Global Const $width = @DesktopWidth * 3 / 4
Global Const $height = @DesktopHeight
Global $title = "GDI+"

; Build your GUI here
Opt("GUIOnEventMode", 1)
Global $hwnd = GUICreate($title, @DesktopWidth, @DesktopHeight, -1, -1, $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "close")
GUISetState()


#Region Sliders

Global $VariableMaxValue = 100
Global $SecondaryMaxValue = 100
Global $VariableMinValue = 0
Global $HexLabel = GUICtrlCreateLabel("Hex Value: ", @DesktopWidth - 300, 50, 150, 20)
GUICtrlSetColor($HexLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSliderThick = GUICtrlCreateSlider(@DesktopWidth - 300, 100, 250, 20)
GUICtrlSetLimit(-1, 240, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $ThickLabel = GUICtrlCreateLabel("Thickness Value: " & GUICtrlRead($idSliderThick), @DesktopWidth - 300, 120, 150, 20)
GUICtrlSetColor($ThickLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSliderVal = GUICtrlCreateSlider(@DesktopWidth - 300, 150, 250, 20)
GUICtrlSetLimit(-1, $VariableMaxValue, $VariableMinValue) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $ValLabel = GUICtrlCreateLabel("Variable Value: " & GUICtrlRead($idSliderVal), @DesktopWidth - 300, 170, 150, 20)
GUICtrlSetColor($ValLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSliderScale = GUICtrlCreateSlider(@DesktopWidth - 300, 200, 250, 20)
GUICtrlSetLimit(-1, 20, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $ScaleLabel = GUICtrlCreateLabel("Scale Value: " & (GUICtrlRead($idSliderScale) * .1), @DesktopWidth - 300, 220, 150, 20)
GUICtrlSetColor($ScaleLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idStartAngleScale = GUICtrlCreateSlider(@DesktopWidth - 300, 250, 250, 20)
GUICtrlSetLimit(-1, 360, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $StartAngleLabel = GUICtrlCreateLabel("Angle Value: " & GUICtrlRead($idStartAngleScale), @DesktopWidth - 300, 270, 150, 20)
GUICtrlSetColor($StartAngleLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idSweepScale = GUICtrlCreateSlider(@DesktopWidth - 300, 300, 250, 20)
GUICtrlSetLimit(-1, 360, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $SweepLabel = GUICtrlCreateLabel("Sweep Value: " & GUICtrlRead($idSweepScale), @DesktopWidth - 300, 320, 150, 20)
GUICtrlSetColor($SweepLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idCheckmarksScale = GUICtrlCreateSlider(@DesktopWidth - 300, 350, 250, 20)
GUICtrlSetLimit(-1, 20, 0) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $CheckmarkLabel = GUICtrlCreateLabel("No. of Checkmarks: " & GUICtrlRead($idCheckmarksScale), @DesktopWidth - 300, 370, 150, 20)
GUICtrlSetColor($CheckmarkLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $idVarMin = GUICtrlCreateSlider(@DesktopWidth - 300, 450, 250, 20)
GUICtrlSetLimit(-1, 0, -50) ; change min/max value
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $MinLabel = GUICtrlCreateLabel("Min Value: " & GUICtrlRead($idVarMin), @DesktopWidth - 300, 470, 150, 20)
GUICtrlSetColor($MinLabel, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $RadioGroup1 = GUICtrlCreateGroup("", @DesktopWidth - 300, 500, 200, 50)
Global $clockwiseCtrl = GUICtrlCreateRadio("Clockwise", @DesktopWidth - 280, 520, 80, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $antiClockwiseCtrl = GUICtrlCreateRadio("Anti-clockwise", @DesktopWidth - 200, 520, 85, 20)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $RadioGroup2 = GUICtrlCreateGroup("", @DesktopWidth - 300, 550, 200, 50)
Global $RadialCtrl = GUICtrlCreateRadio("Radial", @DesktopWidth - 280, 570, 80, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
Global $SquareCtrl = GUICtrlCreateRadio("Linear", @DesktopWidth - 200, 570, 85, 20)
GUICtrlSetColor(-1, $COLOR_WHITE)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER)
GUICtrlSetData($idSliderThick, 35)
GUICtrlSetData($idSliderScale, 10)
GUICtrlSetData($idStartAngleScale, 180)
GUICtrlSetData($idSweepScale, 180)
GUICtrlSetData($idCheckmarksScale, 10)
#EndRegion Sliders

GUISetBkColor(0x303030)
Global $aWindowSize = WinGetClientSize($hwnd)


; Load your GDI+ resources here:
_GDIPlus_Startup()
Global $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
Global $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
Global $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)


While 1
    _GDIPlus_GraphicsClear($backbuffer, 0xFF303030)
    Sleep(50)

    #Region Test Variables
    Global $Thickness = GUICtrlRead($idSliderThick)
    Global $Variable = GUICtrlRead($idSliderVal)
    Global $tValue = 0xFF000000
    Global $rValue = 0x00FF0000
    Global $gValue = BitShift((255 - (($Variable / $VariableMaxValue) * 255)), -8)
    Global $bValue = 0x00
    Global $ScalingFactor = GUICtrlRead($idSliderScale) / 10
    GUICtrlSetData($HexLabel, "Hex Value: " & HEX(BitOR($tValue, $rValue, $gValue, $bValue)))
    Global $PenColour = ("0x" & HEX(BitOR($tValue, $rValue, $gValue, $bValue)))
    GUICtrlSetData($ValLabel, "Variable Value: " & GUICtrlRead($idSliderVal))
    GUICtrlSetData($ThickLabel, "Thickness Value: " & GUICtrlRead($idSliderThick))
    GUICtrlSetData($ScaleLabel, "Scale Value: " & (GUICtrlRead($idSliderScale) * .1))
    GUICtrlSetData($StartAngleLabel, "Angle Value: " & GUICtrlRead($idStartAngleScale))
    GUICtrlSetData($SweepLabel, "Sweep Value: " & GUICtrlRead($idSweepScale))
    GUICtrlSetData($CheckmarkLabel, "No. Of Checkmarks: " & GUICtrlRead($idCheckmarksScale))
    GUICtrlSetData($MinLabel, "Min Value: " & GUICtrlRead($idVarMin))
    GUICtrlSetLimit($idSliderVal, $VariableMaxValue, $VariableMinValue)
    Local $Radius = 300
    If GUICtrlRead($clockwiseCtrl) = $GUI_CHECKED Then
        Local $Clockwise = True
    Else
        Local $Clockwise = False
    EndIf
    Local $StartAngle = GUICtrlRead($idStartAngleScale)
    Local $SweepAngle = GUICtrlRead($idSweepScale)
    Local $CentrePointX = 500
    Local $CentrePointY = 500
    Local $NoOfCheckmarks = GUICtrlRead($idCheckmarksScale)
    Local $CheckLength = 15
    Local $AllowedLimit = 75
    Local $VariableLimit = True
    Local $VariableMinValue = GUICtrlRead($idVarMin)
    #EndRegion Test Variables

    #Region Function Call
    If GUICtrlRead($RadialCtrl) = $GUI_CHECKED Then
        _GDIPlus_GraphicsDrawPath($backbuffer, _Gauges_DrawRadialGauge($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $NoOfCheckmarks, $CheckLength, $VariableMaxValue, $VariableLimit, $AllowedLimit, $VariableMinValue))
        GUICtrlSetState($idSliderThick, $GUI_SHOW)
        GUICtrlSetState($ThickLabel, $GUI_SHOW)
        GUICtrlSetState($idStartAngleScale, $GUI_SHOW)
        GUICtrlSetState($StartAngleLabel, $GUI_SHOW)
        GUICtrlSetState($idSweepScale, $GUI_SHOW)
        GUICtrlSetState($SweepLabel, $GUI_SHOW)
        GUICtrlSetState($RadioGroup1, $GUI_SHOW)
        GUICtrlSetState($clockwiseCtrl, $GUI_SHOW)
        GUICtrlSetState($antiClockwiseCtrl, $GUI_SHOW)
    Else
        _GDIPlus_GraphicsDrawPath($backbuffer, _Gauges_DrawLinearGauge($backbuffer, $CentrePointX, $CentrePointY, 600, 100, $Variable, $ScalingFactor, $NoOfCheckmarks, $CheckLength, $VariableMaxValue, $VariableLimit, $AllowedLimit, $VariableMinValue))
        GUICtrlSetState($idSliderThick, $GUI_HIDE)
        GUICtrlSetState($ThickLabel, $GUI_HIDE)
        GUICtrlSetState($idStartAngleScale, $GUI_HIDE)
        GUICtrlSetState($StartAngleLabel, $GUI_HIDE)
        GUICtrlSetState($idSweepScale, $GUI_HIDE)
        GUICtrlSetState($SweepLabel, $GUI_HIDE)
        GUICtrlSetState($RadioGroup1, $GUI_HIDE)
        GUICtrlSetState($clockwiseCtrl, $GUI_HIDE)
        GUICtrlSetState($antiClockwiseCtrl, $GUI_HIDE)
    EndIf
    #EndRegion Function Call

    _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $width, $height)
WEnd

Func close()
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>close


#Region Functions

#Region Draw Linear Gauge
; #FUNCTION# ====================================================================================================================
; Name...........: _Gauges_DrawLinearGauge
; Description ...: Creates a horizontal or vertical gauge in the graphics backbuffer
; Syntax.........: _Gauges_DrawLinearGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, [$ScalingFactor = 1, [$NoOfCheckmarks = 6, [$CheckLength = 20,
;                   + [$VariableMaxValue = 256, [$VariableLimit = False, [$AllowedLimit = 0,  [$VariableMinValue = 0]]]]]]] )
; Parameters ....:  $backbuffer             - [byref] The graphics object to draw the gauge to.
;                           $CentrePointX           - The horizontal coordinate of the centre of the gauge.
;                           $CentrePointY           - The vertical coordinate of the centre of the gauge.
;                           $GaugeWidth             - The width of the gauge (Duh).
;                           $GaugeHeight        - The height of the gauge.
;                           $Variable               - The variable used to change the gauge.
;                           $ScalingFactor          - [optional] Scales the gauge by this factor. Default is 1, i.e. no scaling.
;                           $NoOfCheckmarks - [optional] The number of dashes indicating a scale around the gauge. Default is 6.
;                           $CheckLength            - [optional] The length of the checkmarks in pixels. Default is 20.
;                           $VariableMaxValue   - [optional] The maximum value of the variable. Default is 256.
;                           $VariableLimit          - [optional] Boolean, if TRUE, displays a red limit indicator on the scale. Default is FALSE.
;                           $AllowedLimit           -[optional] The value of the above limit if it is drawn. Default is 0.
;                           $VariableMinValue   -[optional] The minimum value of the variable. Only used if negative numbers are required. Default is 0.
; Author ........: Simon Renardson (Sidley)
; Modified.......:
; Remarks .......:  There is a more comprehensive function available, but I deemed it overkill for the majority of people.
; Related .......:  _GDIPlus_
; Example .......: Yes
; ===============================================================================================================================
;Draw a Linear gauge to the screen
Func _Gauges_DrawLinearGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, $ScalingFactor = 1, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = False, $AllowedLimit = 0,  $VariableMinValue = 0)
If $Variable >= 0 Then
        Local $BrushColour = ("0xFF4BF221")
    Else
        Local $BrushColour = ("0xFFFF0000")
    EndIf
    If $GaugeWidth >= $GaugeHeight Then
        Local $GaugeBrush = _GDIPlus_HatchBrushCreate(1, 0x00000000, $BrushColour) ;Set to vertical hatch if the gauge is horizontal
    Else
        Local $GaugeBrush = _GDIPlus_HatchBrushCreate(0, 0x00000000, $BrushColour) ;Set to horizontal hatch if the gauge is vertical
    EndIf
    Local $TextBrush = _GDIPlus_BrushCreateSolid($BrushColour)
    Local $Path = _GDIPlus_PathCreate()
    Local $hPen = _GDIPlus_PenCreate("0xFF96A29F", 2 * $ScalingFactor) ; Off-white pen for outlines
    Local $AllowedPen = _GDIPlus_PenCreate("0xFFFF0000", 8 * $ScalingFactor) ;Red pen for allowed speed indicators

    If $GaugeWidth >= $GaugeHeight Then ;If the gauge is to be length wise
        _GDIPlus_PathAddLine($Path, $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor), ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor), $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor) + ($Variable * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor))
        _GDIPlus_PathAddLine($Path, $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor) + ($Variable * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointY - ($GaugeHeight / 2) * $ScalingFactor), $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor), ($CentrePointY - ($GaugeHeight / 2) * $ScalingFactor))
        _GDIPlus_PathCloseFigure($Path)
    Else ;If the gauge is to be height wise
        _GDIPlus_PathAddLine($Path, ($CentrePointX + ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointX + ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) - $Variable * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor)
        _GDIPlus_PathAddLine($Path, ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) - $Variable * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor))
        _GDIPlus_PathCloseFigure($Path)
    EndIf
    _GDIPlus_GraphicsFillPath($backbuffer, $Path, $GaugeBrush) ;Draw the gauge

    _DrawBar($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, $hPen, $ScalingFactor) ;Draw the outline for the gauge
    _DrawLinearGaugeCheckMarks($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $hPen) ;Draw the checkmarks for the gauge
    If $VariableLimit Then
        _DrawLinearAllowedSpeed($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $AllowedLimit, $AllowedPen, $ScalingFactor, $VariableLimit) ;Draw the allowed speed indicator(s) for the gauge
    EndIf
    _LinearGaugeText($backbuffer, $Variable, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $TextBrush) ;Put the gauge text above the gauge

    _GDIPlus_PathDispose($Path) ;Tidy up
    _GDIPlus_BrushDispose($GaugeBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($AllowedPen)
    _GDIPlus_BrushDispose($TextBrush)
EndFunc   ;==>_DrawLinearGauge

;Draw the text for the main gauge
Func _LinearGaugeText(ByRef $backbuffer, $Variable, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, ByRef $TextBrush)
    Local $FontSize = 80 * $ScalingFactor ;Linear gauge font size
    Local $Path = _GDIPlus_PathCreate()
    Local $Format = _GDIPlus_StringFormatCreate()
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") ;Centre text font
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    _GDIPlus_StringFormatSetAlign($Format, 2) ;Right align
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2) ;Change smoothing mode for text
    If $GaugeWidth >= $GaugeHeight Then
        Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($FontSize * $ScalingFactor / 2), $CentrePointY - ($GaugeHeight / 2 * $ScalingFactor) - $FontSize * 1.5 * $ScalingFactor) ;Set text position for inner text
    Else
        Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - $FontSize * 2, ($CentrePointY - $FontSize * $ScalingFactor / 2)) ;Set text positionfor inner text
    EndIf
    _GDIPlus_PathAddString($Path, $Variable, $Layout, $Family, 0, $FontSize * $ScalingFactor)

    _GDIPlus_GraphicsFillPath($backbuffer, $Path, $TextBrush)

    $Layout = 0
    _GDIPlus_PathDispose($Path)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_LinearGaugeText

;Draw the outline of the gauge
Func _DrawBar(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, ByRef $hPen, $ScalingFactor = 1)
    Local $Path = _GDIPlus_PathCreate()

    _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor)
    _GDIPlus_PathAddLine($Path, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor)
    _GDIPlus_PathCloseFigure($Path)
    If $GaugeWidth >= $GaugeHeight Then
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $hPen)
    Else
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), $CentrePointX + ($GaugeWidth / 2 * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), $hPen)
    EndIf
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) ;Draw the outline

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawBar

;Draw the checkmarks
Func _DrawLinearGaugeCheckMarks(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, ByRef $hPen)
    Local $TextBrush = _GDIPlus_BrushCreateSolid("0xFFFFFFFF") ;Solid white brush for the checkmarks
    Local $aPoints[$NoOfCheckmarks][2] ;Two cartesian coordinates for each checkmark
    Local $aMarkText[$NoOfCheckmarks] ; The text for each checkmark
    ;Create the font for the checkmarks
    Local $FontSize = 15 * $ScalingFactor ;The font size (Scaled)
    Local $Format = _GDIPlus_StringFormatCreate()
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB")
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    For $i = 0 to($NoOfCheckmarks - 1)
        $aMarkText[$i] = Round($VariableMinValue + (($VariableMaxValue - $VariableMinValue) / ($NoOfCheckmarks - 1)) * $i)
    Next

    If $GaugeWidth >= $GaugeHeight Then
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor, $hPen)
        For $i = 0 to($NoOfCheckmarks - 1) ;Set the coordinates of each checkmark
            $aPoints[$i][0] = ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor) + ($GaugeWidth * $ScalingFactor / ($NoOfCheckmarks - 1)) * $i ;Set x position depending on the number of checkmarks and the length of the gauge
            $aPoints[$i][1] = $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor ;Height remains uniform
        Next
        For $i = 0 to($NoOfCheckmarks - 1)
            _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][0], ($aPoints[$i][1] - $CheckLength * $ScalingFactor), $hPen) ;Draw a line $Checklength long
            $Layout = _GDIPlus_RectFCreate(($aPoints[$i][0] - $FontSize), ($aPoints[$i][1] - $CheckLength * $ScalingFactor - ($FontSize * 1.5) * $ScalingFactor), 0, 0)
            _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush) ;Draw the sext for the checkmark
        Next
    Else
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - 10 * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - 10 * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $hPen)
        For $i = 0 to($NoOfCheckmarks - 1)
            $aPoints[$i][0] = $CentrePointX - ($GaugeWidth / 2 + 10) * $ScalingFactor
            $aPoints[$i][1] = ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) - ($GaugeHeight * $ScalingFactor / ($NoOfCheckmarks - 1)) * $i
        Next
        For $i = 0 to($NoOfCheckmarks - 1)
            _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][0] - $CheckLength * $ScalingFactor, $aPoints[$i][1], $hPen)
            $Layout = _GDIPlus_RectFCreate(($aPoints[$i][0] - $CheckLength * $ScalingFactor - $FontSize * 2.5), $aPoints[$i][1] - $FontSize / 1.5, 0, 0)
            _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush)
        Next
    EndIf

    $Layout = 0
    _GDIPlus_BrushDispose($TextBrush)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_DrawLinearGaugeCheckMarks

Func _DrawLinearAllowedSpeed(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $MaxValue, $AllowedLimit, ByRef $AllowedPen, $ScalingFactor, $PrimaryAllowedSpeed)
    Local $Path = _GDIPlus_PathCreate()

    If $PrimaryAllowedSpeed Then
        If $GaugeWidth >= $GaugeHeight Then
            _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 15) * $ScalingFactor + 3 * $ScalingFactor, ($CentrePointX - (($GaugeWidth / 2) * $ScalingFactor)) + ($GaugeWidth * $AllowedLimit / 100 * $ScalingFactor), $CentrePointY - ($GaugeHeight / 2 + 15) * $ScalingFactor + 3 * $ScalingFactor)
        Else
            _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - 10 * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - 10 * $ScalingFactor, ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) - ($GaugeHeight * $AllowedLimit / 100 * $ScalingFactor))
        EndIf
    EndIf

    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $AllowedPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawLinearAllowedSpeed
#EndRegion Draw Linear Gauge

#Region Draw Radial Gauge
; #FUNCTION# ====================================================================================================================
; Name...........: _Gauges_DrawRadialGauge
; Description ...: Creates a radial gauge in the graphics backbuffer
; Syntax.........: _Gauges_DrawRadialGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor = 1, $Clockwise = True, $StartAngle = 0,
;                   + $SweepAngle = 180, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = True, $AllowedLimit = 0, $VariableMinValue = 0)
; Parameters ....:  $backbuffer             - [byref] The graphics object to draw the gauge to.
;                           $CentrePointX           - The horizontal coordinate of the centre of the gauge.
;                           $CentrePointY           - The vertical coordinate of the centre of the gauge.
;                           $Radius                     - The radius of the outer edge of the gauge.
;                           $Thickness              - The thickness of the gauge in pixels.
;                           $Variable               - The variable used to change the gauge.
;                           $ScalingFactor          - [optional] Scales the gauge by this factor. Default is 1, i.e. no scaling.
;                           $Clockwise              - [optional] Boolean, determines whether the gauge fills clockwise or anti-clockwise. Default is TRUE, i.e. clockwise.
;                           $StartAngle             - [optional] The starting angle of the gauge. Default is 0 (East).
;                           $SweepAngle         - [optional] The sweep angle of the gauge (How many degrees it rotates through). The default is 180.
;                           $NoOfCheckmarks - [optional] The number of dashes indicating a scale around the gauge. Default is 6.
;                           $CheckLength            - [optional] The length of the checkmarks in pixels. Default is 20.
;                           $VariableMaxValue   - [optional] The maximum value of the variable. Default is 256.
;                           $VariableLimit          - [optional] Boolean, if TRUE, displays a red limit indicator on the scale. Default is FALSE.
;                           $AllowedLimit           -[optional] The value of the above limit if it is drawn. Default is 0.
;                           $VariableMinValue   -[optional] The minimum value of the variable. Only used if negative numbers are required. Default is 0.
; Author ........: Simon Renardson (Sidley)
; Modified.......:
; Remarks .......:  There is a more comprehensive function available, but I deemed it overkill for the majority of people.
; Related .......:  _GDIPlus_
; Example .......: Yes
; ===============================================================================================================================
;Draw Gauge (Speed/Load Level)
;Creates Completed Radial Gauge
;~ _DrawRadialGauge($CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, [$ScalingFactor = 1, [$Clockwise = True, [$StartAngle = 0, [$SweepAngle = 180, [$MaxValue = 256, [$NoOfCheckmarks = 10, [$CheckLength = 20]]]]]]])
Func _Gauges_DrawRadialGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor = 1, $Clockwise = True, $StartAngle = 0, $SweepAngle = 180, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = True, $AllowedLimit = 0, $VariableMinValue = 0)
Local $BrushColour = ("0x" & HEX(BitOR(0xFFFF0000, BitShift((255 - (($Variable / $VariableMaxValue) * 255)), -8))))
    Local $GaugeBrush = _GDIPlus_HatchBrushCreate(39, 0xFF000000, $BrushColour)
    Local $TextBrush = _GDIPlus_BrushCreateSolid($BrushColour)
    Local $Path = _GDIPlus_PathCreate()
    Local $hPen = _GDIPlus_PenCreate("0xFF96A29F", 2 * $ScalingFactor) ;Pen colour
    Local $AllowedPen = _GDIPlus_PenCreate("0xFFFF0000", 10 * $ScalingFactor)
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2) ;TODO may need to be removed

    If $Clockwise Then ;If clockwise rotation
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)), $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)) ;Add outer arc of gauge
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc by the thickness of the gauge
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)) + ($Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)), (-1 * $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue))) ;Add inner arc of Gauge
    Else ;If anti-clockwise rotation
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)), (-1 * $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue))) ;Add outer arc of gauge
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arcby the thickness of the gauge
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)) - ($Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)), $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)) ;Add inner arc of Gauge
    EndIf
    $Radius += ($Thickness * $ScalingFactor) ;Return radius to original size
    _GDIPlus_PathCloseFigure($Path) ;Close the two arcs
    _GDIPlus_GraphicsFillPath($backbuffer, $Path, $GaugeBrush) ;Fill the gauge and centre text with colour
    _DrawRadialGaugeText($backbuffer, $Variable, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, $TextBrush) ;Draw the centre text
    _DrawGaugeOutline($backbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $hPen) ;Draw the gauge outline
    _DrawIndicators($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale arc
    _DrawCheckMarks($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale checkmarks
    If $VariableLimit Then
        _DrawRadialAllowedSpeed($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $AllowedLimit, $AllowedPen, True) ;Draw allowed speed limits
    EndIf

    _GDIPlus_PathDispose($Path) ;Tidy up
    _GDIPlus_BrushDispose($GaugeBrush)
    _GDIPlus_BrushDispose($TextBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($AllowedPen)
EndFunc   ;==>_DrawRadialGauge

;Draw Variable Value (Text, Load/Speed Value)
;Creates The Centre Text of the Radial Gauge
;~ Func _DrawRadialGaugeText($ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor)
Func _DrawRadialGaugeText(ByRef $backbuffer, $ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, ByRef $TextBrush)
    Local $FontSize = 180 * $ScalingFactor ;Default font size (Scaled)
    Local $Text = _GDIPlus_PathCreate()
    Local $Format = _GDIPlus_StringFormatCreate()
    _GDIPlus_StringFormatSetAlign($Format, 2) ;Align right (Doesn't seem to make a difference)
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") ;Centre text font
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($FontSize / 1.3) * $ScalingFactor, $CentrePointY - $FontSize * $ScalingFactor / 2) ;Set position (Top left)
    _GDIPlus_PathAddString($Text, Round($ValueText, 1), $Layout, $Family, 0, $FontSize * $ScalingFactor) ;Add value to path (To 1 decimal place)
    _GDIPlus_GraphicsFillPath($backbuffer, $Text, $TextBrush)

    $Layout = 0 ;Tidy up
    _GDIPlus_PathDispose($Text)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_DrawRadialGaugeText

;Draw Gauge Outline
;Creates the Outline of the Radial Gauge
;~ Func _DrawGaugeOutline($CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle)
Func _DrawGaugeOutline(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, ByRef $hPen)
    Local $Path = _GDIPlus_PathCreate()
    Local Const $PI = 3.141592653589793


    $Radius += 2 ;Put the outline 2 px outside the gauge
    If $Clockwise Then ;If the gauge is to be filled clockwise
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle)
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX + ($Radius * $ScalingFactor * Cos(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointY + ($Radius * $ScalingFactor * Sin(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointX + (($Radius - ($Thickness * $ScalingFactor) - (4 * $ScalingFactor)) * Cos(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)))) * $ScalingFactor), $CentrePointY + (($Radius - ($Thickness * $ScalingFactor) - 4) * $ScalingFactor * Sin(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $hPen)
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc
        $Radius -= 4
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), ($StartAngle + $SweepAngle), -$SweepAngle)
    Else
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle)
        _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX + ($Radius * $ScalingFactor * Cos(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointY + ($Radius * $ScalingFactor * Sin(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointX + (($Radius - ($Thickness * $ScalingFactor) - (4 * $ScalingFactor)) * Cos(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)))) * $ScalingFactor), $CentrePointY + (($Radius - ($Thickness * $ScalingFactor) - 4) * $ScalingFactor * Sin(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $hPen)
        $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc
        $Radius -= 4
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $SweepAngle, $SweepAngle)
    EndIf
    _GDIPlus_PathCloseFigure($Path) ;Close the path
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) ;Draw the path
    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawGaugeOutline

;Draw Scale(s)
;Creates a number of indicative markings around the centre of the radial gauge
;~ Func _DrawIndicators($CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle)
Func _DrawIndicators(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, ByRef $hPen, $Inside)
    Local $Path = _GDIPlus_PathCreate()
    $Radius -= ($Thickness + 20) * $ScalingFactor
    If $Clockwise Then
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle)
    Else ;Doesn't make much difference, but it will be 180 degrees out
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle)
    EndIf
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawIndicators

;Draw the allowed speed marker
Func _DrawRadialAllowedSpeed(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, _
        $AllowedLimit, ByRef $AllowedPen, $Inside)
    Local $Path = _GDIPlus_PathCreate()
    $Radius -= ($Thickness + 24) * $ScalingFactor
    If $Clockwise Then ;Display in a clockwise direction
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle * $AllowedLimit / 100)
    ElseIf NOT $Clockwise Then ;Display in an anti-clockwise direction
        _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle * $AllowedLimit / 100)
    EndIf
    _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $AllowedPen) ;Draw with the red pen ($AllowedPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawRadialAllowedSpeed

;DrawCheckmarks (Checkmarks)
;Creates the checkmarks and text around the indicator gauge
;~ Func _DrawCheckMarks($CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $MaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen)
Func _DrawCheckMarks(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, _
        $SweepAngle, ByRef $hPen, $Inside)
    Local Const $PI = 3.141592653589793
    Local $TextBrush = _GDIPlus_BrushCreateSolid("0xFFFFFFFF")
    Local $aPoints[$NoOfCheckmarks][4] ;Creates an array of four points for each check line
    Local $aMarkText[$NoOfCheckmarks] ;Creates the text for the checkmarks

    $Radius -= ($Thickness + 20) * $ScalingFactor
    For $i = 0 to ($NoOfCheckmarks-1)
        $aMarkText[$i] = Round((($VariableMaxValue - $VariableMinValue) / ($NoOfCheckmarks - 1)) * $i) + $VariableMinValue ;Round checkmark values to one decimal place
    Next

    Local $aAngles[$NoOfCheckmarks] = [] ;Create an array to hold the angles at which the checkmarks should be
    If $Clockwise Then
        For $i = 0 to($NoOfCheckmarks - 1)
            $aAngles[$i] = $StartAngle + (($SweepAngle / ($NoOfCheckmarks - 1)) * $i) ;Spread out checkmarks evenly over the gauge
        Next
    Else ;For anticlockwise filling gauge
        For $i = 0 to($NoOfCheckmarks - 1)
            $aAngles[$i] = $StartAngle - (($SweepAngle / ($NoOfCheckmarks - 1)) * $i) ;Spread out checkmarks evenly over the gauge
        Next
    EndIf

    For $i = 0 to($NoOfCheckmarks - 1)
        $aAngles[$i] = $aAngles[$i] * $PI / 180 ;Convert degrees to radians
        $aPoints[$i][0] = $CentrePointX + ($Radius * Cos($aAngles[$i]) * $ScalingFactor) ;Create cartesian coordinates for the check lines from polar coordinates (Radius, angle)
        $aPoints[$i][1] = $CentrePointY + ($Radius * Sin($aAngles[$i]) * $ScalingFactor)
        $aPoints[$i][2] = $CentrePointX + (($Radius - ($CheckLength * $ScalingFactor)) * Cos($aAngles[$i]) * $ScalingFactor)
        $aPoints[$i][3] = $CentrePointY + (($Radius - ($CheckLength * $ScalingFactor)) * Sin($aAngles[$i]) * $ScalingFactor)
    Next
    ;Font data for checkmark text
    Local $Format = _GDIPlus_StringFormatCreate()
    Local $Family = _GDIPlus_FontFamilyCreate("Agency FB")
    Local $FontSize = 15
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize * $ScalingFactor, 2)
    For $i = 0 to($NoOfCheckmarks - 1) ;For each checkmark
        _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][2], $aPoints[$i][3], $hPen) ;Draw the lines
        $Layout = _GDIPlus_RectFCreate($aPoints[$i][2] - ($FontSize * Cos($aAngles[$i])) - (18 * $ScalingFactor), $aPoints[$i][3] - ($FontSize * Sin($aAngles[$i]) + 10), 0, 0)
        _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush)
    Next

    $Layout = 0
    _GDIPlus_BrushDispose($TextBrush)
    _GDIPlus_FontDispose($Font)
    _GDIPlus_StringFormatDispose($Format)
    _GDIPlus_FontFamilyDispose($Family)
EndFunc   ;==>_DrawCheckMarks
#EndRegion Draw Radial Gauge

#EndRegion Functions

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...