Jump to content

GraphGDIPlus saving axis values to JPG


Go to solution Solved by UEZ,

Recommended Posts

Hi, I tried to use GraphGDIPlus UDF, it works perfectly for newbee like me, but I want to send mails with graphics to my customers and when I look at the JPG output file (creating with _GraphGDIPlus_SaveImage function) there is no axis values. The reason is because these values are not written to graph area. Had someone tried to solve this problem earlier? I tried to modify _GraphGDIPlus_Set_RangeX function but it's over my possibilites. I've found GraphGDIPlus convenient because of its saveImage function, maybe there is another UDF with same functionality? BR.

Link to comment
Share on other sites

  • Solution

Try this modified version.

GraphGDIPlus.au3:

;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

; #INDEX# ===============================================================================
; Title .........: GraphGDIPlus
; AutoIt Version: 3.3.0.0+
; Language:       English
; Description ...: A Graph control to draw line graphs, using GDI+, also double-buffered.
; Notes .........:
; =======================================================================================



; #VARIABLES/INCLUDES# ==================================================================
#include-once
#include <GDIplus.au3>

Global $aGraphGDIPlusaGraphArrayINTERNAL[1]
; =======================================================================================



; #FUNCTION# ============================================================================
; Name...........: _GraphGDIPlus_Create
; Description ...: Creates graph area, and prepares array of specified data
; Syntax.........: _GraphGDIPlus_Create($hWnd,$iLeft,$iTop,$iWidth,$iHeight,$hColorBorder = 0xFF000000,$hColorFill = 0xFFFFFFFF)
; Parameters ....:  $hWnd - Handle to GUI
;                   $iLeft - left most position in GUI
;                   $iTop - top most position in GUI
;                   $iWidth - width of graph in pixels
;                   $iHeight - height of graph in pixels
;                   $hColorBorder - Color of graph border (ARGB)
;                   $hColorFill - Color of background (ARGB)
; Return values .: Returns array containing variables for subsequent functions...
;                    Returned Graph array is:
;                    [1] graphic control handle
;                    [2] left
;                    [3] top
;                    [4] width
;                    [5] height
;                    [6] x low
;                    [7] x high
;                    [8] y low
;                    [9] y high
;                    [10] x ticks handles
;                    [11] x labels handles
;                    [12] y ticks handles
;                    [13] y labels handles
;                    [14] Border Color
;                    [15] Fill Color
;                    [16] Bitmap Handle
;                    [17] Backbuffer Handle
;                    [18] Last used x pos
;                    [19] Last used y pos
;                    [20] Pen (main) Handle
;                    [21] Brush (fill) Handle
;                    [22] Pen (border) Handle
;                    [23] Pen (grid) Handle
;                    [24] Window Handle (hWnd)
; =======================================================================================
Func _GraphGDIPlus_Create($hWnd, $iLeft, $iTop, $iWidth, $iHeight, $hColorBorder = 0xFF000000, $hColorFill = 0xFFFFFFFF, $iSmooth = 2)
    Local $graphics, $bitmap, $backbuffer, $brush, $bpen, $gpen, $pen
    Local $ahTicksLabelsX[1]
    Local $ahTicksLabelsY[1]
    Local $ahTicksX[1]
    Local $ahTicksY[1]
    Local $aGraphArray[1]

    ;----- Set GUI transparency to SOLID (prevents GDI+ glitches) -----
    ;WinSetTrans($hWnd, "", 255) - causes problems when more than 2 graphs used
    ;----- GDI+ Initiate -----
    _GDIPlus_Startup()
    $graphics = _GDIPlus_GraphicsCreateFromHWND($hWnd) ;graphics area
    $bitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth + 1, $iHeight + 1, $graphics);buffer bitmap
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap) ;buffer area
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer, $iSmooth)

    ;----- Set background Color -----
    $brush = _GDIPlus_BrushCreateSolid($hColorFill)
    _GDIPlus_GraphicsFillRect($backbuffer, 0, 0, $iWidth, $iHeight, $brush)
    ;----- Set border Pen + color -----
    $bpen = _GDIPlus_PenCreate($hColorBorder)
    _GDIPlus_PenSetEndCap($bpen, $GDIP_LINECAPROUND)
    ;----- Set Grid Pen + color -----
    $gpen = _GDIPlus_PenCreate(0xFFf0f0f0)
    _GDIPlus_PenSetEndCap($gpen, $GDIP_LINECAPROUND)
    ;----- set Drawing Pen + Color -----
    $pen = _GDIPlus_PenCreate() ;drawing pen initially black, user to set
    _GDIPlus_PenSetEndCap($pen, $GDIP_LINECAPROUND)
    _GDIPlus_GraphicsDrawRect($backbuffer, 0, 0, $iWidth, $iHeight, $pen)
    ;----- draw -----
    _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, $iLeft, $iTop, $iWidth + 1, $iHeight + 1)
    ;----- register redraw -----
    GUIRegisterMsg(0x0006, "_GraphGDIPlus_ReDraw") ;0x0006 = win activate
    GUIRegisterMsg(0x0003, "_GraphGDIPlus_ReDraw") ;0x0003 = win move
    ;----- prep + load array -----
    Dim $aGraphArray[25] = ["", $graphics, $iLeft, $iTop, $iWidth, $iHeight, 0, 1, 0, 1, _
            $ahTicksX, $ahTicksLabelsX, $ahTicksY, $ahTicksLabelsY, $hColorBorder, $hColorFill, _
            $bitmap, $backbuffer, 0, 0, $pen, $brush, $bpen, $gpen, $hWnd]
    ;----- prep re-draw array for all graphs created -----
    ReDim $aGraphGDIPlusaGraphArrayINTERNAL[UBound($aGraphGDIPlusaGraphArrayINTERNAL) + 1]
    $aGraphGDIPlusaGraphArrayINTERNAL[UBound($aGraphGDIPlusaGraphArrayINTERNAL) - 1] = $aGraphArray

    Return $aGraphArray
