D
dreamorder
Гость
Доброго времени суток гос-да.
Совместными усилиями с другими людьми этого замечательного форума,
был написан код графика:
теперь осталось придумать как возможно сдвигать нарисованные "свечи" графика влево, так что бы нарисовав их к примеру
до середины окна графика, область для рисования автоматически уходила в левый бок за пределы окна и при этом не кончалась.
уважаемый Redline предложил оч. хороший пример:
но требуется ещё доработка, тут область для рисования кончается при сдвиге влево.
Вот по этому вопросу и была создана эта тема.
Помогите пожалуйста дописать полноценный, с автопрокруткой влево график
Заранее всем откликнувшимся большое спасибо!
Совместными усилиями с другими людьми этого замечательного форума,
был написан код графика:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <BigNum.au3>
#include <Date.au3>
;=====================================================================================
$Form2 = GUICreate("Form2", 955, 630, 100, 100, $WS_CLIPCHILDREN)
GUISetBkColor(0x808080)
$hLabel = GuiCtrlCreateLabel( '', 887, 587, 55, 14)
GUICtrlSetColor(106, 0x191970) ; цвет текста элемента
$iWidth = 993
$iHeight = 219
$Form1 = GUICreate("",$iWidth, $iHeight, 32, 5, BitOR($DS_SETFOREGROUND,$WS_CHILD),-1,$Form2) ; дочернее окно графика
GUISetBkColor(0x000000)
$PolosaProcent = GUICtrlCreateLabel(" ", 7, 109, 883, 1,$WS_BORDER)
$PolosaProcent1 = GUICtrlCreateLabel(" ", 8, 109, 909, 1)
GUICtrlSetBkColor(-1, 0x663333 )
$Procent = GUICtrlCreateLabel("00%", 883, 101, 33, 16,$SS_RIGHT)
GUICtrlSetColor(-1, 0x1F75FE)
GUISetState(@SW_SHOW,$Form2)
GUISetState(@SW_SHOW,$Form1)
;======================================================================================
AdlibRegister('time', 300)
AdlibRegister('ran', 1200)
AdlibRegister('Line', 1200)
AdlibRegister('_Main', 60000)
Global $nCheck
Global $0iStartX
Global $1iStartX
Global $2iStartX
Global $3iStartX
Global $4iStartX
Global $5iStartX
Global $iStartY = 109
Global $0iEndX
Global $1iEndX
Global $2iEndX
Global $3iEndX
Global $4iEndX
Global $5iEndX
Global $iEndY = 109
Global $Per = 0
Global $pPer
Global $centrcen = 0
Global $0pPerx1 = 2
Global $0pPerx2 = 5
Global $1pPerx1 = 1
Global $1pPerx2 = 2
Global $2pPerx1 = 2
Global $2pPerx2 = 3
Global $3pPerx1 = 3
Global $3pPerx2 = 4
Global $4pPerx1 = 4
Global $4pPerx2 = 5
Global $5pPerx1 = 5
Global $5pPerx2 = 6
Global $Lpx = 109
Global $Lpxx = 101
Global $Lpyy = 883
Global $Lpy = 8
_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
Global $hBackbuffer1 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
Global $hPenBlueThin0 = _GDIPlus_PenCreate(0xFFFF0000,3) ; перо для линии
Global $hPenBlueThin1 = _GDIPlus_PenCreate(0xFF008000,2) ; перо для линии
Global $hPenBlueThin2 = _GDIPlus_PenCreate(0xFFD2691E,3) ; перо для линии
Global $hPenBlueThin3 = _GDIPlus_PenCreate(0xFFFFFFff,4) ; перо для линии
_GDIPlus_GraphicsSetSmoothingMode($hBackbuffer1, 2)
GUIRegisterMsg($WM_ERASEBKGND, 'WM_ERASEBKGND')
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_GDIPlus_PenDispose($hPenBlueThin0) ; удаление ресурсов
_GDIPlus_PenDispose($hPenBlueThin1) ; удаление ресурсов
_GDIPlus_PenDispose($hPenBlueThin2) ; удаление ресурсов
_GDIPlus_PenDispose($hPenBlueThin3) ; удаление ресурсов
_GDIPlus_GraphicsDispose($hGraphic) ; удаление ресурсов
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hBackbuffer1)
_GDIPlus_Shutdown()
Exit
EndSwitch
WEnd
Func time()
If @SEC <> $nCheck Then
GUICtrlSetData($hLabel, " " & @HOUR & ":" & @MIN & ":" & @SEC )
GUICtrlSetFont(-1, 10, 600, 0, "Tahoma")
$nCheck = @SEC
EndIf
EndFunc
Func _Main()
Local $tTime, $aTime
; Получение текущего системного времени
$tTime = _Date_Time_GetSystemTime()
$aTime = _Date_Time_SystemTimeToArray($tTime)
; MemoWrite("Час .........: " & $aTime[3])
; MemoWrite("Минута ......: " & $aTime[4])
; MemoWrite("Секунда .....: " & $aTime[5])
; MemoWrite("Миллисекунда : " & $aTime[6])
Select
Case $aTime[4] = 0 ;если 00 минут то начинает следующую свечу
pPerx()
Case $aTime[4] = 12 ;если 12 минут то начинает следующую свечу
pPerx()
Case $aTime[4] = 24
pPerx()
Case $aTime[4] = 36
pPerx()
Case $aTime[4] = 48
pPerx()
EndSelect
EndFunc
Func pPerx()
$centrcen = $Per + $pPer
$0pPerx1 += 7
$0pPerx2 += 7
$1pPerx1 += 7
$1pPerx2 += 7
$2pPerx1 += 7
$2pPerx2 += 7
$3pPerx1 += 7
$3pPerx2 += 7
$4pPerx1 += 7
$4pPerx2 += 7
$5pPerx1 += 7
$5pPerx2 += 7
$Lpy += 7
EndFunc
Func ran()
$pPer = Random(-3, 3, 1)
EndFunc
Func Line()
Select
Case $Per <-100
$Per += 5
$iStartY += 5
$iEndY += 5
$Lpx += 5
$Lpxx += 5
Case $Per > 100
$iStartY -= 5
$iEndY -= 5
$Per -= 5
$Lpx -= 5
$Lpxx -= 5
EndSelect
$Per =_BigNum_Add($Per, $pPer)
$0iStartX = $0pPerx1
$0iEndX = $0pPerx2
$1iStartX = $1pPerx1
$1iEndX = $1pPerx2
$2iStartX = $2pPerx1
$2iEndX = $2pPerx2
$3iStartX = $3pPerx1
$3iEndX = $3pPerx2
$4iStartX = $4pPerx1
$4iEndX = $4pPerx2
$5iStartX = $5pPerx1
$5iEndX = $5pPerx2
$iStartY += $pPer
$iEndY += $pPer
$Lpx += $pPer
$Lpxx += $pPer
Lp100()
grss0($0iStartX, $iStartY, $0iEndX, $iEndY)
grss1($1iStartX, $iStartY, $1iEndX, $iEndY)
grss2($2iStartX, $iStartY, $2iEndX, $iEndY)
grss3($3iStartX, $iStartY, $3iEndX, $iEndY)
grss4($4iStartX, $iStartY, $4iEndX, $iEndY)
grss5($5iStartX, $iStartY, $5iEndX, $iEndY)
EndFunc
Func Lp100()
Local $PR
$PR &= $Per
$PR &='%'
GUICtrlDelete($PolosaProcent)
$PolosaProcent = GUICtrlCreateLabel(" ", $Lpy, $Lpx, 883, 1,$WS_BORDER)
GUICtrlDelete($Procent)
$Procent = GUICtrlCreateLabel($PR, $Lpyy, $Lpxx, 33, 16,$SS_RIGHT)
GUICtrlSetColor(-1, 0x1F75FE)
EndFunc
Func grss1($1iStartX, $iStartY, $1iEndX, $iEndY)
Select
Case $Per >= $centrcen
_GDIPlus_GraphicsDrawLine($hBackbuffer1, $1iStartX, $iStartY, $1iEndX, $iEndY, $hPenBlueThin1) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndSelect
EndFunc
Func grss2($2iStartX, $iStartY, $2iEndX, $iEndY)
Select
Case $Per >= $centrcen
_GDIPlus_GraphicsDrawLine($hBackbuffer1, $2iStartX, $iStartY, $2iEndX, $iEndY, $hPenBlueThin2) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndSelect
EndFunc
Func grss3($3iStartX, $iStartY, $3iEndX, $iEndY)
Select
Case $Per >= $centrcen
_GDIPlus_GraphicsDrawLine($hBackbuffer1, $3iStartX, $iStartY, $3iEndX, $iEndY, $hPenBlueThin3) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndSelect
EndFunc
Func grss4($4iStartX, $iStartY, $4iEndX, $iEndY)
Select
Case $Per >= $centrcen
_GDIPlus_GraphicsDrawLine($hBackbuffer1, $4iStartX, $iStartY, $4iEndX, $iEndY, $hPenBlueThin2) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndSelect
EndFunc
Func grss5($5iStartX, $iStartY, $5iEndX, $iEndY)
Select
Case $Per >= $centrcen
_GDIPlus_GraphicsDrawLine($hBackbuffer1, $5iStartX, $iStartY, $5iEndX, $iEndY, $hPenBlueThin1) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndSelect
EndFunc
Func grss0($0iStartX, $iStartY, $0iEndX, $iEndY)
Select
Case $Per <= $centrcen
_GDIPlus_GraphicsDrawLine($hBackbuffer1, $3iStartX, $iStartY, $3iEndX, $iEndY, $hPenBlueThin0) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndSelect
EndFunc
Func WM_ERASEBKGND()
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndFunc
теперь осталось придумать как возможно сдвигать нарисованные "свечи" графика влево, так что бы нарисовав их к примеру
до середины окна графика, область для рисования автоматически уходила в левый бок за пределы окна и при этом не кончалась.
уважаемый Redline предложил оч. хороший пример:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <BigNum.au3>
$iShift = 0 ; начальный сдвиг графика
$iStep = 400
$iWidth = 800
$iHeight = 600
$Form1 = GUICreate("Form1", $iWidth, $iHeight)
GUISetBkColor(0x000000)
$Button1 = GUICtrlCreateButton("СБРОС", 350, 5, 100, 19, $WS_BORDER, $WS_EX_STATICEDGE)
GUICtrlSetCursor(-1, 0)
$PolosaProcent = GUICtrlCreateLabel(" ", 38, 300, 700, 1, $WS_BORDER)
$Procent = GUICtrlCreateLabel(" 0%", 45, 293, 43, 16, BitOR($SS_CENTERIMAGE, $WS_BORDER))
GUICtrlSetColor(-1, 0x1F75FE)
GUISetState(@SW_SHOW, $Form1)
AdlibRegister('ran', Random(50, 55))
AdlibRegister('Line', 55)
AdlibRegister('pPerx', 50)
Global $iStartX
Global $iStartY = 300
Global $iEndX
Global $iEndY = 300
Global $Per = 0
Global $pPer
Global $pPerx1 = 33
Global $pPerx2 = 37
Global $Lpx = 300
Global $Lpxx = 293
Global $Lpyy = 45
Global $Lpy = 39
_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
Global $hPenBlueThin = _GDIPlus_PenCreate(0xFF33CCFF, 2) ; перо для синей линии
Global $hPenPurpurThin = _GDIPlus_PenCreate(0xFF990066, 1) ; перо для нулевой линии
_GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
GUIRegisterMsg($WM_ERASEBKGND, 'WM_ERASEBKGND')
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_GDIPlus_PenDispose($hPenBlueThin) ; удаление ресурсов
_GDIPlus_PenDispose($hPenPurpurThin) ; удаление ресурсов
_GDIPlus_GraphicsDispose($hGraphic) ; удаление ресурсов
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hBackbuffer)
_GDIPlus_Shutdown()
Exit
Case $Button1
obnulen()
EndSwitch
WEnd
Func pPerx()
If $Lpy >= $iStep Then ; рассояние в пикселях, после которого нужно делать сдвиг графика
$iShift -= 7 ; смещение графика
_GDIPlus_GraphicsClear($hGraphic) ; очистка графика
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iShift, 0, $iWidth, $iHeight) ; рисуем заново со смещением
Else
$Lpyy += 7
$Lpy += 7
EndIf
$pPerx1 += 7
$pPerx2 += 7
EndFunc ;==>pPerx
Func ran()
$pPer = Random(-3, 3, 1)
EndFunc ;==>ran
Func obnulen()
$Per = 0
$iStartY = 300
$iEndY = 300
$Lpx = 300
$Lpxx = 293
EndFunc ;==>obnulen
Func Line()
Select
Case $Per < -200
$Per += 15
$iStartY += 15
$iEndY += 15
$Lpx += 15
$Lpxx += 15
Case $Per > 200
$iStartY -= 15
$iEndY -= 15
$Per -= 15
$Lpx -= 15
$Lpxx -= 15
EndSelect
$Per = _BigNum_Add($Per, $pPer)
$iStartX = $pPerx1
$iStartY += $pPer
$iEndX = $pPerx2
$iEndY += $pPer
$Lpx += $pPer
$Lpxx += $pPer
Lp100()
grss($iStartX, $iStartY, $iEndX, $iEndY)
EndFunc ;==>Line
Func Lp100()
Local $PR
$PR &= $Per
$PR &= ' %'
GUICtrlSetPos($PolosaProcent, $Lpy, $Lpx)
GUICtrlSetPos($Procent, $Lpyy, $Lpxx)
GUICtrlSetData($Procent, $PR)
EndFunc ;==>Lp100
Func grss($iStartX, $iStartY, $iEndX, $iEndY)
_GDIPlus_GraphicsDrawLine($hBackbuffer, $iStartX, $iStartY, $iEndX, $iEndY, $hPenBlueThin) ; линия отрезка
_GDIPlus_GraphicsDrawLine($hBackbuffer, 0, $iHeight/2, $iWidth - $iShift, $iHeight/2, $hPenPurpurThin) ; линия отрезка
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iShift, 0, $iWidth, $iHeight)
EndFunc ;==>grss
Func WM_ERASEBKGND()
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iShift, 0, $iWidth, $iHeight)
EndFunc ;==>WM_ERASEBKGND
но требуется ещё доработка, тут область для рисования кончается при сдвиге влево.
Вот по этому вопросу и была создана эта тема.
Помогите пожалуйста дописать полноценный, с автопрокруткой влево график

Заранее всем откликнувшимся большое спасибо!