Что нового

[Элементы GUI] OnEvent Mode и бесконечный цикл

Krokodile

Новичок
Сообщения
43
Репутация
1
Имеется вот такой код:
Код:
#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500,130)

GUISetFont(92,650)
dim $label[9]
dim $k=0
$label[1]=GUICtrlCreateLabel("",10,10,50,100)
$label[2]=GUICtrlCreateLabel("",70,10,50,100)
$label[3]=GUICtrlCreateLabel("",130,10,50,100)
$label[4]=GUICtrlCreateLabel("",190,10,50,100)
$label[5]=GUICtrlCreateLabel("",250,10,50,100)
$label[6]=GUICtrlCreateLabel("",310,10,50,100)
$label[7]=GUICtrlCreateLabel("",370,10,50,100)
$label[8]=GUICtrlCreateLabel("",430,10,50,100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9,550)
$button1=GUICtrlCreateButton("Пуск/Пауза",10,100,480,20)


GUICtrlSetOnEvent($button1,"Switch1")
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")


GUISetState ()
While 1
   sleep(100)
WEnd

Func Switch1()
   
   if $k==0 then
	  $k=1
	  Play()
   Else
	  $k=0
	  Pause()
   EndIf

EndFunc

Func Play()
   
   while 1
	  GUICtrlSetData($label[8],"")
	  GUICtrlSetData($label[1],"*")
	  sleep(300)
	  GUICtrlSetData($label[1],"")
	  GUICtrlSetData($label[2],"*")
	  sleep(300)
	  GUICtrlSetData($label[2],"")
	  GUICtrlSetData($label[3],"*")
	  sleep(300)
	  GUICtrlSetData($label[3],"")
	  GUICtrlSetData($label[4],"*")
	  sleep(300)
	  GUICtrlSetData($label[4],"")
	  GUICtrlSetData($label[5],"*")
	  sleep(300)
	  GUICtrlSetData($label[5],"")
	  GUICtrlSetData($label[6],"*")
	  sleep(300)
	  GUICtrlSetData($label[6],"")
	  GUICtrlSetData($label[7],"*")
	  sleep(300)
	  GUICtrlSetData($label[7],"")
	  GUICtrlSetData($label[8],"*")
	  sleep(300)
   WEnd
   
EndFunc

Func Pause()
   
   while 1
	  sleep(300)
   Wend
   
EndFunc

;*============================================================
Func SpecialEvents()
    

    Select
	    Case @GUI_CTRLID = $GUI_EVENT_CLOSE
			Exit
            
        Case @GUI_CTRLID = $GUI_EVENT_MINIMIZE
            MsgBox(0, "Window Minimized", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
            
        Case @GUI_CTRLID = $GUI_EVENT_RESTORE
            MsgBox(0, "Window Restored", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
            
    EndSelect
    
EndFunc

По нажатию на кнопку Play/Pause вызывается переключатель функций(от play к pause и наоборот). Особенность в том, что в функции Play используется бесконечный цикл. Как прерывать этот цикл в режиме MessageLoop не имею понятия, но вот что пишут в хелпе о режиме OnEvent:
Реакцией GUI на событие является временная остановка текущей обработки сценария (прерывание) и вызов заранее созданных функций сценария
я подумал "вот оно! этот режим может поставить на паузу все что угодно!" но не тут то было.. Видимо против бесконечного цикла не выстоит ничто(даже кнопка закрытия отказала).
Почему в функции Play не используется цикл для переключения 'звездочек'?
Потому что в изначальной(реальной) программе на его месте также стоят различные действия, не заключенные в цикл, а скрипт представленный здесь лишь упрощенный пример.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Krokodile
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500, 130)
; GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92, 650)
Dim $label[9]
Dim $k = 0
$label[1] = GUICtrlCreateLabel("", 10, 10, 50, 100)
$label[2] = GUICtrlCreateLabel("", 70, 10, 50, 100)
$label[3] = GUICtrlCreateLabel("", 130, 10, 50, 100)
$label[4] = GUICtrlCreateLabel("", 190, 10, 50, 100)
$label[5] = GUICtrlCreateLabel("", 250, 10, 50, 100)
$label[6] = GUICtrlCreateLabel("", 310, 10, 50, 100)
$label[7] = GUICtrlCreateLabel("", 370, 10, 50, 100)
$label[8] = GUICtrlCreateLabel("", 430, 10, 50, 100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9, 550)

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 100, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")