EndFunc   ;==>_GraphGDIPlus_Create
Func _GraphGDIPlus_ReDraw($hWnd)
    ;----- Allows redraw of the GDI+ Image upon window min/maximize -----
    Local $i
    _WinAPI_RedrawWindow($hWnd, 0, 0, 0x0100)
    For $i = 1 To UBound($aGraphGDIPlusaGraphArrayINTERNAL) - 1
        If $aGraphGDIPlusaGraphArrayINTERNAL[$i] = 0 Then ContinueLoop
        _GraphGDIPlus_Refresh($aGraphGDIPlusaGraphArrayINTERNAL[$i])
    Next
EndFunc   ;==>_GraphGDIPlus_ReDraw



; #FUNCTION# ============================================================================
; Name...........: _GraphGDIPlus_Delete
; Description ...: Deletes previously created graph and related ticks/labels
; Syntax.........: _GraphGDIPlus_Delete($hWnd,ByRef $aGraphArray)
; Parameters ....:  $hWnd - GUI handle
;                   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                   $iKeepGDIPlus - if not zero, function will not _GDIPlus_Shutdown()
; =======================================================================================
Func _GraphGDIPlus_Delete($hWnd, ByRef $aGraphArray, $iKeepGDIPlus = 0)
    If IsArray($aGraphArray) = 0 Then Return
    Local $ahTicksX, $ahTicksLabelsX, $ahTicksY, $ahTicksLabelsY, $i, $aTemp
    ;----- delete x ticks/labels -----
    $ahTicksX = $aGraphArray[10]
    $ahTicksLabelsX = $aGraphArray[11]
    For $i = 1 To (UBound($ahTicksX) - 1)
        GUICtrlDelete($ahTicksX[$i])
    Next
    For $i = 1 To (UBound($ahTicksLabelsX) - 1)
        GUICtrlDelete($ahTicksLabelsX[$i])
    Next
    ;----- delete y ticks/labels -----
    $ahTicksY = $aGraphArray[12]
    $ahTicksLabelsY = $aGraphArray[13]
    For $i = 1 To (UBound($ahTicksY) - 1)
        GUICtrlDelete($ahTicksY[$i])
    Next
    For $i = 1 To (UBound($ahTicksLabelsY) - 1)
        GUICtrlDelete($ahTicksLabelsY[$i])
    Next
    ;----- delete graphic control -----
    _GDIPlus_GraphicsDispose($aGraphArray[17])
    _GDIPlus_BitmapDispose($aGraphArray[16])
    _GDIPlus_GraphicsDispose($aGraphArray[1])
    _GDIPlus_BrushDispose($aGraphArray[21])
    _GDIPlus_PenDispose($aGraphArray[20])
    _GDIPlus_PenDispose($aGraphArray[22])
    _GDIPlus_PenDispose($aGraphArray[23])
    If $iKeepGDIPlus = 0 Then _GDIPlus_Shutdown()
    _WinAPI_InvalidateRect($hWnd)
    ;----- remove form global redraw array -----
    For $i = 1 To UBound($aGraphGDIPlusaGraphArrayINTERNAL) - 1
        $aTemp = $aGraphGDIPlusaGraphArrayINTERNAL[$i]
        If IsArray($aTemp) = 0 Then ContinueLoop
        If $aTemp[1] = $aGraphArray[1] Then $aGraphGDIPlusaGraphArrayINTERNAL[$i] = 0
    Next
    ;----- close array -----
    $aGraphArray = 0
