Jump to content
Sidley

Pixellated graphics using _GDIPlus_GraphicsMeasureString/DrawStringEx

Recommended Posts

Hello Folks,

    Anybody know why Using the GraphicsMeasureString and GraphicsDrawStringEx seems to produce less sharp characters than using PathAddString?

Local $aTextSize = _GDIPlus_GraphicsMeasureString($hBackbuffer, Round($ValueText, 1), $Font, $Layout, $format)
    _GDIPlus_GraphicsDrawStringEx($hBackbuffer, Round($ValueText, 1), $Font, $aTextSize[0], $Format, $TextBrush)

The former produces this: image.png.9896351698e19d9c86a26930d152bcfe.png

_GDIPlus_PathAddString($Text, Round($ValueText, 1), $Layout, $Family, 0, $FontSize * $ScalingFactor) ;Add value to path (To 1 decimal place)
    _GDIPlus_GraphicsFillPath($hBackbuffer, $Text, $TextBrush)

And the latter produces this: image.png.9e92d20ed84f71665518df9492b62c0a.png

 

Full Code (Lines 440-443):

#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+"

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 $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)


While 1
    _GDIPlus_GraphicsClear($hBackbuffer, 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)))
;~  Global $PenColour = ("0xFFFFFFFF")
    Global  $TextFont = 'Century Gothic'
    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($hBackbuffer, _Gauges_DrawRadialGauge($hBackbuffer, $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($hBackbuffer, _Gauges_DrawLinearGauge($hBackbuffer, $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($hBackbuffer)
    _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 $hBackbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, [$ScalingFactor = 1, [$NoOfCheckmarks = 6, [$CheckLength = 20,
;                   + [$VariableMaxValue = 256, [$VariableLimit = False, [$AllowedLimit = 0,  [$VariableMinValue = 0]]]]]]] )
; Parameters ....:  $hBackbuffer                - [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 $hBackbuffer, $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($hBackbuffer, $Path, $GaugeBrush) ;Draw the gauge

    _DrawBar($hBackbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, $hPen, $ScalingFactor) ;Draw the outline for the gauge
    _DrawLinearGaugeCheckMarks($hBackbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $VariableMinValue, $NoOfCheckmarks, $CheckLength, $hPen) ;Draw the checkmarks for the gauge
    If $VariableLimit Then
        _DrawLinearAllowedSpeed($hBackbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $AllowedLimit, $AllowedPen, $ScalingFactor, $VariableLimit) ;Draw the allowed speed indicator(s) for the gauge
    EndIf
    _LinearGaugeText($hBackbuffer, $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 $hBackbuffer, $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($TextFont) ;Centre text font
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2)
    _GDIPlus_StringFormatSetAlign($Format, 2) ;Right align
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 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($hBackbuffer, $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 $hBackbuffer, $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($hBackbuffer, $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($hBackbuffer, $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($hBackbuffer, $Path, $hPen) ;Draw the outline

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawBar

;Draw the checkmarks
Func _DrawLinearGaugeCheckMarks(ByRef $hBackbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $VariableMinValue, $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($TextFont)
    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($hBackbuffer, $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($hBackbuffer, $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($hBackbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush) ;Draw the sext for the checkmark
        Next
    Else
        _GDIPlus_GraphicsDrawLine($hBackbuffer, $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($hBackbuffer, $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($hBackbuffer, $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 $hBackbuffer, $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($hBackbuffer, $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 $hBackbuffer, $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 ....:  $hBackbuffer                - [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 $hBackbuffer, $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))))
If $Variable > 0 Then
    Local $BrushColour = ("0xCA00FF00")
Else
    Local $BrushColour = ("0xCAFF0000")
EndIf
;~  Local $GaugeBrush = _GDIPlus_HatchBrushCreate(39, 0xFF000000, $BrushColour)
    Local $GaugeBrush = _GDIPlus_BrushCreateSolid($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($hBackbuffer, 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($hBackbuffer, $Path, $GaugeBrush) ;Fill the gauge and centre text with colour
    _DrawRadialGaugeText($hBackbuffer, $Variable, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, $TextBrush) ;Draw the centre text
    _DrawGaugeOutline($hBackbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $hPen) ;Draw the gauge outline
    _DrawIndicators($hBackbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale arc
    _DrawCheckMarks($hBackbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $VariableMinValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen, True, $Clockwise) ;Draw scale checkmarks
    If $VariableLimit Then
        _DrawRadialAllowedSpeed($hBackbuffer, $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 $hBackbuffer, $ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, ByRef $TextBrush)
;~  _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    Local $FontSize = 80 * $ScalingFactor ;Default font size (Scaled)
    Local $Text = _GDIPlus_PathCreate()
    Local $Format = _GDIPlus_StringFormatCreate()
    _GDIPlus_StringFormatSetAlign($Format, 1) ;Align centre
    Local $Family = _GDIPlus_FontFamilyCreate($TextFont) ;Centre text font
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 0)
    Local $Layout = _GDIPlus_RectFCreate($CentrePointX, $CentrePointY-($FontSize*4/5)) ;Set position (Top left)
;~  Local $aTextSize = _GDIPlus_GraphicsMeasureString($hBackbuffer, Round($ValueText, 1), $Font, $Layout, $format)
;~  _GDIPlus_GraphicsDrawStringEx($hBackbuffer, Round($ValueText, 1), $Font, $aTextSize[0], $Format, $TextBrush)
    _GDIPlus_PathAddString($Text, Round($ValueText, 1), $Layout, $Family, 0, $FontSize * $ScalingFactor) ;Add value to path (To 1 decimal place)
    _GDIPlus_GraphicsFillPath($hBackbuffer, $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 $hBackbuffer, $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($hBackbuffer, $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($hBackbuffer, $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($hBackbuffer, $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 $hBackbuffer, $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($hBackbuffer, $Path, $hPen)

    _GDIPlus_PathDispose($Path)
EndFunc   ;==>_DrawIndicators

;Draw the allowed speed marker
Func _DrawRadialAllowedSpeed(ByRef $hBackbuffer, $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($hBackbuffer, $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 $hBackbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $VariableMinValue, $NoOfCheckmarks, $CheckLength, $StartAngle, _
        $SweepAngle, ByRef $hPen, $Inside, $Clockwise)
    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($TextFont)
    Local $FontSize = 15
    Local $Font = _GDIPlus_FontCreate($Family, $FontSize * $ScalingFactor, 2)
    For $i = 0 to($NoOfCheckmarks - 1) ;For each checkmark
        _GDIPlus_GraphicsDrawLine($hBackbuffer, $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($hBackbuffer, $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

 

Share this post


Link to post
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

×
×
  • Create New...