Что нового

Проблемы с GraphGDIPlus

kodges

Новичок
Сообщения
42
Репутация
0
Здравствуйте. Требуется нарисовать график в одной из вкладок Tab по данным из SQLite (в примере из массива). Решил воспользоваться GraphGDIPlus.au3 и столкнулся с рядом проблем.
1. Как обычно вместо своего Tab график рисуется на всех.
2. Мне нужно чтобы шкала Y рисовалась не слева, а справа от графика.
3. Почему-то у меня цифры в шкале Y идут в разброс... то есть не от меньшего к большему снизу вверх, а хрен пойми как.. меньшее число почему-то стоит в шкале выше большего и т.д..
4. На шкале Y не отображаются отрицательные числа.

5. В идеале надо на один график рисовать несколько линий (ну это в перспективе).
График должен рисоваться накопительным образом, то есть каждое последующее число прибавляется к предыдущему, ну либо отнимается если число отрицательное.
Помогите решить проблемы. Вот то что у меня сейчас получается:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <GraphGDIPlus.au3>
#include <WinAPI.au3>
#include <Array.au3>

Opt("GUIOnEventMode", 1)

$MainWindow = GUICreate("Example 1", 700, 430)
GUISetOnEvent($GUI_EVENT_CLOSE, "_WindowClose")

GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))
GUICtrlCreateTabItem("Tab1")

;----- Graph ------
$GraphTab = GUICtrlCreateTabItem("Grafik")
$Graph = _GraphGDIPlus_Create($MainWindow, 10, 30, 600, 360, 0xFF000000, 0xFFFFFEEE)

_GraphGDIPlus_Clear($Graph)
Local $cnt = 0, $max = 0, $min = 0, $cur = 0, $arr[0]

For $i = 0 To 1000
    $cnt = $i
    $cur += Random( -100000, 100000, 0 )
    $min = ($min > $cur) ? $cur : $min
    $max = ($max < $cur) ? $cur : $max
    _ArrayAdd($arr, $cur)
Next

;----- Set X Y -----
_GraphGDIPlus_Set_RangeX($Graph, 0, $cnt, 10, 1, 0)
_GraphGDIPlus_Set_RangeY($Graph, $min, $max, 10, 1, 0)

;----- Set line color and size -----
_GraphGDIPlus_Set_PenColor($Graph, 0xFF325D87)
_GraphGDIPlus_Set_PenSize($Graph, 2)

;----- Draw line -----
_GraphGDIPlus_Plot_Start($Graph, 0, 0)
For $i = 0 To $cnt - 1
    _GraphGDIPlus_Plot_Line($Graph, $i, $arr[$i])
Next
_GraphGDIPlus_Refresh($Graph)
;----- End Graph -----

GUICtrlCreateTabItem("Tab3")
GUISetState()

While 1
    Sleep(10)
WEnd

Func _WindowClose()
    Exit
EndFunc

Проблемы 2-4 решил вроде модифицировав немного GraphGDIPlus.au3 файл (прилагаю).
Да и чуть не забыл, при изменении размеров программы размеры графика не меняются. Пробовал использовать GUICtrlSetResizingEx:
Код:
_GUICtrlSetResizingEx($Graph, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP))