EndFunc   ;==>_GraphGDIPlus_Delete



; #FUNCTION# ============================================================================
; Name...........: _GraphGDIPlus_Clear
; Description ...: Clears graph content
; Syntax.........: _GraphGDIPlus_Clear(ByRef $aGraphArray)
; Parameters ....: $aGraphArray - the array returned from _GraphGDIPlus_Create
; =======================================================================================
Func _GraphGDIPlus_Clear(ByRef $aGraphArray)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- Set background Color -----
    _GDIPlus_GraphicsFillRect($aGraphArray[17], 0, 0, $aGraphArray[4], $aGraphArray[5], $aGraphArray[21])
    ;----- set border + Color -----
    _GraphGDIPlus_RedrawRect($aGraphArray)
EndFunc   ;==>_GraphGDIPlus_Clear



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Refresh
; Description ...: refreshes the graphic
; Syntax.........: _GraphGDIPlus_Refresh(ByRef $aGraphArray)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
; ========================================================================================
Func _GraphGDIPlus_Refresh(ByRef $aGraphArray)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- draw -----
    _GDIPlus_GraphicsDrawImageRect($aGraphArray[1], $aGraphArray[16], $aGraphArray[2], _
            $aGraphArray[3], $aGraphArray[4] + 1, $aGraphArray[5] + 1)
EndFunc   ;==>_GraphGDIPlus_Refresh



; #FUNCTION# ============================================================================
; Name...........: _GraphGDIPlus_Set_RangeX
; Description ...: Allows user to set the range of the X axis and set ticks and rounding levels
; Syntax.........: _GraphGDIPlus_Set_RangeX(ByRef $aGraphArray,$iLow,$iHigh,$iXTicks = 1,$bLabels = 1,$iRound = 0)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iLow - the lowest value for the X axis (can be negative)
;                    $iHigh - the highest value for the X axis
;                    $iXTicks - [optional] number of ticks to show below axis, if = 0 then no ticks created
;                    $bLabels - [optional] 1=show labels, any other number=do not show labels
;                    $iRound - [optional] rounding level of label values
; =======================================================================================
Func _GraphGDIPlus_Set_RangeX(ByRef $aGraphArray, $iLow, $iHigh, $iXTicks = 1, $bLabels = 1, $iRound = 0)
    If IsArray($aGraphArray) = 0 Then Return
    Local $ahTicksX, $ahTicksLabelsX, $i
    ;----- load user vars to array -----
    $aGraphArray[6] = $iLow
    $aGraphArray[7] = $iHigh
    ;----- prepare nested array -----
    $ahTicksX = $aGraphArray[10]
    $ahTicksLabelsX = $aGraphArray[11]
    ;----- delete any existing ticks -----
    For $i = 1 To (UBound($ahTicksX) - 1)
        GUICtrlDelete($ahTicksX[$i])
    Next
    Dim $ahTicksX[1]
    ;----- create new ticks -----
    For $i = 1 To $iXTicks + 1
        ReDim $ahTicksX[$i + 1]
        $ahTicksX[$i] = GUICtrlCreateLabel("", (($i - 1) * ($aGraphArray[4] / $iXTicks)) + $aGraphArray[2], _
                $aGraphArray[3] + $aGraphArray[5], 1, 5)
        GUICtrlSetBkColor(-1, 0x000000)
        GUICtrlSetState(-1, 128)
    Next
    ;----- delete any existing labels -----
    For $i = 1 To (UBound($ahTicksLabelsX) - 1)
        GUICtrlDelete($ahTicksLabelsX[$i])
    Next
    Dim $ahTicksLabelsX[1]
    ;----- create new labels -----
    For $i = 1 To $iXTicks + 1
        ReDim $ahTicksLabelsX[$i + 1]
        $ahTicksLabelsX[$i] = GUICtrlCreateLabel("", _
                ($aGraphArray[2] + (($aGraphArray[4] / $iXTicks) * ($i - 1))) - (($aGraphArray[4] / $iXTicks) / 2), _
                $aGraphArray[3] + $aGraphArray[5] + 10, $aGraphArray[4] / $iXTicks, 13, 1)
        GUICtrlSetBkColor(-1, -2)
    Next
    ;----- if labels are required, then fill -----
    If $bLabels = 1 Then
        For $i = 1 To (UBound($ahTicksLabelsX) - 1)
            GUICtrlSetData($ahTicksLabelsX[$i], _
                    StringFormat("%." & $iRound & "f", _GraphGDIPlus_Reference_Pixel("p", (($i - 1) * ($aGraphArray[4] / $iXTicks)), _
                    $aGraphArray[6], $aGraphArray[7], $aGraphArray[4])))
        Next
    EndIf
    ;----- load created arrays back into array -----
    $aGraphArray[10] = $ahTicksX
    $aGraphArray[11] = $ahTicksLabelsX