GUISetState()
While 1
	Sleep(100)
WEnd

Func Switch1()

	If $k == 0 Then
		$k = 1
		Play()
	Else
		$k = 0
		Pause()
	EndIf

EndFunc

Func Play()

	While 1
		GUICtrlSetData($label[8], "")
		GUICtrlSetData($label[1], "*")
		Sleep(300)
		GUICtrlSetData($label[1], "")
		GUICtrlSetData($label[2], "*")
		Sleep(300)
		GUICtrlSetData($label[2], "")
		GUICtrlSetData($label[3], "*")
		Sleep(300)
		GUICtrlSetData($label[3], "")
		GUICtrlSetData($label[4], "*")
		Sleep(300)
		GUICtrlSetData($label[4], "")
		GUICtrlSetData($label[5], "*")
		Sleep(300)
		GUICtrlSetData($label[5], "")
		GUICtrlSetData($label[6], "*")
		Sleep(300)
		GUICtrlSetData($label[6], "")
		GUICtrlSetData($label[7], "*")
		Sleep(300)
		GUICtrlSetData($label[7], "")
		GUICtrlSetData($label[8], "*")
		Sleep(300)
	WEnd

EndFunc

Func Pause()

	While 1
		Sleep(300)
	WEnd

EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $iID = BitAND($wParam, 0xFFFF)
	Switch $iID
		Case 0xF060
			Exit
		Case 0xF020
			GUISetState(@SW_MINIMIZE)
		Case 0xF030
			GUISetState(@SW_MAXIMIZE)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc


Кстати, есть более новая справка. Там же для WM_SYSCOMMAND можно увидеть другие события.
 
Автор
K

Krokodile

Новичок
Сообщения
43
Репутация
1
Кстати, есть более новая справка..
Спасибо.
Кстати забыл сказать самое главное - после возвращения из паузы "воспроизведение" должно начаться с того момент что и было до выхода. Если оно остановилось на третей звезде - начаться должно на четвертой.
 
Автор
K

Krokodile

Новичок
Сообщения
43
Репутация
1
Вот что я имею с учетом изменений, внесенных AZJIO:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500, 130)
; GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92, 650)
Dim $label[9]
Dim $k = 0
$label[1] = GUICtrlCreateLabel("", 10, 10, 50, 100)
$label[2] = GUICtrlCreateLabel("", 70, 10, 50, 100)
$label[3] = GUICtrlCreateLabel("", 130, 10, 50, 100)
$label[4] = GUICtrlCreateLabel("", 190, 10, 50, 100)
$label[5] = GUICtrlCreateLabel("", 250, 10, 50, 100)
$label[6] = GUICtrlCreateLabel("", 310, 10, 50, 100)
$label[7] = GUICtrlCreateLabel("", 370, 10, 50, 100)
$label[8] = GUICtrlCreateLabel("", 430, 10, 50, 100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9, 550)

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 100, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")

GUISetState()
While 1
    Sleep(100)
WEnd

Func Switch1()

    If $k == 0 Then
        $k = 1
        Play()
    Else
        $k = 0
        Pause()
    EndIf

EndFunc

Func Play()

    While 1
        GUICtrlSetData($label[8], "")
        GUICtrlSetData($label[1], "*")
        Sleep(300)
        GUICtrlSetData($label[1], "")
        GUICtrlSetData($label[2], "*")
        Sleep(300)
        GUICtrlSetData($label[2], "")
        GUICtrlSetData($label[3], "*")
        Sleep(300)
        GUICtrlSetData($label[3], "")
        GUICtrlSetData($label[4], "*")
        Sleep(300)
        GUICtrlSetData($label[4], "")
        GUICtrlSetData($label[5], "*")
        Sleep(300)
        GUICtrlSetData($label[5], "")
        GUICtrlSetData($label[6], "*")
        Sleep(300)
        GUICtrlSetData($label[6], "")
        GUICtrlSetData($label[7], "*")
        Sleep(300)
        GUICtrlSetData($label[7], "")
        GUICtrlSetData($label[8], "*")
        Sleep(300)
    WEnd