к сожалению не работает, как это можно исправить ? ((
Сообщение автоматически объединено:

Ну помогите мне пожалуйста :blush:
 

Вложения

Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
Тут проблемы не тривиальные.
Проблему с отображением на табе решить можно, создав дочернее окно на котором будет создан график, а уже его отображать по мере необходимости (так как я ранее показывал для ListView).
Изменение размеров будет сложнее сделать, нужно перерисовывать весь график с новыми размерами по мере изменения размера окна (WM_SIZING).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
Проблему с отображением на табе решить можно
Как то так:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <GraphGDIPlus.au3>
#include <WinAPI.au3>
#include <Array.au3>

Opt("GUIOnEventMode", 1)

$MainWindow = GUICreate("Example 1", 700, 430)
$hGraph_GUI = GUICreate('', 570, 360, -1, -1, $WS_POPUP, $WS_EX_MDICHILD, $MainWindow)

$aWinPos = WinGetPos($MainWindow)
WinMove($hGraph_GUI, '', $aWinPos[0] + 10, $aWinPos[1] + 50)

GUISetOnEvent($GUI_EVENT_CLOSE, "_WindowClose", $MainWindow)
GUISetOnEvent($GUI_EVENT_CLOSE, "_WindowClose", $hGraph_GUI)

GUISwitch($MainWindow)

$iTab = GUICtrlCreateTab(1, 1, 690, 390, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))
GUICtrlSetOnEvent($iTab, '_TabEvent')
GUICtrlCreateTabItem("Tab1")

;----- Graph ------
$GraphTab = GUICtrlCreateTabItem("Grafik")
$Graph = _GraphGDIPlus_Create($hGraph_GUI, 10, 30, 580, 360, 0xFF000000, 0xFFFFFEEE)

_GraphGDIPlus_Clear($Graph)
Local $cnt = 0, $max = 0, $min = 0, $cur = 0, $arr[0]

For $i = 0 To 1000
    $cnt = $i
    $cur += Random( -100000, 100000, 0 )
    $min = ($min > $cur) ? $cur : $min
    $max = ($max < $cur) ? $cur : $max
    _ArrayAdd($arr, $cur)
Next

;----- Set X Y -----
_GraphGDIPlus_Set_RangeX($Graph, 0, $cnt, 10, 1, 0)
_GraphGDIPlus_Set_RangeY($Graph, $min, $max, 10, 1, 0)

;----- Set line color and size -----
_GraphGDIPlus_Set_PenColor($Graph, 0xFF325D87)
_GraphGDIPlus_Set_PenSize($Graph, 2)

;----- Draw line -----
_GraphGDIPlus_Plot_Start($Graph, 0, 0)
For $i = 0 To $cnt - 1
    _GraphGDIPlus_Plot_Line($Graph, $i, $arr[$i])
Next
_GraphGDIPlus_Refresh($Graph)
;----- End Graph -----

GUICtrlCreateTabItem("Tab3")
GUISetState(@SW_SHOW, $MainWindow)

While 1
    Sleep(10)
WEnd

Func _WindowClose()
    Exit
EndFunc

Func _TabEvent()
    GUISetState((GUICtrlRead($iTab) = 1 ? @SW_SHOW : @SW_HIDE), $hGraph_GUI)
EndFunc
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
За решение проблемы с отображением в нужном табе спасибо!
Изменение размеров будет сложнее сделать, нужно перерисовывать весь график с новыми размерами по мере изменения размера окна (WM_SIZING).
Как-то мне эту проблему надо решить ((. Я понимаю что перерисовка графика на каждом пикселе изменения размеров, дело очень медленное.
Может быть можно как то сделать чтобы график перерисовался только один раз в момент отпускания окна при изменении размера? Ну и при разворачивании/сворачивании на весь экран конечно. А на сам непосредственно момент когда окно растягивают мышкой сделать график скрытым, так будет более эстетично чем если он будет оставаться на месте неизмененным.
Или может быть возможно как-то построить график другими средствами которые позволят сделать его перерисовку при изменении размеров более быстрыми? Скажем отображать в табе страницу в которой график будет нарисован средствами HTML5 или еще как-то ? Я видел программы в которых графики без проблем масштабируются при изменении размеров. Ну Autoit не C++ конечно но он же использует те же виндовые методы как я понимаю.
В общем очень хочется найти красивое решение. И мне надо будет выводить как-то на один график несколько линий.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
Как то так:

Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <GraphGDIPlus.au3>
#include <WinAPI.au3>
#include <Array.au3>

Global $Graph

Opt('GUIOnEventMode', 1)

$MainWindow = GUICreate('Example 1', 700, 430, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, '_WindowClose')

$iTab = GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))
GUICtrlSetOnEvent($iTab, '_TabEvent')
GUICtrlCreateTabItem('Tab1')
GUICtrlCreateTabItem('Grafik')
GUICtrlCreateTabItem('Tab3')

$hGraph_GUI = GUICreate('', 690, 400, -1, -1, $WS_POPUP, $WS_EX_MDICHILD, $MainWindow)
$aWinPos = WinGetPos($MainWindow)
WinMove($hGraph_GUI, '', $aWinPos[0] + 10, $aWinPos[1] + 60)
_GraphDraw($hGraph_GUI, $Graph, 10, 10, 620, 350, 0xFF000000, 0xFFFFFEEE)

GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState(@SW_SHOW, $MainWindow)

While 1
    Sleep(10)
WEnd

Func _GraphDraw($hWnd, ByRef $Graph, $iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    _GraphGDIPlus_Delete($hWnd, $Graph)
    
    $Graph = 0
    $Graph = _GraphGDIPlus_Create($hWnd, $iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    
    _GraphGDIPlus_Clear($Graph)
    Local Static $max = 0, $min = 0, $cnt = 0, $cur = 0, $arr[0]
    
    If UBound($arr) = 0 Then
        For $i = 0 To 1000
            $cnt = $i
            $cur += Random(-100000, 100000, 0)
            $min = ($min > $cur) ? $cur : $min
            $max = ($max < $cur) ? $cur : $max
            _ArrayAdd($arr, $cur)
        Next
    EndIf
    
    ;----- Set X Y -----
    _GraphGDIPlus_Set_RangeX($Graph, 10, $cnt, 10, 1, 0)
    _GraphGDIPlus_Set_RangeY($Graph, $min, $max, 10, 1, 0)
    
    ;----- Set line color and size -----
    _GraphGDIPlus_Set_PenColor($Graph, 0xFF325D87)
    _GraphGDIPlus_Set_PenSize($Graph, 2)
    
    ;----- Draw line -----
    _GraphGDIPlus_Plot_Start($Graph, 0, 0)
    
    For $i = 0 To $cnt - 1
        _GraphGDIPlus_Plot_Line($Graph, $i, $arr[$i])
    Next
    
    _GraphGDIPlus_Refresh($Graph)
    _GraphGDIPlus_ReDraw($hWnd)
EndFunc

Func WM_SIZE($hWnd, $iMsg, $lParam, $wParam)
    If $hWnd <> $MainWindow Then
        Return $GUI_RUNDEFMSG
    EndIf
    
    If GUICtrlRead($iTab) = 1 Then
        AdlibRegister('_Resized', 100)
    EndIf
    
    Return $GUI_RUNDEFMSG
EndFunc

Func _Resized()
    AdlibUnRegister('_Resized')
    Local $aWinPos = WinGetPos($MainWindow)
    Local $aWinSize = WinGetClientSize($MainWindow)
    WinMove($hGraph_GUI, '', $aWinPos[0] + 10, $aWinPos[1] + 60, $aWinSize[0] - 10, $aWinSize[1] - 30)
    _GraphDraw($hGraph_GUI, $Graph, 10, 10, $aWinSize[0] - 80, $aWinSize[1] - 70, 0xFF000000, 0xFFFFFEEE)
EndFunc

Func _WindowClose()
    Exit
EndFunc

Func _TabEvent()
    GUISetState((GUICtrlRead($iTab) = 1 ? @SW_SHOW : @SW_HIDE), $hGraph_GUI)
    _Resized()
EndFunc
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Спасибо большое!
Подскажите для чего у вас в коде перемещение графика вот это:
Код:
$aWinPos = WinGetPos($MainWindow)
WinMove($hGraph_GUI, '', $aWinPos[0] + 10, $aWinPos[1] + 60)

Можно же сразу задать окну $hGraph_GUI точные координаты и размеры при его создании.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
для чего у вас в коде перемещение графика вот это
Это осталось от тестов...
Немного поправил пример:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <GraphGDIPlus.au3>
#include <WinAPI.au3>
#include <Array.au3>

Global $Graph
Global $bResized = False

Opt('GUIOnEventMode', 1)

$MainWindow = GUICreate('Example 1', 700, 430, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, '_WindowClose')

$iTab = GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))
GUICtrlSetOnEvent($iTab, '_TabEvent')
GUICtrlCreateTabItem('Tab1')
GUICtrlCreateTabItem('Grafik')
GUICtrlCreateTabItem('Tab3')

$hGraph_GUI = GUICreate('', 690, 400, 0, 15, BitOR($WS_POPUP, $WS_CLIPCHILDREN), $WS_EX_MDICHILD, $MainWindow)
_GraphDraw($hGraph_GUI, $Graph, 10, 10, 620, 350, 0xFF000000, 0xFFFFFEEE)

GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState(@SW_SHOW, $MainWindow)

While 1
    Sleep(10)
WEnd

Func _GraphDraw($hWnd, ByRef $Graph, $iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    If IsArray($Graph) Then
        _GraphGDIPlus_Delete($hWnd, $Graph)
        $Graph = 0
    EndIf
    
    $Graph = _GraphGDIPlus_Create($hWnd, $iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    _GraphGDIPlus_Clear($Graph)
    
    Local Static $max = 0, $min = 0, $cnt = 0, $cur = 0, $arr[0]
    
    If UBound($arr) = 0 Then
        For $i = 0 To 1000
            $cnt = $i
            $cur += Random(-100000, 100000, 0)
            $min = ($min > $cur) ? $cur : $min
            $max = ($max < $cur) ? $cur : $max
            _ArrayAdd($arr, $cur)
        Next
    EndIf
    
    ;----- Set X Y -----
    _GraphGDIPlus_Set_RangeX($Graph, 10, $cnt, 10, 1, 0)
    _GraphGDIPlus_Set_RangeY($Graph, $min, $max, 10, 1, 0)
    
    ;----- Set line color and size -----
    _GraphGDIPlus_Set_PenColor($Graph, 0xFF325D87)
    _GraphGDIPlus_Set_PenSize($Graph, 2)
    
    ;----- Draw line -----
    _GraphGDIPlus_Plot_Start($Graph, 0, 0)
    
    For $i = 0 To $cnt - 1
        _GraphGDIPlus_Plot_Line($Graph, $i, $arr[$i])
    Next
    
    ;_GraphGDIPlus_Refresh($Graph)
    _GraphGDIPlus_ReDraw($hWnd)
EndFunc

Func WM_SIZE($hWnd, $iMsg, $lParam, $wParam)
    If $hWnd <> $MainWindow Then
        Return $GUI_RUNDEFMSG
    EndIf
    
    _Resized()
    $bResized = True
    
    Return $GUI_RUNDEFMSG
EndFunc

Func _Resized()
    If GUICtrlRead($iTab) <> 1 Then
        Return
    EndIf
    
    Local $aWinPos = WinGetPos($MainWindow)
    Local $aWinSize = WinGetClientSize($MainWindow)
    
    WinMove($hGraph_GUI, '', $aWinPos[0] + 10, $aWinPos[1] + 50, $aWinSize[0] - 10, $aWinSize[1] - 30)
    _GraphDraw($hGraph_GUI, $Graph, 10, 10, $aWinSize[0] - 80, $aWinSize[1] - 70, 0xFF000000, 0xFFFFFEEE)
EndFunc

Func _WindowClose()
    Exit
EndFunc

Func _TabEvent()
    GUISetState((GUICtrlRead($iTab) = 1 ? @SW_SHOW : @SW_HIDE), $hGraph_GUI)
    
    If $bResized Then
        $bResized = False
        _Resized()
    EndIf
EndFunc
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Да, спасибо! Получилось встроить график вроде как надо, но мерцания конечно при изменении размера просто жесть... От этого никак не избавиться? Я уже сделал чтобы данные не доставались из БД при каждой перерисовке, а просто одни и те же использовались но все равно очень мерцает.

Если все таки вернуться к идее построения графика средствами HTML5, есть какие-то варианты заставить работать в autoit движок chromium или другой? Так как IE не понимает HTML5 к сожалению и не рисует графики. На JavaScript куча библиотек для построения графиков есть, причем очень красивых где на курсоре мышки тянется перекрестие с данными по границам графиков и сведениями в каждой точке и все это гладко масштабируется без мерцаний средствами браузерного движка но отсутствие поддержки IE просто не дает шансов на использование (((
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
Как тебе такой вариант:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <GraphGDIPlus.au3>
#include <WinAPI.au3>
#include <Array.au3>

Opt('GUIOnEventMode', 1)

$MainWindow = GUICreate('Example 1', 700, 430, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, '_WindowClose')

$iTab = GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))
GUICtrlCreateTabItem('Tab1')
GUICtrlCreateTabItem('Grafik')
$iGraphPic = _GraphDraw(10, 10, 660, 380, 0xFF000000, 0xFFFFFEEE)
GUICtrlSetResizing($iGraphPic, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP))
GUICtrlCreateTabItem('Tab3')

GUISetState(@SW_SHOW, $MainWindow)

While 1
    Sleep(10)
WEnd

Func _GraphDraw($iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    Local $hGraph_GUI = GUICreate('', $iWidth + 70, $iHeight + 70, -1, -1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    WinSetTrans($hGraph_GUI, '', 0)
    GUISetState(@SW_SHOWNOACTIVATE, $hGraph_GUI)
    
    Local $Graph = _GraphGDIPlus_Create($hGraph_GUI, $iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    _GraphGDIPlus_Clear($Graph)
    
    Local $max = 0, $min = 0, $cnt = 0, $cur = 0, $arr[0]
    
    For $i = 0 To 1000
        $cnt = $i
        $cur += Random(-100000, 100000, 0)
        $min = ($min > $cur) ? $cur : $min
        $max = ($max < $cur) ? $cur : $max
        _ArrayAdd($arr, $cur)
    Next
   
    ;----- Set X Y -----
    _GraphGDIPlus_Set_RangeX($Graph, 10, $cnt, 10, 1, 0)
    _GraphGDIPlus_Set_RangeY($Graph, $min, $max, 10, 1, 0)
     
    ;----- Set line color and size -----
    _GraphGDIPlus_Set_PenColor($Graph, 0xFF325D87)
    _GraphGDIPlus_Set_PenSize($Graph, 2)
    
    ;----- Draw line -----
    _GraphGDIPlus_Plot_Start($Graph, 0, 0)
    
    For $i = 0 To $cnt - 1
        _GraphGDIPlus_Plot_Line($Graph, $i, $arr[$i])
    Next
    
    Local $sFile = @TempDir & '\~GraphImage.jpg'
    
    _GraphGDIPlus_Refresh($Graph)
    ;_GraphGDIPlus_ReDraw($hGraph_GUI)
    _GraphGDIPlus_SaveImage($sFile, $hGraph_GUI)
    _GraphGDIPlus_Delete($hGraph_GUI, $Graph)
    
    GUIDelete($hGraph_GUI)
    Local $iPic = GUICtrlCreatePic($sFile, $iLeft, $iTop + 20, $iWidth, $iHeight)
    FileDelete($sFile)
    
    Return $iPic
EndFunc

Func _WindowClose()
    Exit
EndFunc


Конечно нужно поработать над качеством, но идея думаю ясна...
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Конечно нужно поработать над качеством, но идея думаю ясна...
Спасибо за идею! Интересный вариант, попробую прикинуть... Но чарт в браузере был бы круче ))) Кстати новый браузер EDGE в винде на движке хромиума. Нет информации когда сие чудо можно будет встраивать в приложения autoit?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
Другая идея, отключаем отображение содержимого окна при его перетаскивании...

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <WinAPISys.au3>
#include <GraphGDIPlus.au3>

Global $bGraphActive_Flag = True
Global $bResized = False
Global $aGraph, $hGraph_GUI
Global $hMain_GUI, $iTab

Global Const $SPI_SETDRAGFULLWINDOWS = 0x0025
Global Const $OLD_DRAGFULLWINDOW = RegRead('HKEY_CURRENT_USER\Control Panel\Desktop', 'DragFullWindows')

$hMain_GUI = GUICreate('GraphGDIPlus On Tab Example', 700, 430, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))

$iTab = GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))
$iTabItem1 = GUICtrlCreateTabItem('Tab1')
$iTabItem_Graph = GUICtrlCreateTabItem('Graph')
$iTabItem3 = GUICtrlCreateTabItem('Tab3')