EndFunc   ;==>_GraphGDIPlus_Set_RangeX



; #FUNCTION# ============================================================================
; Name...........: _GraphGDIPlus_Set_RangeY
; Description ...: Allows user to set the range of the Y axis and set ticks and rounding levels
; Syntax.........: _GraphGDIPlus_SetRange_Y(ByRef $aGraphArray,$iLow,$iHigh,$iYTicks = 1,$bLabels = 1,$iRound = 0)
; Parameters ....:    $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iLow - the lowest value for the Y axis (can be negative)
;                    $iHigh - the highest value for the Y axis
;                    $iYTicks - [optional] number of ticks to show next to axis, if = 0 then no ticks created
;                    $bLabels - [optional] 1=show labels, any other number=do not show labels
;                    $iRound - [optional] rounding level of label values
; =======================================================================================
Func _GraphGDIPlus_Set_RangeY(ByRef $aGraphArray, $iLow, $iHigh, $iYTicks = 1, $bLabels = 1, $iRound = 0)
    If IsArray($aGraphArray) = 0 Then Return
    Local $ahTicksY, $ahTicksLabelsY, $i
    ;----- load user vars to array -----
    $aGraphArray[8] = $iLow
    $aGraphArray[9] = $iHigh
    ;----- prepare nested array -----
    $ahTicksY = $aGraphArray[12]
    $ahTicksLabelsY = $aGraphArray[13]
    ;----- delete any existing ticks -----
    For $i = 1 To (UBound($ahTicksY) - 1)
        GUICtrlDelete($ahTicksY[$i])
    Next
    Dim $ahTicksY[1]
    ;----- create new ticks -----
    For $i = 1 To $iYTicks + 1
        ReDim $ahTicksY[$i + 1]
        $ahTicksY[$i] = GUICtrlCreateLabel("", $aGraphArray[2] - 5, _
                ($aGraphArray[3] + $aGraphArray[5]) - (($aGraphArray[5] / $iYTicks) * ($i - 1)), 5, 1)
        GUICtrlSetBkColor(-1, 0x000000)
        GUICtrlSetState(-1, 128)
    Next
    ;----- delete any existing labels -----
    For $i = 1 To (UBound($ahTicksLabelsY) - 1)
        GUICtrlDelete($ahTicksLabelsY[$i])
    Next
    Dim $ahTicksLabelsY[1]
    ;----- create new labels -----
    For $i = 1 To $iYTicks + 1
        ReDim $ahTicksLabelsY[$i + 1]
        $ahTicksLabelsY[$i] = GUICtrlCreateLabel("", $aGraphArray[2] - 40, _
                ($aGraphArray[3] + $aGraphArray[5]) - (($aGraphArray[5] / $iYTicks) * ($i - 1)) - 6, 30, 13, 2)
        GUICtrlSetBkColor(-1, -2)
    Next
    ;----- if labels are required, then fill -----
    If $bLabels = 1 Then
        For $i = 1 To (UBound($ahTicksLabelsY) - 1)
            GUICtrlSetData($ahTicksLabelsY[$i], StringFormat("%." & $iRound & "f", _GraphGDIPlus_Reference_Pixel("p", _
                    (($i - 1) * ($aGraphArray[5] / $iYTicks)), $aGraphArray[8], $aGraphArray[9], $aGraphArray[5])))
        Next
    EndIf
    ;----- load created arrays back into array -----
    $aGraphArray[12] = $ahTicksY
    $aGraphArray[13] = $ahTicksLabelsY
EndFunc   ;==>_GraphGDIPlus_Set_RangeY



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Plot_Start
; Description ...: Move starting point of plot
; Syntax.........: _GraphGDIPlus_Plot_Start(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iX - x value to start at
;                    $iY - y value to start at
; ========================================================================================
Func _GraphGDIPlus_Plot_Start(ByRef $aGraphArray, $iX, $iY)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- MOVE pen to start point -----
    $aGraphArray[18] = _GraphGDIPlus_Reference_Pixel("x", $iX, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4])
    $aGraphArray[19] = _GraphGDIPlus_Reference_Pixel("y", $iY, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5])