EndFunc

Func Pause()

    While 1
        Sleep(300)
    WEnd

EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
По прежнему остается 2 проблемы:
1. Во время выполнения функции play(бесконечный цикл), программа не реагирует на нажатие кнопки Play/Pause. По нажатии на это кнопку, должна выполняться функция pause.
2. После выполнение функции pause(бесконечный цикл с ожиданием нажатия кнопки), программа должна вернуться в то место в цикле play, на котором она остановилась.

AZJIO прикрутил работу системных кнопок(закрыть/свернуть и т.д.), теперь они выполняются даже во время цикла play. На мой взгляд это показатель того, что цикл этот имеет не главный приоритет.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $onAir = False, $playpoint = 0

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500, 130)
; GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92, 650)
Dim $n = 9
Dim $label[$n]
$label[1] = GUICtrlCreateLabel("", 10, 10, 50, 100)
$label[2] = GUICtrlCreateLabel("", 70, 10, 50, 100)
$label[3] = GUICtrlCreateLabel("", 130, 10, 50, 100)
$label[4] = GUICtrlCreateLabel("", 190, 10, 50, 100)
$label[5] = GUICtrlCreateLabel("", 250, 10, 50, 100)
$label[6] = GUICtrlCreateLabel("", 310, 10, 50, 100)
$label[7] = GUICtrlCreateLabel("", 370, 10, 50, 100)
$label[8] = GUICtrlCreateLabel("", 430, 10, 50, 100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9, 550)

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 100, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")

GUISetState()

While 1
	$GUIMsg = GUIGetMsg()
	Switch $GUIMsg
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
	If $onAir Then Play()
WEnd


Func Switch1()

	$onAir = Not $onAir

EndFunc

Func Play()

	$playpoint += 1
	If $playpoint > 8 Then $playpoint = 1
	If $playpoint = 8 Then
		GUICtrlSetData($label[8], "")
        GUICtrlSetData($label[1], "*")
	Else
		GUICtrlSetData($label[$playpoint], "")
        GUICtrlSetData($label[$playpoint+1], "*")
	EndIf

	Sleep(300)

EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc


Только с руским шрифтом что-то не то. :-[
 
Автор
K

Krokodile

Новичок
Сообщения
43
Репутация
1
C2H5OH спасибо! подсказал отличный способ управления функциями. Я его немного приукрасил(усложнил). Вообщем в примере C2H5OH программа работает с одной функцией(play) но если эта функция включает в себя еще действия(5 штук), то пауза поставится только после выполнения всех 5 действий(а они могут и по 10-15 минут идти), соответсвенно после возобновления "проигрывания" заново начнется вся ФУНКЦИЯ(начиная с первого действия)
Немного усложнив программу добился более гибкого управления, которое и было моей целью!!!(см. спойлер) Теперь паузу можно ставить в момент выполнения действия, ну и возобновление конечно распространяется не только на функцию, но и на действия внутри нее..
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $k=False, $pl, $i=0
Dim $label1[9], $label2[9], $label3[9], $label4[9], $label5[9]

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("",500,440)
; GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92, 650)
$label1[1] = GUICtrlCreateLabel("", 10, 10, 50, 70)
$label1[2] = GUICtrlCreateLabel("", 70, 10, 50, 70)
$label1[3] = GUICtrlCreateLabel("", 130, 10, 50, 70)
$label1[4] = GUICtrlCreateLabel("", 190, 10, 50, 70)
$label1[5] = GUICtrlCreateLabel("", 250, 10, 50, 70)
$label1[6] = GUICtrlCreateLabel("", 310, 10, 50, 70)
$label1[7] = GUICtrlCreateLabel("", 370, 10, 50, 70)
$label1[8] = GUICtrlCreateLabel("", 430, 10, 50, 70)
;===================================================
$label2[1] = GUICtrlCreateLabel("", 10, 90, 50, 70)
$label2[2] = GUICtrlCreateLabel("", 70, 90, 50, 70)
$label2[3] = GUICtrlCreateLabel("", 130, 90, 50, 70)
$label2[4] = GUICtrlCreateLabel("", 190, 90, 50, 70)
$label2[5] = GUICtrlCreateLabel("", 250, 90, 50, 70)
$label2[6] = GUICtrlCreateLabel("", 310, 90, 50, 70)
$label2[7] = GUICtrlCreateLabel("", 370, 90, 50, 70)
$label2[8] = GUICtrlCreateLabel("", 430, 90, 50, 70)
;===================================================
$label3[1] = GUICtrlCreateLabel("", 10, 170, 50, 70)
$label3[2] = GUICtrlCreateLabel("", 70, 170, 50, 70)
$label3[3] = GUICtrlCreateLabel("", 130, 170, 50, 70)
$label3[4] = GUICtrlCreateLabel("", 190, 170, 50, 70)
$label3[5] = GUICtrlCreateLabel("", 250, 170, 50, 70)
$label3[6] = GUICtrlCreateLabel("", 310, 170, 50, 70)
$label3[7] = GUICtrlCreateLabel("", 370, 170, 50, 70)
$label3[8] = GUICtrlCreateLabel("", 430, 170, 50, 70)
;===================================================
$label4[1] = GUICtrlCreateLabel("", 10, 250, 50, 70)
$label4[2] = GUICtrlCreateLabel("", 70, 250, 50, 70)
$label4[3] = GUICtrlCreateLabel("", 130, 250, 50, 70)
$label4[4] = GUICtrlCreateLabel("", 190, 250, 50, 70)
$label4[5] = GUICtrlCreateLabel("", 250, 250, 50, 70)
$label4[6] = GUICtrlCreateLabel("", 310, 250, 50, 70)
$label4[7] = GUICtrlCreateLabel("", 370, 250, 50, 70)
$label4[8] = GUICtrlCreateLabel("", 430, 250, 50, 70)
;===================================================
$label5[1] = GUICtrlCreateLabel("", 10, 330, 50, 70)
$label5[2] = GUICtrlCreateLabel("", 70, 330, 50, 70)
$label5[3] = GUICtrlCreateLabel("", 130, 330, 50, 70)
$label5[4] = GUICtrlCreateLabel("", 190, 330, 50, 70)
$label5[5] = GUICtrlCreateLabel("", 250, 330, 50, 70)
$label5[6] = GUICtrlCreateLabel("", 310, 330, 50, 70)
$label5[7] = GUICtrlCreateLabel("", 370, 330, 50, 70)
$label5[8] = GUICtrlCreateLabel("", 430, 330, 50, 70)
;===================================================

GUISetFont(9, 550)

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 410, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")

GUISetState()
While 1
    If $k Then Play()
WEnd


Func Switch1()
    $k = Not $k
EndFunc
 
Func Play()
   $i+=1
   If $i > 5 Then $i = 1
   Switch $i
	  Case 1
		 Play1()
	  Case 2
		 Play2()
	  Case 3
		 Play3()
	  Case 4
		 Play4()
	  Case 5
		 Play5()
   EndSwitch
   
   
