Что нового

Как временно заблокировать GUI?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Я использовал GUICtrlSetState($Edit1, $GUI_DISABLE)
с последующим GUICtrlSetState($Edit1, $GUI_ENABLE)

Но каким образом заблокировать-разблокировать весь GUI, у которого много окон и кнопок?


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

Т.е. необходимо пока функция работает, чтобы GUI отображался серым цветом
и юзер не мог ничего нажать в GUI.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Попробуй вот такой вариант...

Код:
; НАЧАЛО

 $GUI=GUICreate("",300,300)
 $INPUT=GUICtrlCreateInput("",0,0,300,250)
 $BUTTON=GUICtrlCreateButton("Ok",0,250,300,50)

 GUISetState()

 while true

  switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    GUISetState(@SW_DISABLE,$GUI)
    Sleep(3000)
    GUISetState(@SW_ENABLE,$GUI)
  endswitch

 wend

; КОНЕЦ
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо!


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

Только при этом форма не становится серой :(

Т.е. пользователю непонятно, что сейчас идет процесс и программу трогать нельзя


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

Как сделать, чтобы временно над главным GUI форма курсор мышки был в виде песочных часов?
А потом обратно.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Можно вот так:

Код:
; НАЧАЛО

 $GUI=GUICreate("",300,300)
 $INPUT=GUICtrlCreateInput("",0,0,300,250)
 $BUTTON=GUICtrlCreateButton("Ok",0,250,300,50)

 GUISetState()

 while true

  switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    GUISetState(@SW_DISABLE,$GUI)
    GUISetCursor(15,1,$GUI)
    Sleep(3000)
    GUISetCursor(2,1,$GUI)
    GUISetState(@SW_ENABLE,$GUI)
  endswitch

 wend

; КОНЕЦ
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Что-то у меня песочные часы пропадают до того, как процесс завершился. Наверное GUI не успевает сделать рефреш и отобразить все изменения.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
А что, если переставить функции местами?

Код:
GUISetState(@SW_ENABLE,$GUI)
GUISetCursor(2,1,$GUI)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Да нет, то же самое.

Просто функция вставляет большой кусок текста в Edit. По завершении функции песочные часы исчезают, но сам текст появляется через несколько секунд (когда GUI сделает сам себе рефреш)

А как принудительно сделать refresh всего GUI?


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

Сделал следующим образом:

Код:
Case $Button1
		
	GUISetCursor(15,1, $Form1)
	Compare()
	sleep (100)
	GUISetCursor(2, 1, $Form1)



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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновление всего GUI можно сделать с помощью _WinAPI_UpdateWindow(), но тебе это точно не нужно, все должно работать и так. Выложи полностью скрипт, а там посмотрим.


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

Кстати, вот мой способ блокировки GUI.

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIMenu.au3>
#Include <WinAPIEx.au3>

$hForm = GUICreate('MyGUI', 310, 360)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg', $hForm)
GUICtrlCreateGroup('Group', 10, 10, 140, 95)
GUICtrlCreateCheckbox('Check1', 22, 26, 120, 23)
GUICtrlCreateCheckbox('Check2', 22, 49, 120, 23)
GUICtrlCreateCheckbox('Check3', 22, 72, 120, 23)
GUICtrlCreateGroup('Group', 160, 10, 140, 95)
GUICtrlCreateRadio('Radio1', 172, 26, 120, 23)
GUICtrlCreateRadio('Radio2', 172, 49, 120, 23)
GUICtrlCreateRadio('Radio3', 172, 72, 120, 23)
$Button = GUICtrlCreateButton('Test', 120, 330, 70, 23)
GUICtrlCreateTab(10, 118, 292, 206)
GUICtrlCreateTabItem('Tab1')
GUICtrlCreateTabItem('Tab2')
GUICtrlCreateTabItem('')
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Button
			_GUILock($hForm, 1)
			Sleep(5000)
			_GUILock($hForm, 0)
	EndSwitch
WEnd

Func _GUILock($hWnd, $fLock)

	Local $Data, $State

	If $fLock Then
		GUISetCursor(15, 1, $hWnd)
		$State = $GUI_DISABLE
	Else
		GUISetCursor(2, 1, $hWnd)
		$State = $GUI_ENABLE
	EndIf
	_GUICtrlMenu_EnableMenuItem(_GUICtrlMenu_GetSystemMenu($hWnd), $SC_CLOSE, $fLock, 0)
	$Data = _WinAPI_EnumChildWindows($hWnd)
	If IsArray($Data) Then
		For $i = 1 To $Data[0][0]
			GUICtrlSetState(_WinAPI_GetDlgCtrlID($Data[$i][0]), $State)
		Next
	EndIf
EndFunc   ;==>_GUILock
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
вот мой способ блокировки GUI
Я тоже пользуюсь подобным способом, но вот в таком духе:

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIMenu.au3>
#Include <WinAPI.au3>

....

$nDummyCtrl = GUICtrlCreateLabel("", -1000, -1000)

GUISetState()

....

Func _GUILock($hWnd, $fLock)
    Local $State
	
    If $fLock Then
        GUISetCursor(15, 1, $hWnd)
        $State = $GUI_DISABLE
    Else
        GUISetCursor(2, 1, $hWnd)
        $State = $GUI_ENABLE
    EndIf
	
    _GUICtrlMenu_EnableMenuItem(_GUICtrlMenu_GetSystemMenu($hWnd), $SC_CLOSE, $fLock, 0)
	
	For $i = 3 To _WinAPI_GetDlgCtrlID(GUICtrlGetHandle(-1))
		GUICtrlSetState($i, $State)
	Next
EndFunc


Т.е используется последний элемент для определения количества элементов
Кстати, твой пример можно изменить так, чтобы блокировались и элементы созданные с помощью _GUICtrl*...

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIMenu.au3>
#Include <GUIListBox.au3>
#Include <WinAPIEx.au3>

$hForm = GUICreate('MyGUI', 310, 360)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg', $hForm)

_GUICtrlListBox_Create($hForm, "List", 20, 150, 270, 170)

GUICtrlCreateGroup('Group', 10, 10, 140, 95)
GUICtrlCreateCheckbox('Check1', 22, 26, 120, 23)
GUICtrlCreateCheckbox('Check2', 22, 49, 120, 23)
GUICtrlCreateCheckbox('Check3', 22, 72, 120, 23)

GUICtrlCreateGroup('Group', 160, 10, 140, 95)
GUICtrlCreateRadio('Radio1', 172, 26, 120, 23)
GUICtrlCreateRadio('Radio2', 172, 49, 120, 23)
GUICtrlCreateRadio('Radio3', 172, 72, 120, 23)
$Button = GUICtrlCreateButton('Lock', 120, 330, 70, 23)

GUICtrlCreateTab(10, 118, 292, 206)
GUICtrlCreateTabItem('Tab1')
GUICtrlCreateTabItem('Tab2')
GUICtrlCreateTabItem('')

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button
            _GUILock($hForm, 1)
            Sleep(5000)
            _GUILock($hForm, 0)
    EndSwitch
WEnd

Func _GUILock($hWnd, $fLock)
    Local $Data, $State
	
    If $fLock Then
        GUISetCursor(15, 1, $hWnd)
        $State = "Disable"
    Else
        GUISetCursor(2, 1, $hWnd)
        $State = "Enable"
    EndIf
	
    _GUICtrlMenu_EnableMenuItem(_GUICtrlMenu_GetSystemMenu($hWnd), $SC_CLOSE, $fLock, 0)
   
   $Data = _WinAPI_EnumChildWindows($hWnd)
	
    If IsArray($Data) Then
        For $i = 1 To $Data[0][0]
			Execute('Control' & $State & '($Data[$i][0], "", "")')
        Next
    EndIf
EndFunc
 
Верх