EndFunc   ;==>_GraphGDIPlus_Plot_Start



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Plot_Line
; Description ...: draws straight line to x,y from previous point / starting point
; Syntax.........: _GraphGDIPlus_Plot_Line(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iX - x value to draw to
;                    $iY - y value to draw to
; ========================================================================================
Func _GraphGDIPlus_Plot_Line(ByRef $aGraphArray, $iX, $iY)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- Draw line from previous point to new point -----
    $iX = _GraphGDIPlus_Reference_Pixel("x", $iX, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4])
    $iY = _GraphGDIPlus_Reference_Pixel("y", $iY, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5])
;~  _GDIPlus_GraphicsDrawLine($aGraphArray[17], $aGraphArray[18], $aGraphArray[19], $iX, $iY, $aGraphArray[20])
    DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $aGraphArray[17], "handle", $aGraphArray[20], "float", $aGraphArray[18], "float", $aGraphArray[19], "float", $iX, "float", $iY)
    _GraphGDIPlus_RedrawRect($aGraphArray)
    ;----- save current as last coords -----
    $aGraphArray[18] = $iX
    $aGraphArray[19] = $iY
EndFunc   ;==>_GraphGDIPlus_Plot_Line



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Plot_Point
; Description ...: draws point at coords
; Syntax.........: _GraphGDIPlus_Plot_Point(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iX - x value to draw at
;                    $iY - y value to draw at
; ========================================================================================
Func _GraphGDIPlus_Plot_Point(ByRef $aGraphArray, $iX, $iY)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- Draw point from previous point to new point -----
    $iX = _GraphGDIPlus_Reference_Pixel("x", $iX, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4])
    $iY = _GraphGDIPlus_Reference_Pixel("y", $iY, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5])
;~  _GDIPlus_GraphicsDrawRect($aGraphArray[17], $iX-1, $iY-1, 2, 2, $aGraphArray[20])
    DllCall($ghGDIPDll, "int", "GdipDrawRectangle", "handle", $aGraphArray[17], "handle", $aGraphArray[20], "float", $iX-1, "float", $iY-1,"float", 2, "float", 2)
    _GraphGDIPlus_RedrawRect($aGraphArray)
    ;----- save current as last coords -----
    $aGraphArray[18] = $iX
    $aGraphArray[19] = $iY
EndFunc   ;==>_GraphGDIPlus_Plot_Point



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Plot_Dot
; Description ...: draws single pixel dot at coords
; Syntax.........: _GraphGDIPlus_Plot_Dot(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iX - x value to draw at
;                    $iY - y value to draw at
; ========================================================================================
Func _GraphGDIPlus_Plot_Dot(ByRef $aGraphArray, $iX, $iY)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- Draw point from previous point to new point -----
    $iX = _GraphGDIPlus_Reference_Pixel("x", $iX, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4])
    $iY = _GraphGDIPlus_Reference_Pixel("y", $iY, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5])
;~  _GDIPlus_GraphicsDrawRect($aGraphArray[17], $iX, $iY, 1, 1, $aGraphArray[20]) ;draws 2x2 dot ?HOW to get 1x1 pixel?????
    DllCall($ghGDIPDll, "int", "GdipDrawRectangle", "handle", $aGraphArray[17], "handle", $aGraphArray[20], "float", $iX, "float", $iY,"float", 1, "float", 1)
    _GraphGDIPlus_RedrawRect($aGraphArray)
    ;----- save current as last coords -----
    $aGraphArray[18] = $iX
    $aGraphArray[19] = $iY
EndFunc   ;==>_GraphGDIPlus_Plot_Dot



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Set_PenColor
; Description ...: sets the Color for the next drawing
; Syntax.........: _GraphGDIPlus_Set_PenColor(ByRef $aGraphArray,$hColor,$hBkGrdColor = $GUI_GR_NOBKColor)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $hColor - the Color of the next item (ARGB)
; ========================================================================================
Func _GraphGDIPlus_Set_PenColor(ByRef $aGraphArray, $hColor)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- apply pen Color -----
    _GDIPlus_PenSetColor($aGraphArray[20], $hColor)
EndFunc   ;==>_GraphGDIPlus_Set_PenColor



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Set_PenSize
; Description ...: sets the pen for the next drawing
; Syntax.........: _GraphGDIPlus_Set_PenSize(ByRef $aGraphArray,$iSize = 1)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iSize - size of pen line
; ========================================================================================
Func _GraphGDIPlus_Set_PenSize(ByRef $aGraphArray, $iSize = 1)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- apply pen size -----
    _GDIPlus_PenSetWidth($aGraphArray[20], $iSize)