EndFunc

 Func Play1()
    $pl += 1
    If $pl > 8 Then $pl = 1
    If $pl = 1 Then
        GUICtrlSetData($label1[8], "")
        GUICtrlSetData($label1[1], "*")
    Else
        GUICtrlSetData($label1[$pl-1], "")
        GUICtrlSetData($label1[$pl], "*")
    EndIf
    Sleep(300)
 EndFunc
 Func Play2()
    If $pl = 1 Then
        GUICtrlSetData($label2[8], "")
        GUICtrlSetData($label2[1], "*")
    Else
        GUICtrlSetData($label2[$pl-1], "")
        GUICtrlSetData($label2[$pl], "*")
    EndIf
    Sleep(300)
 EndFunc
 Func Play3()
    If $pl = 1 Then
        GUICtrlSetData($label3[8], "")
        GUICtrlSetData($label3[1], "*")
    Else
        GUICtrlSetData($label3[$pl-1], "")
        GUICtrlSetData($label3[$pl], "*")
    EndIf
    Sleep(300)
 EndFunc
 Func Play4()
    If $pl = 1 Then
        GUICtrlSetData($label4[8], "")
        GUICtrlSetData($label4[1], "*")
    Else
        GUICtrlSetData($label4[$pl-1], "")
        GUICtrlSetData($label4[$pl], "*")
    EndIf
    Sleep(300)
 EndFunc
 Func Play5()
    If $pl = 1 Then
        GUICtrlSetData($label5[8], "")
        GUICtrlSetData($label5[1], "*")
    Else
        GUICtrlSetData($label5[$pl-1], "")
        GUICtrlSetData($label5[$pl], "*")
    EndIf
    Sleep(300)
EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 

Robocop

Знающий
Сообщения
1
Репутация
5
Добрый день. Как раз разбираюсь с OnEvent Mode и возможностью бесконечного цикла.
Ваш топик мне помог продвинутся, но есть явная неувязка с концепцией OnEvent.
Дело в том, что OnEvent может воспринимать только один цикл со Sleep - в главном рабочем цикле While 1 (это Я нашёл на форуме и протестировал самостоятельно). Поэтому Я взял на себя смелость подправить скрипт чтобы он был ближе с концепцией заложенной создателями AutoIt. Подробности в комментариях в скрипте :smile:
И непонятную функцию, которую притянули в начале обсуждения
Код:
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
- можно выбросить.
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $k=False, $pl, $i=0
Dim $label1[9], $label2[9], $label3[9], $label4[9], $label5[9]

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("",500,440)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
;GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92) ; размер шрифта для звёздочек
$label1[1] = GUICtrlCreateLabel("", 10, 10, 50, 70)
$label1[2] = GUICtrlCreateLabel("", 70, 10, 50, 70)
$label1[3] = GUICtrlCreateLabel("", 130, 10, 50, 70)
$label1[4] = GUICtrlCreateLabel("", 190, 10, 50, 70)
$label1[5] = GUICtrlCreateLabel("", 250, 10, 50, 70)
$label1[6] = GUICtrlCreateLabel("", 310, 10, 50, 70)
$label1[7] = GUICtrlCreateLabel("", 370, 10, 50, 70)
$label1[8] = GUICtrlCreateLabel("", 430, 10, 50, 70)
;===================================================
$label2[1] = GUICtrlCreateLabel("", 10, 90, 50, 70)
$label2[2] = GUICtrlCreateLabel("", 70, 90, 50, 70)
$label2[3] = GUICtrlCreateLabel("", 130, 90, 50, 70)
$label2[4] = GUICtrlCreateLabel("", 190, 90, 50, 70)
$label2[5] = GUICtrlCreateLabel("", 250, 90, 50, 70)
$label2[6] = GUICtrlCreateLabel("", 310, 90, 50, 70)
$label2[7] = GUICtrlCreateLabel("", 370, 90, 50, 70)
$label2[8] = GUICtrlCreateLabel("", 430, 90, 50, 70)
;===================================================
$label3[1] = GUICtrlCreateLabel("", 10, 170, 50, 70)
$label3[2] = GUICtrlCreateLabel("", 70, 170, 50, 70)
$label3[3] = GUICtrlCreateLabel("", 130, 170, 50, 70)
$label3[4] = GUICtrlCreateLabel("", 190, 170, 50, 70)
$label3[5] = GUICtrlCreateLabel("", 250, 170, 50, 70)
$label3[6] = GUICtrlCreateLabel("", 310, 170, 50, 70)
$label3[7] = GUICtrlCreateLabel("", 370, 170, 50, 70)
$label3[8] = GUICtrlCreateLabel("", 430, 170, 50, 70)
;===================================================
$label4[1] = GUICtrlCreateLabel("", 10, 250, 50, 70)
$label4[2] = GUICtrlCreateLabel("", 70, 250, 50, 70)
$label4[3] = GUICtrlCreateLabel("", 130, 250, 50, 70)
$label4[4] = GUICtrlCreateLabel("", 190, 250, 50, 70)
$label4[5] = GUICtrlCreateLabel("", 250, 250, 50, 70)
$label4[6] = GUICtrlCreateLabel("", 310, 250, 50, 70)
$label4[7] = GUICtrlCreateLabel("", 370, 250, 50, 70)
$label4[8] = GUICtrlCreateLabel("", 430, 250, 50, 70)
;===================================================
$label5[1] = GUICtrlCreateLabel("", 10, 330, 50, 70)
$label5[2] = GUICtrlCreateLabel("", 70, 330, 50, 70)
$label5[3] = GUICtrlCreateLabel("", 130, 330, 50, 70)
$label5[4] = GUICtrlCreateLabel("", 190, 330, 50, 70)
$label5[5] = GUICtrlCreateLabel("", 250, 330, 50, 70)
$label5[6] = GUICtrlCreateLabel("", 310, 330, 50, 70)
$label5[7] = GUICtrlCreateLabel("", 370, 330, 50, 70)
$label5[8] = GUICtrlCreateLabel("", 430, 330, 50, 70)
;===================================================

