Что нового

Проблемы с 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:
 

Вложения

  • GraphGDIPlus.au3
    29 КБ · Просмотры: 8
Последнее редактирование:

CreatoR

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Проблему с отображением на табе решить можно
Как то так:
Код:
#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,669
Репутация
2,463
Как то так:

Код:
#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,669
Репутация
2,463
для чего у вас в коде перемещение графика вот это
Это осталось от тестов...
Немного поправил пример:
Код:
#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,669
Репутация
2,463
Как тебе такой вариант:
Код:
#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,669
Репутация
2,463
Другая идея, отключаем отображение содержимого окна при его перетаскивании...

Код:
#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


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