EndFunc   ;==>_GraphGDIPlus_Set_PenSize



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Set_PenDash
; Description ...: sets the pen dash style for the next drawing
; Syntax.........: GraphGDIPlus_Set_PenDash(ByRef $aGraphArray,$iDash = 0)
; Parameters ....:   $aGraphArray - the array returned from _GraphGDIPlus_Create
;                    $iDash - style of dash, where:
;                                       0 = solid line
;                                       1 = simple dashed line
;                                       2 = simple dotted line
;                                       3 = dash dot line
;                                       4 = dash dot dot line
; ========================================================================================
Func _GraphGDIPlus_Set_PenDash(ByRef $aGraphArray, $iDash = 0)
    If IsArray($aGraphArray) = 0 Then Return
    Local $Style
    Switch $iDash
        Case 0 ;solid line _____
            $Style = $GDIP_DASHSTYLESOLID
        Case 1 ;simple dash -----
            $Style = $GDIP_DASHSTYLEDASH
        Case 2 ;simple dotted .....
            $Style = $GDIP_DASHSTYLEDOT
        Case 3 ;dash dot -.-.-
            $Style = $GDIP_DASHSTYLEDASHDOT
        Case 4 ;dash dot dot -..-..-..
            $Style = $GDIP_DASHSTYLEDASHDOTDOT
    EndSwitch
    ;----- apply pen dash -----
    _GDIPlus_PenSetDashStyle($aGraphArray[20], $Style)
EndFunc   ;==>_GraphGDIPlus_Set_PenDash



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Set_GridX
; Description ...: Adds X gridlines.
; Syntax.........: _GraphGDIPlus_Set_GridX(ByRef $aGraphArray, $Ticks=1, $hColor=0xf0f0f0)
; Parameters ....:  $aGraphArray - the array returned from _GraphGDIPlus_Create
;                   $Ticks - sets line at every nth unit assigned to axis
;                   $hColor - [optional] RGB value, defining Color of grid. Default is a light gray
;                   $hColorY0 - [optional] RGB value, defining Color of Y=0 line, Default black
; =======================================================================================
Func _GraphGDIPlus_Set_GridX(ByRef $aGraphArray, $Ticks = 1, $hColor = 0xFFf0f0f0, $hColorY0 = 0xFF000000)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- Set gpen to user color -----
    _GDIPlus_PenSetColor($aGraphArray[23], $hColor)
    ;----- draw grid lines -----
    Select
        Case $Ticks > 0
            For $i = $aGraphArray[6] To $aGraphArray[7] Step $Ticks
                If $i = Number($aGraphArray[6]) Or $i = Number($aGraphArray[7]) Then ContinueLoop
                _GDIPlus_GraphicsDrawLine($aGraphArray[17], _
                        _GraphGDIPlus_Reference_Pixel("x", $i, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4]), _
                        1, _
                        _GraphGDIPlus_Reference_Pixel("x", $i, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4]), _
                        $aGraphArray[5] - 1, _
                        $aGraphArray[23])
            Next
    EndSelect
    ;----- draw y=0 -----
    _GDIPlus_PenSetColor($aGraphArray[23], $hColorY0)
    _GDIPlus_GraphicsDrawLine($aGraphArray[17], _
            _GraphGDIPlus_Reference_Pixel("x", 0, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4]), _
            1, _
            _GraphGDIPlus_Reference_Pixel("x", 0, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4]), _
            $aGraphArray[5] - 1, _
            $aGraphArray[23])
    _GDIPlus_GraphicsDrawLine($aGraphArray[17], _
            1, _
            _GraphGDIPlus_Reference_Pixel("y", 0, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5]), _
            $aGraphArray[4] - 1, _
            _GraphGDIPlus_Reference_Pixel("y", 0, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5]), _
            $aGraphArray[23])

    _GraphGDIPlus_RedrawRect($aGraphArray)
    ;----- re-set to user specs -----
    _GDIPlus_PenSetColor($aGraphArray[23], $hColor) ;set Color back to user def