GUISetFont(9) ; размер шрифта для кнопки

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 410, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")
GUISetState(@SW_SHOW) ;показывем форму на экране

While 1                   ; Главный рабочий цикл
    If $k Then Play()
	Sleep(300) ; OnEvent может воспринимать только один цикл со Sleep - вот это и есть этот цикл
	           ; В этом Sleep программа и слушает все кнопки и слышит их.
			   ; Поставив Sleep сюда можно выкинуть GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
WEnd


Func Switch1()
    $k = Not $k
EndFunc

Func Play()
   $i+=1
   If $i > 5 Then $i = 1
   Switch $i
      Case 1
         Play1()
      Case 2
         Play2()
      Case 3
         Play3()
      Case 4
         Play4()
      Case 5
         Play5()
   EndSwitch


EndFunc

 Func Play1()
    $pl += 1
    If $pl > 8 Then $pl = 1
    If $pl = 1 Then
        GUICtrlSetData($label1[8], "")
        GUICtrlSetData($label1[1], "*")
    Else
        GUICtrlSetData($label1[$pl-1], "")
        GUICtrlSetData($label1[$pl], "*")
    EndIf
    ;Sleep(300)         ;<- Это Sleep внутри вызванного цикла и он блокирует обработку $GUI_EVENT_CLOSE да и любых других кнопок то же
	                     ; если они будут в форме
 EndFunc
 Func Play2()
    If $pl = 1 Then
        GUICtrlSetData($label2[8], "")
        GUICtrlSetData($label2[1], "*")
    Else
        GUICtrlSetData($label2[$pl-1], "")
        GUICtrlSetData($label2[$pl], "*")
    EndIf
    ;Sleep(300)
 EndFunc
 Func Play3()
    If $pl = 1 Then
        GUICtrlSetData($label3[8], "")
        GUICtrlSetData($label3[1], "*")
    Else
        GUICtrlSetData($label3[$pl-1], "")
        GUICtrlSetData($label3[$pl], "*")
    EndIf
    ;Sleep(300)
 EndFunc
 Func Play4()
    If $pl = 1 Then
        GUICtrlSetData($label4[8], "")
        GUICtrlSetData($label4[1], "*")
    Else
        GUICtrlSetData($label4[$pl-1], "")
        GUICtrlSetData($label4[$pl], "*")
    EndIf
    ;Sleep(300)
 EndFunc
 Func Play5()
    If $pl = 1 Then
        GUICtrlSetData($label5[8], "")
        GUICtrlSetData($label5[1], "*")
    Else
        GUICtrlSetData($label5[$pl-1], "")
        GUICtrlSetData($label5[$pl], "*")
    EndIf
    ;Sleep(300)
EndFunc

Func SpecialEvents() ; выход по нажатию крестика
	Exit
EndFunc
;*============================================================
#cs
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
#ce
 
Верх