Что нового

Как прервать цикл с помощью кнопки в окне GUI ?

urrya

Новичок
Сообщения
159
Репутация
1
Доброго времени всем.
Столкнулся с не приятной для меня задачкой.
В данном примере кода никак не хочет работать кнопка "STOP" в окне.

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

HotKeySet('{F1}', 'stop')

Global $Form2 = GUICreate("Form1", 399, 300)
GUISetBkColor(0x000000)
Global $Button = GUICtrlCreateButton("PUSK", 50, 250, 130, 22,$SS_CENTERIMAGE)
GUICtrlSetStyle(-1,$BS_CENTER)
GUICtrlSetCursor (-1, 0)
Global $Button2 = GUICtrlCreateButton("STOP", 220, 250, 130, 22,$SS_CENTERIMAGE)
GUICtrlSetStyle(-1,$BS_CENTER)
GUICtrlSetCursor (-1, 0)
Global $Form1 = GUICreate("", 399, 200, 0, 0, BitOR($DS_SETFOREGROUND,$WS_CHILD,$WS_BORDER),-1,$Form2) 
GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_SHOW, $Form2)

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
$hBrush1 = _GDIPlus_BrushCreateSolid()

Global $i = 0

While 1
Local $nMsg = GUIGetMsg()
Switch $nMsg
	Case $GUI_EVENT_CLOSE
		_GDIPlus_BrushDispose($hBrush1)
		 _GDIPlus_GraphicsDispose($hGraphic)
		 _GDIPlus_Shutdown()
	   Exit
   Case $Button
       pusk()
   Case $Button
       stop()
EndSwitch
WEnd

Func pusk()
	$i = 0
Do
    _GDIPlus_BrushSetSolidColor($hBrush1, '0x' & Hex(Random(0xFF000000, 0xFFFFFFFF, 1)))
    _GDIPlus_GraphicsFillRect($hGraphic, Random(1, 390), Random(1, 290), 10, 10, $hBrush1)
	Sleep(10)
Until $i = 1000
EndFunc

Func stop()
	$i = 1000
EndFunc


Сама функция
Код:
Func stop()
    $i = 1000
EndFunc
конечно работает при использовании "горячей клавиши",
но с кнопки в окне не знаю как сделать.

Пожалуйста подскажите или лучше покажите как правильно сделать прерывание цикла как в примере.
Заранее спасибо всем.


:-\
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
urrya [?]
Пожалуйста подскажите или лучше покажите как правильно сделать прерывание цикла как в примере.
Код:
;...
While 1
	Local $nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_GDIPlus_BrushDispose($hBrush1)
			 _GDIPlus_GraphicsDispose($hGraphic)
			 _GDIPlus_Shutdown()
		   Exit
	   Case $Button
		   AdlibRegister('pusk', 10)
	   Case $Button2
		   AdlibUnRegister('pusk')
	EndSwitch
WEnd

Func pusk()

	_GDIPlus_BrushSetSolidColor($hBrush1, '0x' & Hex(Random(0xFF000000, 0xFFFFFFFF, 1)))
	_GDIPlus_GraphicsFillRect($hGraphic, Random(1, 390), Random(1, 290), 10, 10, $hBrush1)
EndFunc
;...
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Вариант
Код:
; ...
;~ Global $i = 0

While 1
Local $nMsg = GUIGetMsg()
Switch $nMsg
    Case $GUI_EVENT_CLOSE
      _GDIPlus_BrushDispose($hBrush1)
      _GDIPlus_GraphicsDispose($hGraphic)
      _GDIPlus_Shutdown()
      Exit
   Case $Button
      pusk()
;~    Case $Button
;~        stop()
EndSwitch
WEnd

Func pusk()
  Local $i = 0
  Do
    _GDIPlus_BrushSetSolidColor($hBrush1, '0x' & Hex(Random(0xFF000000, 0xFFFFFFFF, 1)))
    _GDIPlus_GraphicsFillRect($hGraphic, Random(1, 390), Random(1, 290), 10, 10, $hBrush1)
    Sleep(10)
    If GUIGetMsg() = $Button2 Then Return
  Until $i = 1000
EndFunc

;~ Func stop()
;~     $i = 1000
;~ EndFunc
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
InnI
Большое спасибо. :smile:


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

InnI

ещё маленькое уточнение, а если кнопок для остановки одного и того же цикла
будет несколько, как тогда записать в коде?

Код:
...
If GUIGetMsg() = $Button2 Then Return 
If GUIGetMsg() = $Button3 Then Return 
If GUIGetMsg() = $Button4 Then Return 
If GUIGetMsg() = $Button5 Then Return 
и т. д. ...


так не работает :(
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
urrya вы же не хотите вникать в то, что вам пишут ;)

urrya [?]
как правильно сделать
Вот ключевая фраза вашего поста!
Я вам уже ответил, как максимально просто в вашем случае реализовать то, что вы хотите.
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
Garrett
Спасибо Вам за пример, я знаю про ту функцию, но совершенно не могу ничего
сделать с ней, по Вашему предложению не работает совсем.
Так как при вызове нужного цикла код как раз и зацикливается до окончания того самого цикла, а мне надо его прервать.
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
InnI
ещё раз спс, это то что нужно :ok:
:smile:
 
Верх