Что нового

GUICtrlCreateGraphic и полосы прокрутки

running-frag

why me?
Сообщения
441
Репутация
60
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Opt('MustDeclareVars', 1)

Global $MAXGr = 6, $del
Global $a[$MAXGr + 1]	; 0 and $MAXGr entries not used to allow GUICtrlDelete result

Example()

Func Example()
	Local $msg, $inc, $i
	
	CreateChild()

	$i = 1
	$inc = 1
	Do
		$msg = GUIGetMsg()

		If $msg = $del Then
			GUICtrlDelete($a[$i])
			$i = $i + $inc
			If $i < 0 Or $i > $MAXGr Then Exit
		EndIf
		If $msg > 0 Then MsgBox(0, "clicked", $msg & @LF & $a[5], 2)
	Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Example


Func CreateChild()
	Local $child
	$child = GUICreate("My Draw")
	$del = GUICtrlCreateButton("Delete", 50, 165, 50)


	$a[1] = GUICtrlCreateGraphic(20, 50, 100, 100)
	GUICtrlSetBkColor(-1, 0xffffff)
	GUICtrlSetColor(-1, 0)

	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
	GUICtrlSetGraphic(-1, $GUI_GR_PIE, 50, 50, 40, 30, 270)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00ff00, 0xffffff)
	GUICtrlSetGraphic(-1, $GUI_GR_PIE, 58, 50, 40, -60, 90)

	GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 100, 100, 50, 80)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00ff00, 0xc0c0ff)
	GUICtrlSetGraphic(-1, $GUI_GR_RECT, 350, 200, 50, 80)
	GUICtrlCreateLabel("label", 65, 100, 30)
	GUICtrlSetColor(-1, 0xff)


	$a[2] = GUICtrlCreateGraphic(220, 50, 100, 100)
	GUICtrlSetStyle(-1, $SS_NOTIFY)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0, 0xff)
	GUICtrlSetGraphic(-1, $GUI_GR_PIE, 50, 50, 40, 30, 270)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00ff00, 0xffffff)
	GUICtrlSetGraphic(-1, $GUI_GR_PIE, 58, 50, 40, -60, 90)

	$a[3] = GUICtrlCreateGraphic(220, 150, 100, 100, 0)
	GUICtrlSetBkColor(-1, 0xf08080)
	GUICtrlSetColor(-1, 0xff)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff00)
	GUICtrlSetGraphic(-1, $GUI_GR_RECT, 50, 50, 80, 80)

	$a[4] = GUICtrlCreateGraphic(20, 200, 80, 80)
	GUICtrlSetState(-1, $GUI_DISABLE)
	GUICtrlSetBkColor(-1, 0xffffff)
	GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 10, 10)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff)
	GUICtrlSetGraphic(-1, $GUI_GR_LINE, 30, 40)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff00)
	GUICtrlSetGraphic(-1, $GUI_GR_LINE, 70, 70)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000)
	GUICtrlSetGraphic(-1, $GUI_GR_LINE, 10, 50)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xffff00)
	GUICtrlSetGraphic(-1, $GUI_GR_LINE, 10, 10)

	$a[5] = GUICtrlCreateGraphic(150, 10, 50, 50, 0)
	GUICtrlSetBkColor(-1, 0xa0ffa0)
	GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 20, 20) 	; start point
	; it is better to draw line and after point
	; to avoid to switch color at each drawing
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff)
	GUICtrlSetGraphic(-1, $GUI_GR_DOT, 30, 30)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0)
	GUICtrlSetGraphic(-1, $GUI_GR_LINE, 20, 40)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000)
	GUICtrlSetGraphic(-1, $GUI_GR_DOT, 25, 25)
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0)
	GUICtrlSetGraphic(-1, $GUI_GR_LINE, 40, 40)
	GUICtrlSetGraphic(-1, $GUI_GR_DOT, 40, 40)

	GUISetState()
EndFunc   ;==>CreateChild


Вопрос такой. Пример взят с Help'a. Тут "рисунок" уходит вправа "за" GUI и скролл бар не появляется. Как его реализовать подскажите?

Или как создать зону для "рисунка" которая будет как фрэйм (т.е. окно в окне) с полосами прокрутки (если рисунок больше чем сам фрэйм).
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Я, например, в своих скриптах реализовывал график в таком виде:

Код:
Global $x1 = 200, $y1 = 160, $child_w = 580, $child_h = 186

	Global $Child = GUICreate("", $child_w, $child_h, 6, 305, BitOR($WS_POPUP, $WS_DISABLED), BitOR($WS_EX_MDICHILD, $WS_EX_LAYERED), $DPP) ; $DPP - ИД материнского окна
	GUISetBkColor(0x0)
	$dummy = GUICtrlCreatePic("", 0, 0, -1, -1)

