Что нового

[Элементы GUI] Несанкционированное сворачивание окон после использования MsgBox и не только

Pat4005

Новичок
Сообщения
85
Репутация
4
Здравствуйте. У меня появилась заминка со скриптом такого содержания
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

HotKeySet('{ESC}', '_Exit')

	$1 = GUICreate("Устанавливает метку выбора", 400, 300, -1, -1, $WS_CAPTION, $WS_EX_TOOLWINDOW)
	$hButton = GUICtrlCreateButton("", 130, 100, 150, 80)
	GUISetState()

	; Цикл выполняется, пока окно не будет закрыто
	While 1
	$nMsg = GUIGetMsg()
			Switch $nMsg
			Case $hButton
				_find($1)
			Case $GUI_EVENT_CLOSE
				Exit
			EndSwitch
	WEnd
	GUIDelete()

Func _Find($hParentGUI = 0)
	GUISetState(@SW_DISABLE, $hParentGUI)
	$hGUIFind = GUICreate('Поиск записи', 253, 147)
	$hSearchButton = GUICtrlCreateButton("Искать", 48, 112, 75, 25)
	$hCancelSearchButton = GUICtrlCreateButton("Отмена", 148, 109, 75, 25)
	GUISetState()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $hCancelSearchButton
			;$iAnswer = MsgBox(36, 'Выйти в главное окно?', 'Вы действительно хотите этого?')
			;If $iAnswer = 6 Then
			ExitLoop
			;EndIf
		Case $hSearchButton
			MsgBox(0,'','тра-та-та')
	EndSwitch
Wend
GUISetState(@SW_ENABLE, $hParentGUI)
GUISetState(@SW_SHOW, $hParentGUI)
GUIDelete($hGUIFind)
EndFunc;==>_Find

Func _Exit()
	Exit
EndFunc ;==>_Exit

Вся проблема в том, что при использовании внутри цикла функции _Find() окна сообщений
хоть единожды и после выхода из цикла главное окно само по себе сворачивается, игнорируя "SW_SHOW.
Опытным путем я выяснил, что происходящее верно только при использовании стилей для главного окна $WS_CAPTION, $WS_EX_TOOLWINDOW.
Проблема нивелируется при неиспользовании данных стилей, а также в случае, если msgbox ни разу не вызван в ф-ции -Find. Подскажите, пожалуйста, нормально ли это или как можно обойти, всё-таки используя стили и окна сообщений?
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Буду краток:

Код:
Func _Find($hParentGUI = 0)
...
GUIDelete($hGUIFind)
WinActivate($hParentGUI)
EndFunc;==>_Find
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Вам надо разобраться в построении дочерних окон, посмотреть как другие делают. Ссылка1, Ссылка2

так что-ли?
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

HotKeySet('{ESC}', '_Exit')

$1 = GUICreate("Устанавливает метку выбора", 400, 300, -1, -1, $WS_CAPTION, $WS_EX_TOOLWINDOW)
$hButton = GUICtrlCreateButton("", 130, 100, 150, 80)
GUISetState()

; Цикл выполняется, пока окно не будет закрыто
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $hButton
			_Find($1)
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
GUIDelete()

Func _Find($hParentGUI = 0)
	GUISetState(@SW_DISABLE, $hParentGUI)
	$hGUIFind = GUICreate('Поиск записи', 253, 147, -1, -1, $WS_CAPTION + $WS_SYSMENU + $WS_POPUP + $WS_MINIMIZEBOX, -1, $hParentGUI)
	$hSearchButton = GUICtrlCreateButton("Искать", 48, 112, 75, 25)
	$hCancelSearchButton = GUICtrlCreateButton("Отмена", 148, 109, 75, 25)
	GUISetState()
	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE, $hCancelSearchButton
				;$iAnswer = MsgBox(36, 'Выйти в главное окно?', 'Вы действительно хотите этого?')
				;If $iAnswer = 6 Then
				ExitLoop
				;EndIf
			Case $hSearchButton
				MsgBox(0, '', 'тра-та-та', 0, $hGUIFind)
		EndSwitch
	WEnd
	GUISetState(@SW_ENABLE, $hParentGUI)
	GUIDelete($hGUIFind)
EndFunc   ;==>_Find

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
AZJIO, и всё-таки я проверил еще несколько раз и даже при правильном иерархическом построении окон неожиданное сворачивание происходит(опять же только при условии, что был сработан MsgBox), но только при использовании стиля $WS_CAPTION. :blink:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Pat4005 [?]
всё-таки я проверил еще несколько раз и даже при правильном иерархическом построении окон неожиданное сворачивание происходит
Нужно указывать hWnd родительского окна.

Код:
...

    $hGUIFind = GUICreate('Поиск записи', 253, 147, -1, -1, -1, -1, $hParentGUI)

...

				MsgBox(0, '', 'тра-та-та', 0, $hGUIFind)

...
 
Верх