EndFunc   ;==>_GraphGDIPlus_Set_GridX



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Set_GridY
; Description ...: Adds Y gridlines.
; Syntax.........: _GraphGDIPlus_Set_GridY(ByRef $aGraphArray, $Ticks=1, $hColor=0xf0f0f0)
; Parameters ....:  $aGraphArray - the array returned from _GraphGDIPlus_Create
;                   $Ticks - sets line at every nth unit assigned to axis
;                   $hColor - [optional] RGB value, defining Color of grid. Default is a light gray
;                   $hColorX0 - [optional] RGB value, defining Color of X=0 line, Default black
; =======================================================================================
Func _GraphGDIPlus_Set_GridY(ByRef $aGraphArray, $Ticks = 1, $hColor = 0xFFf0f0f0, $hColorX0 = 0xFF000000)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- Set gpen to user color -----
    _GDIPlus_PenSetColor($aGraphArray[23], $hColor)
    ;----- draw grid lines -----
    Select
        Case $Ticks > 0
            For $i = $aGraphArray[8] To $aGraphArray[9] Step $Ticks
                If $i = Number($aGraphArray[8]) Or $i = Number($aGraphArray[9]) Then ContinueLoop
                _GDIPlus_GraphicsDrawLine($aGraphArray[17], _
                        1, _
                        _GraphGDIPlus_Reference_Pixel("y", $i, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5]), _
                        $aGraphArray[4] - 1, _
                        _GraphGDIPlus_Reference_Pixel("y", $i, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5]), _
                        $aGraphArray[23])
            Next
    EndSelect
    ;----- draw abcissa/ordinate -----
    _GDIPlus_PenSetColor($aGraphArray[23], $hColorX0)
    _GDIPlus_GraphicsDrawLine($aGraphArray[17], _
            _GraphGDIPlus_Reference_Pixel("x", 0, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4]), _
            1, _
            _GraphGDIPlus_Reference_Pixel("x", 0, $aGraphArray[6], $aGraphArray[7], $aGraphArray[4]), _
            $aGraphArray[5] - 1, _
            $aGraphArray[23])
    _GDIPlus_GraphicsDrawLine($aGraphArray[17], _
            1, _
            _GraphGDIPlus_Reference_Pixel("y", 0, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5]), _
            $aGraphArray[4] - 1, _
            _GraphGDIPlus_Reference_Pixel("y", 0, $aGraphArray[8], $aGraphArray[9], $aGraphArray[5]), _
            $aGraphArray[23])

    _GraphGDIPlus_RedrawRect($aGraphArray)
    ;----- re-set to user specs -----
    _GDIPlus_PenSetColor($aGraphArray[23], $hColor) ;set Color back to user def
EndFunc   ;==>_GraphGDIPlus_Set_GridY



; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_RedrawRect
; Description ...: INTERNAL FUNCTION - Re-draws the border
; Syntax.........: _GraphGDIPlus_RedrawRect(ByRef $aGraphArray)
; Parameters ....:     $aGraphArray - the array returned from _GraphGDIPlus_Create
; Notes..........: This prevents drawing over the border of the graph area
; =========================================================================================
Func _GraphGDIPlus_RedrawRect(ByRef $aGraphArray)
    If IsArray($aGraphArray) = 0 Then Return
    ;----- draw border -----
    _GDIPlus_GraphicsDrawRect($aGraphArray[17], 0, 0, $aGraphArray[4], $aGraphArray[5], $aGraphArray[22]) ;draw border
EndFunc   ;==>_GraphGDIPlus_RedrawRect


; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_Reference_Pixel
; Description ...: INTERNAL FUNCTION - performs pixel reference calculations
; Syntax.........: _GraphGDIPlus_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
; Parameters ....:     $iType - "x"=x axis pix, "y" = y axis pix, "p"=value from pixels
;                    $iValue - pixels reference or value
;                    $iLow - lower limit of axis
;                    $iHigh - upper limit of axis
;                    $iTotalPixels - total number of pixels in range (either width or height)
; =========================================================================================
Func _GraphGDIPlus_Reference_Pixel($iType, $iValue, $iLow, $iHigh, $iTotalPixels)
    ;----- perform pixel reference calculations -----
    Switch $iType
        Case "x"
            Return (($iTotalPixels / ($iHigh - $iLow)) * (($iHigh - $iLow) * (($iValue - $iLow) / ($iHigh - $iLow))))
        Case "y"
            Return ($iTotalPixels - (($iTotalPixels / ($iHigh - $iLow)) * (($iHigh - $iLow) * (($iValue - $iLow) / ($iHigh - $iLow)))))
        Case "p"
            Return ($iValue / ($iTotalPixels / ($iHigh - $iLow))) + $iLow
    EndSwitch
EndFunc   ;==>_GraphGDIPlus_Reference_Pixel

