Что нового

Как закрыть дочернее окно ?

Dream-52

...
Сообщения
82
Репутация
1
Доброго времени суток.Сразу скажу,что ...смотрел форум,но так и ответ не нашел.Проблема вот в чем.Не могу закрыть дочернее окно - закрывается и дочернее и основное.Врать не стану,иногда работало как нужно (еденично) - и то странно...(

Особенность в том,что этот кусок кода в обычном цыкле while , где и обычное окно ....
(это я сделал для того,чтобы когда открыто дочернее - то чтобы основное окошко функционировало ...)

Код:
...

       If WinExists('ДОЧЕРНЕЕ ОКНО') = 1 Then
         If WinActive ('ДОЧЕРНЕЕ ОКНО') then


				$hBMP = _ScreenCapture_Capture('', '', '',1000,1000)
				$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
				$hGraphic = _GDIPlus_GraphicsCreateFromHWND($okno)
				_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
				_GDIPlus_GraphicsDispose($hGraphic)
				_GDIPlus_ImageDispose($hBitmap)
				_WinAPI_DeleteObject($hBMP)

				If GUIGetMsg($okno) = $GUI_EVENT_CLOSE Then       ; знаю,что тут не правильно - но ...не знаю как же грамотно ?
					GUIDelete($okno)                              ; Удаляет не только дочернее но и основное окно.
					EndIf
					MsgBox(16,'','закрыто?')
					_GDIPlus_Shutdown()
				EndIf

                Sleep(5)

				EndIf
			EndIf

...
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Нужен весь скрипт, а именно создание дочернего и основного окна.
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
kzru_hunter сказал(а):
Нужен весь скрипт, а именно создание дочернего и основного окна.

Вот тут создание основного и дочерного окна ... Просто проблема в том,что мне нужно чтобы было возможно закрывать второе (дочерное окно) при "обновляющимся" основном окне....

Код:
$GUI = GUICreate("Server", 969, 638, 108, 292, Default,$WS_EX_COMPOSITED)

While 1
	$Msg = GUIGetMsg($GUI)
     Switch $Msg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button
			$okno = GUICreate('server00', '800', '600')
			GUISetState(@SW_SHOW, $okno)                      
			_GDIPlus_Startup()

	EndSwitch
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Dream-52
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$j = 0
$hParent = GUICreate('Parent', 400, 400, -1, -1, -1, $WS_EX_COMPOSITED)
$nButton1 = GUICtrlCreateButton('Button1', 150, 100, 100, 50)
$nLabel1 = GUICtrlCreateLabel('', 20, 20, 200, 20)

$hChild = GUICreate('Child', 200, 200, 50, 50)
$nButton2 = GUICtrlCreateButton('Button2', 50, 50, 100, 50)
$nLabel2 = GUICtrlCreateLabel('', 10, 20, 180, 20)

_WinAPI_SetParent($hChild, $hParent)
GUISetState(@SW_SHOW, $hParent)

While 1
	$aMsg = GUIGetMsg(1)
	Switch $aMsg[1]
		Case $hParent
			Switch $aMsg[0]
				Case $GUI_EVENT_CLOSE
					Exit
				Case $nButton1
					GUISetState(@SW_SHOW, $hChild)
			EndSwitch
		Case $hChild
			Switch $aMsg[0]
				Case $GUI_EVENT_CLOSE
					;GUIDelete($hChild)
					GUISetState(@SW_HIDE, $hChild)
				Case $nButton2
					$j += 1
					GUICtrlSetData($nLabel1, $j & ' Нажата кнопка на дочернем окне.')
					GUICtrlSetData($nLabel2, $j & ' Нажата кнопка.')
			EndSwitch
	EndSwitch
WEnd
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
madmasles

Спасибо большое,я уже додумался и сам...(по поводу sw_hide)

Но , если Вас не затруднит,скажите что именно делает
Код:
_WinAPI_SetParent($hChild, $hParent)
? и при @sw_hide - оно не ...нагружает скрипт? ведь мы его не удалили...а скрыли... :whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Dream-52
_WinAPI_SetParent($hChild, $hParent) устанавливает для дочернего окна $hChild родительское окно $hParent. Вы потаскайте, например, $hParent по рабочему столу при открытом $hChild...
Закомментируйте эту функцию и увидите разницу.
ведь мы его не удалили...а скрыли...
Я не знаю, будете Вы использовать дочернее окно дальше, потому и написал два варианта. Но если Вы будете его открывать не один раз, то, ИМХО, лучше его скрыть-показать, чем удалять и опять создавать.
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Если я правильно понял, то я делал так:
Код:
Case $GUI_EVENT_CLOSE
            close()


Код:
func close()
	Select
		Case WinGetState('Заголовок дочернего окна','')>=(1+2+4+8)
			GUISetState(@SW_HIDE,$hEmbed_GUI2)
		Case WinGetState('Главное окно','')>=(1+2+4+8)
			Exit
	EndSelect
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
r35p3ct [?]
А если на дочернем окне есть, например, кнопка, то как тогда определить, что на нее нажали?
А при использовании GUIGetMsg(1) это отслеживается без проблем. Я немного поменял код в своем примере.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
А еще можно использовать GUI OnEvent метод.
Для подобных задач с ним чуть проще.

Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('GUIOnEventMode', 		1)
Opt('MustDeclareVars', 		1)

Global $j, $hParentWin, $hChildWin, $nLabel1, $nLabel2

; Parent win
$hParentWin = GUICreate('Parent', 400, 400, -1, -1, -1, $WS_EX_COMPOSITED)
	GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')

GUICtrlCreateButton('Button1', 150, 100, 100, 50)
	GUICtrlSetOnEvent(-1, '_ChildWin_Open')

$nLabel1 = GUICtrlCreateLabel('', 20, 20, 200, 20)

; Child win
$hChildWin = GUICreate('Child', 200, 200, 50, 50)
	GUISetOnEvent($GUI_EVENT_CLOSE, '_ChildWin_Close')

GUICtrlCreateButton('Button2', 50, 50, 100, 50)
	GUICtrlSetOnEvent(-1, '_Button2')

$nLabel2 = GUICtrlCreateLabel('', 10, 20, 180, 20)

; Start
_WinAPI_SetParent($hChildWin, $hParentWin)
GUISetState(@SW_SHOW, $hParentWin)

; Root sleep
While 1
	Sleep(10)
WEnd

; Functions
Func _Pro_Exit()
	Exit
EndFunc

Func _ChildWin_Open()
	GUISetState(@SW_SHOW, $hChildWin)
EndFunc

Func _ChildWin_Close()
	GUISetState(@SW_HIDE, $hChildWin)
EndFunc

Func _Button2()
	$j += 1
	GUICtrlSetData($nLabel1, $j & ' Нажата кнопка на дочернем окне.')
	GUICtrlSetData($nLabel2, $j & ' Нажата кнопка.')
EndFunc



Кстати:

{TopicSolvedInfo}
 
Верх