Что нового

как в сторону двигать нарисованный график

D

dreamorder

Гость
Доброго времени суток гос-да.

Совместными усилиями с другими людьми этого замечательного форума,
был написан код графика:

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


но требуется ещё доработка, тут область для рисования кончается при сдвиге влево.
Вот по этому вопросу и была создана эта тема.
Помогите пожалуйста дописать полноценный, с автопрокруткой влево график :scratch:

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

dreamorder

Гость
Ну в общем то большое спасибо Redline
за предложенный пример сдвига области рисования графика.
Всё отлично работает, я всего лишь увеличил ширину области рисования до 72999,
но этого конечно мб кому то и не хватит(мне хватает :smile:), тогда нужно будет как то
вставлять новую или зациклить прежнюю область для рисования :-\

пример с достаточной для меня шириной :

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <BigNum.au3>

$iShift = 0 ; начальный сдвиг графика
$iStep = 600
$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(53, 55))
AdlibRegister('Line', 55)
AdlibRegister('pPerx', 500)

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
Global $gg = 72999


_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($gg, $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, $gg, $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, $gg - $iShift, $iHeight/2, $hPenPurpurThin) ; линия отрезка
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iShift, 0, $gg, $iHeight)
EndFunc   ;==>grss

Func WM_ERASEBKGND()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iShift, 0, $gg, $iHeight)
EndFunc   ;==>WM_ERASEBKGND


Redline :beer:
 
Верх