; таблица с разметкой
	$Grid = GUICtrlCreateGraphic(4, 4, $child_w - 8, $y1, $SS_SUNKEN)
	GUICtrlSetGraphic($Grid, $GUI_GR_COLOR, 0xE0E0E0)
	GUICtrlSetGraphic($Grid, $GUI_GR_PENSIZE, 1)
	GUICtrlSetGraphic($Grid, $GUI_GR_MOVE, 0, $y1 / 4)
	GUICtrlSetGraphic($Grid, $GUI_GR_LINE, $child_w - 8, $y1 / 4)
	GUICtrlSetGraphic($Grid, $GUI_GR_MOVE, 0, $y1 / 2)
	GUICtrlSetGraphic($Grid, $GUI_GR_LINE, $child_w - 8, $y1 / 2)
	GUICtrlSetGraphic($Grid, $GUI_GR_MOVE, 0, $y1 * 0.75)
	GUICtrlSetGraphic($Grid, $GUI_GR_LINE, $child_w - 8, $y1 * 0.75)
	GUICtrlSetGraphic($Grid, $GUI_GR_MOVE, 532, 0)
	GUICtrlSetGraphic($Grid, $GUI_GR_LINE, 532, $y1)
	GUICtrlSetGraphic($Grid, $GUI_GR_CLOSE)
	GUICtrlSetState($Grid, $GUI_DISABLE)

;собственно график
	Global $GRPH = GUICtrlCreateGraphic(4, 4, $x1, $y1)
	GUICtrlSetGraphic($GRPH, $GUI_GR_PENSIZE, 2)
	GUICtrlSetState($Grid, $GUI_DISABLE)
	Global $G_VBR = GUICtrlCreateLabel("Y = 0", 136, $y1 + 6, 146, 17, BitOR($SS_CENTER, $SS_SUNKEN))
	GUICtrlSetColor(-1, 0x00FF00)
	Global $G_ABR = GUICtrlCreateLabel("Z = 0", 329, $y1 + 6, 146, 17, BitOR($SS_CENTER, $SS_SUNKEN))
	GUICtrlSetColor(-1, 0xFF0000)
	$Label20 = GUICtrlCreateLabel(Int($y1 / $GDimX), $child_w - 40, 6, 33, 16, BitOR($SS_CENTER, $SS_SUNKEN))
	GUICtrlSetColor(-1, 0xFFFFFF)
	GUICtrlSetFont(-1, 8)
	$Label21 = GUICtrlCreateLabel(Int(($y1 / $GDimX) / 2), $child_w - 40, ($y1 / 2) + 6, 33, 16, BitOR($SS_CENTER, $SS_SUNKEN))
	GUICtrlSetColor(-1, 0xFFFFFF)
	GUICtrlSetFont(-1, 8)
	$GridMasker = GUICtrlCreateGraphic(0, 7, 12, $y1)
	GUICtrlSetGraphic($GridMasker, $GUI_GR_CLOSE)
	GUISetState(@SW_SHOW)



Так как отдельного класса в Автоите для постройки полосы прокрутки не предусмотрено, я свой график двигал так: сначала создается Slider, потом при действии на нем происходит следующее:

Код:
$count = 0 ; позиция, считанная со слайдера
Func _TickGraph()
	GUICtrlSetPos($GRPH, -$count, 2)
	GUICtrlSetGraphic($GRPH, $GUI_GR_REFRESH)
EndFunc   ;==>_Encode_TickGraph


Пример выдерт на скору руку из работающего скрипта, т.к. немного опаздываю... Оставляйте комментарии, вечером сможем обсудить.


Добавлено:
Сообщение автоматически объединено:

Да, чтобы это заработало в твоем скрипте, надо сменить так:

Код:
; внутри функции Example

Do
        $msg = GUIGetMsg()

        If $msg = $del Then
            GUICtrlDelete($a[$i])
            $i = $i + $inc
            If $i < 0 Or $i > $MAXGr Then Exit
        EndIf
        If $msg = $slider1 Then
            Local $z = GUICtrlRead($Slider1)
	GUICtrlSetPos($a[1], -$z, 50)
	; и так далее по всем графикам
        EndIf
    Until $msg = $GUI_EVENT_CLOSE

;Внутри функции CreateChild()

	Local $child
    $child = GUICreate("My Draw")
    $del = GUICtrlCreateButton("Delete", 50, 165, 50)
	Global $Slider1 = GUICtrlCreateSlider(8, 360, 300, 45)
	GUICtrlSetLimit(-1, 600, 0)
 
Верх