Что нового

Закрытие GUI

pad0nak66

Новичок
Сообщения
23
Репутация
2
В общем есть некое приложение, которое в цикле выполняет некие манипуляции, бывает такие моменты, когда необходимо закрыть приложение, но клик по кнопке закрытия окна не помогает, пока не завершится цикл. Помогите пожалуйста с решением этой задачи. Хоткеи - не вариант. Устраивает только стандартная кнопка или кнопка на форме.

Код:
#include <GUIConstants.au3>

GUICreate('GUI', 300, 100)
GUISetState(@SW_SHOW)

ConsoleWrite('--> цикл, который пока не завершится, не даст закрыть окно' & @LF)
For $n=0 To 9
  ; тут может быть большой кусок кода и проверку на $GUI_EVENT_CLOSE на каждом этапе вставлять не особо удобно
  Sleep(1000)
Next
ConsoleWrite('--> а вот теперь окно спокойно можно закрывать' & @LF)

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
  EndSwitch
WEnd
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
В данном случае тебе команды GUI надо обрабатывать уже не в цикле, а например через GUICtrlSetOnEvent
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Попробуйте через $wm_syscommand
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
GUICreate('GUI', 300, 100)
GUISetState(@SW_SHOW)

ConsoleWrite('--> цикл, который пока не завершится, не даст закрыть окно' & @LF)
GUIRegisterMsg($wm_syscommand,"__CloseNative");Важно зарегистрировать функцию раньше чем запустится цикл
For $n=0 To 20; Увеличил время просто так(или с умыслом ;) )
  ; тут может быть большой кусок кода и проверку на $GUI_EVENT_CLOSE на каждом этапе вставлять не особо удобно
  Sleep(1000)
Next
ConsoleWrite('--> а вот теперь окно спокойно можно закрывать' & @LF)
While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
  EndSwitch
WEnd
Func __CloseNative($hWin,$msg,$wparam,$lparam)
	Local $id=BitAND($wParam,0xFFFF)
	If $id=0xF060 Then;код кнопки закрыть
		Exit
	EndIf
EndFunc
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
Спасибо:
Belfigor за подсказку
DarWiM за то, что ткнул носом
MnM за идею и ценный пример

Вот, что у меня получилось...

Код:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1) ; <--

GUICreate('GUI', 300, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate") ; <--
GUISetState(@SW_SHOW)

ConsoleWrite('--> цикл, который пока не завершится, не даст закрыть окно' & @LF)
For $n=0 To 9
  ; тут может быть большой кусок кода
  Sleep(1000)
Next
ConsoleWrite('--> а вот теперь окно спокойно можно закрывать' & @LF)

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
  EndSwitch
WEnd

Func Terminate()
  Exit
EndFunc
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Исправьте если ошибаюсь, но следующее насколько я знаю "отключает" GUIGetMsg()
Код:
Opt("GUIOnEventMode", 1)

Т.е. использовать их вместе нельзя...
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
DarWiM сказал(а):
использовать их вместе нельзя
Как это нельзя, можно например используя 2+ окон.
И строить их в том же цикле можно(потому что критичности не составляет - просто она не будет работать пока не установить Opt("GUIOnEventMode", 0))
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
MnM
Эта я знаю. Наверное не правильно выразился
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
А я бы наверное отказался от циклов в таком случае...

Код:
#include <GUIConstantsEx.au3>

GUICreate('GUI', 300, 100)
GUISetState()

	$i = 0
	AdlibRegister("_FNC", 1000)

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
	EndSelect
WEnd

Func _FNC()
	If ($i < 10) Then
		$i = $i+1
		ConsoleWrite($i)
	EndIf
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Если в программе интерфейс не является основной частью программы (то есть обработка чего-либо происходит не после нажатия какой-нибудь клавиши и GUI блокируется до окончания обработки, а есть циклы работающие даже в тот момент когда с GUI необходимо взаимодействовать в других его разделах), обработку GUI надо выносить за пределы циклов и AdlibRegister - во многих случаях, при работе достаточно сложной программы - очень сомнительное решение, но как костыль вплоне себе сойдет.
 
Верх