_GraphDraw(10, 10, 620, 350, 0xFF000000, 0xFFFFFEEE)

AdlibRegister('_GraphActiveCheck', 10)
GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState(@SW_SHOW, $hMain_GUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _WinAPI_SystemParametersInfo($SPI_SETDRAGFULLWINDOWS, $OLD_DRAGFULLWINDOW, 2)
            Exit
        Case $iTab
            If GUICtrlRead($iTab, 1) = $iTabItem_Graph Then
                GUISetState(@SW_SHOWNOACTIVATE, $hGraph_GUI)
                _WinAPI_SystemParametersInfo($SPI_SETDRAGFULLWINDOWS, 0, 2)
            Else
                GUISetState(@SW_HIDE, $hGraph_GUI)
                _WinAPI_SystemParametersInfo($SPI_SETDRAGFULLWINDOWS, $OLD_DRAGFULLWINDOW, 2)
            EndIf
            
            If $bResized Then
                $bResized = False
                _GraphResize()
            Else
                _GraphGDIPlus_ReDraw($hMain_GUI)
            EndIf
    EndSwitch
WEnd

Func _GraphDraw($iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    If IsArray($aGraph) Then
        _GraphGDIPlus_Delete($hGraph_GUI, $aGraph)
        $aGraph = 0
    Else
        $hGraph_GUI = GUICreate('', 690, 400, 0, 15, $WS_POPUP, $WS_EX_MDICHILD, $hMain_GUI)
        GUISetState(@SW_DISABLE, $hGraph_GUI)
    EndIf
    
    $aGraph = _GraphGDIPlus_Create($hGraph_GUI, $iLeft, $iTop, $iWidth, $iHeight, $iColorBorder, $iColorFill)
    _GraphGDIPlus_Clear($aGraph)
    
    Local Static $iMax = 0, $iMin = 0, $iCur = 0, $iCnt = 1000, $aArr[$iCnt + 1]
    
    If $aArr[0] = 0 Then
        For $i = 0 To 1000
            $iCur += Random(-100000, 100000, 0)
            $iMin = ($iMin > $iCur) ? $iCur : $iMin
            $iMax = ($iMax < $iCur) ? $iCur : $iMax
            $aArr[$i] = $iCur
        Next
    EndIf
    
    ;----- Set X Y -----
    _GraphGDIPlus_Set_RangeX($aGraph, 10, $iCnt, 10, 1, 0)
    _GraphGDIPlus_Set_RangeY($aGraph, $iMin, $iMax, 10, 1, 0)
    
    ;----- Set line color and size -----
    _GraphGDIPlus_Set_PenColor($aGraph, 0xFF325D87)
    _GraphGDIPlus_Set_PenSize($aGraph, 2)
    
    ;----- Draw line -----
    _GraphGDIPlus_Plot_Start($aGraph, 0, 0)
    
    For $i = 0 To $iCnt - 1
        _GraphGDIPlus_Plot_Line($aGraph, $i, $aArr[$i])
    Next
    
    _GraphGDIPlus_ReDraw($hGraph_GUI)
EndFunc

Func _GraphResize()
    If GUICtrlRead($iTab, 1) <> $iTabItem_Graph Then
        Return
    EndIf
    
    Local $aWinPos = WinGetPos($hMain_GUI)
    Local $aWinSize = WinGetClientSize($hMain_GUI)
    
    WinMove($hGraph_GUI, '', $aWinPos[0] + 10, $aWinPos[1] + 50, $aWinSize[0] - 10, $aWinSize[1] - 30)
    _GraphDraw(10, 10, $aWinSize[0] - 80, $aWinSize[1] - 70, 0xFF000000, 0xFFFFFEEE)
EndFunc

Func _GraphActiveCheck()
    If Not $bGraphActive_Flag And WinActive($hMain_GUI) Then
        $bGraphActive_Flag = True
        _WinAPI_SystemParametersInfo($SPI_SETDRAGFULLWINDOWS, 0, 2)
    ElseIf $bGraphActive_Flag And Not WinActive($hMain_GUI) Then
        $bGraphActive_Flag = False
        _WinAPI_SystemParametersInfo($SPI_SETDRAGFULLWINDOWS, $OLD_DRAGFULLWINDOW, 2)
    EndIf
EndFunc

Func WM_SIZE($hWnd, $iMsg, $lParam, $wParam)
    If $hWnd = $hMain_GUI Then
        _GraphResize()
        $bResized = True
    EndIf
    
    Return $GUI_RUNDEFMSG
EndFunc


Но только когда активна вкладка с графиком.
 
Последнее редактирование:
Верх