; #FUNCTION# =============================================================================
; Name...........: _GraphGDIPlus_SaveImage
; Description ...: INTERNAL FUNCTION - save drawn image to file
; Syntax.........: _GraphGDIPlus_SaveImage($aGraphArray, $file)
; Parameters ....: ByRef $aGraphArray - the array returned from _GraphGDIPlus_Create
;                  $file - filename
; Autor .........: UEZ
; =========================================================================================
Func _GraphGDIPlus_SaveImage(ByRef $aGraphArray, $file, $bFull = True)
    If IsArray($aGraphArray) = 0 Then Return
    If Not $bFull Then
        _GDIPlus_ImageSaveToFile($aGraphArray[16], $file)
        If @error Then Return SetError(1, 0, 0)
    Else
        If Not WinActive($aGraphArray[24]) Then WinActive($aGraphArray[24])
            Local $aWinCPos = WinGetClientSize($aGraphArray[24])
            Local $hDC = _WinAPI_GetDC($aGraphArray[24])
            Local $hCDC = _WinAPI_CreateCompatibleDC($hDC)
            Local $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $aWinCPos[0], $aWinCPos[1])
            _WinAPI_SelectObject ($hCDC, $hHBitmap)
            _WinAPI_BitBlt($hCDC, 0, 0, $aWinCPos[0], $aWinCPos[1], $hDC, 0, 0, 0x00CC0020) ;  0x00CC0020 = $SRCCOPY
            Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
            _WinAPI_ReleaseDC($aGraphArray[24], $hDC)
            _WinAPI_DeleteDC($hCDC)
            _WinAPI_DeleteObject ($hHBitmap)
            _GDIPlus_ImageSaveToFile($hBitmap, $file)
            If @error Then
                _GDIPlus_BitmapDispose($hBitmap)
                Return SetError(2, 0, 0)
            EndIf
            _GDIPlus_BitmapDispose($hBitmap)
    EndIf
    Return 1
EndFunc   ;==>_GraphGDIPlus_SaveImage

Func _GraphGDIPlus_DrawText(ByRef $aGraphArray, $sString, $iX, $iY, $iBrushColor = 0xFF000000, $sFont = "Arial", $iFontSize = 12, $iStyle = 0)
    If IsArray($aGraphArray) = 0 Then Return
    Local $hBrush = _GDIPlus_BrushCreateSolid($iBrushColor)
    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iStyle)
    Local $tLayout = _GDIPlus_RectFCreate($iX, $iY, 0, 0)
    _GDIPlus_GraphicsDrawStringEx($aGraphArray[17], $sString, $hFont, $tLayout, $hFormat, $hBrush)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    Return 1
EndFunc   ;==>_GraphGDIPlus_DrawText

Br,

UEZ

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

Selection of finest graphical examples at Codepen.io

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

Link to comment
Share on other sites

  • 4 years later...

I still can't seem to use the save function, doesn't produce any file for me, no errors... =(

Plots it quite nicely though

func Graph()

$GUI = GUICreate("",800,600)
GUISetOnEvent(-3,"_Exit")
GUISetState()

;----- Create Graph area -----
$Graph = _GraphGDIPlus_Create($GUI,70,30,710,520,0xFF000000,0x00000000)

Global $iXRange=UBound($masterArray)-1,$iYRange=_ArrayMax($masterArray,1,1,UBound($masterArray)-1,5)

;----- Set X axis range -----
_GraphGDIPlus_Set_RangeX($Graph,0,$iXRange,10,1,1)
_GraphGDIPlus_Set_RangeY($Graph,0,$iYRange+$iYRange*0.1,10,1,1)

;----- Set Y axis range -----
_GraphGDIPlus_Set_GridX($Graph,$iXRange/10,0xFF777777 )
_GraphGDIPlus_Set_GridY($Graph,$iYRange/10,0xFF777777 )


_GraphGDIPlus_Set_PenSize($Graph,1)
_GraphGDIPlus_Plot_Start($Graph,-$iXRange,-$iYRange)

_Draw_Graph()

;~ While 1
;~     Sleep(100)
;~ WEnd

EndFunc

Func _Draw_Graph()
    ;----- Set line color and size -----
    _GraphGDIPlus_Set_PenColor($Graph,0xFF0000FF)
    _GraphGDIPlus_Set_PenSize($Graph,1)
;~ MsgBox(0,"",Number($masterArray[5][3]))
;~ _ArrayDisplay($masterArray)
    ;----- draw lines -----
    $First = True
    For $i = 0 to UBound($masterArray)-1 Step 1
        If $First = True Then _GraphGDIPlus_Plot_Start($Graph,$i,$masterArray[$i][5])
        $First = False
        _GraphGDIPlus_Plot_Line($Graph,$i,$masterArray[$i][5])
        _GraphGDIPlus_Refresh($Graph)
;~      MsgBox(0,0,Number($masterArray[$i][3]) & "   " &$masterArray[$i][5])
    Next

    _GraphGDIPlus_SaveImage($GUI, @ScriptDir & "\test.jpg")
MsgBox(0,0,"okay")
    While 1
 Sleep(100)
WEnd

EndFunc

 

Edited by AnonymousX
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...