Что нового

[Окна, Диалоги] Как правильно создать дочернее окно?

killbond

Осваивающий
Сообщения
96
Репутация
32
При условии, что код должен умещаться в одном файле? Взаимодействие между окнами - при закрытии родительского закрывается, естественно и дочернее, при закрытии дочернего, родительское остается
 

worldmen

Новичок
Сообщения
14
Репутация
1
А если мне надо в родительской форме открыть несколько дочерних окон, как это организовать? При этом должен быть выбор количества создаваемых окон (от 1 до 10).

PS: только начинаю изучать. Предлагаемый файл посмотрел, поковырял, но не все понял.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Вариантов дочерного окна много, какой именно необходим:
* дочерное окно внутри родительского окна
* дочерное окно внутри родительского окна без системного меню и без заголовка
* дочерное окно без кнопки на панели задач
* пока открыто дочерное окно - блокировать родителсько?


astati [?]
А как сделать так чтоб дочерние окна открывались не сразу а по нажатии кнопки?
{MultplQuestionWarn.SModer}


Gui окно создается с помощью функции:
GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
parent - назначение создаваемоему окну родителсько окна
style и exStyle - различные стили окна, с помощью которых можно менять тип окна (с системным меню, без и т.д.)

Что бы создать окно внутри окна:
Код:
#include <WinAPI.au3>
_WinAPI_SetParent($hChild, $hParent)


Поэксперементируйте.
 

astati

Новичок
Сообщения
145
Репутация
4
`p r o x y сказал(а):
Вариантов дочерного окна много, какой именно необходим:
* дочерное окно внутри родительского окна
* дочерное окно внутри родительского окна без системного меню и без заголовка
* дочерное окно без кнопки на панели задач
* пока открыто дочерное окно - блокировать родителсько?


astati [?]
А как сделать так чтоб дочерние окна открывались не сразу а по нажатии кнопки?
[warn]За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, Модератор форума.[/warn]





Gui окно создается с помощью функции:
GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
parent - назначение создаваемоему окну родителсько окна
style и exStyle - различные стили окна, с помощью которых можно менять тип окна (с системным меню, без и т.д.)

Что бы создать окно внутри окна:
Код:
#include <WinAPI.au3>
_WinAPI_SetParent($hChild, $hParent)


Поэксперементируйте.





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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
astati
{OverQuoteWarn}
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
astati
Вопрос № 1:
Как правильно создать дочернее окно?

Вопрос № 2:
А если мне надо в родительской форме открыть несколько дочерних окон, как это организовать? При этом должен быть выбор количества создаваемых окон (от 1 до 10).

А в соответствии правил: 1 тема - 1 вопрос.

Примеры дочерных окон:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

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

Global	$hParentWin, $hChildWin

_Example1()

While 1
	Sleep(10)
WEnd

Func _ProExit()
	Exit
EndFunc

Func _CloseWin()
	GUIDelete(@GUI_WinHandle)
EndFunc

Func _Example1()
	MsgBox(64, 'Пример 1', 'Обычное дочерное окно')

	$hParentWin = GUICreate('Родителськое окно')
		GUISetOnEvent($GUI_EVENT_CLOSE, '_Example2')

	$hChildWin = GUICreate('Дочерное окно', 300, 200, -1, -1, $WS_SYSMENU, -1, $hParentWin)
		GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')

	GUISetState(@SW_SHOW, $hParentWin)
	GUISetState(@SW_SHOW, $hChildWin)
EndFunc

Func _Example2()
	GUIDelete($hParentWin)
	GUIDelete($hChildWin)
	MsgBox(64, 'Пример 2', 'Дочерное окно перемещается вместе с родительским окном')

	$hParentWin = GUICreate('Родителськое окно')
		GUISetOnEvent($GUI_EVENT_CLOSE, '_Example3')

	$hChildWin = GUICreate('Дочерное окно', 300, 200, -1, -1, $WS_SYSMENU, $WS_EX_MDICHILD, $hParentWin)
		GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')

	GUISetState(@SW_SHOW, $hParentWin)
	GUISetState(@SW_SHOW, $hChildWin)
EndFunc

Func _Example3()
	GUIDelete($hParentWin)
	GUIDelete($hChildWin)
	MsgBox(64, 'Пример 3', 'Дочерное окно внутри родительского окна')

	$hParentWin = GUICreate('Родителськое окно')
		GUICtrlCreateLabel('', -100, -100, 0, 0)
		GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit')

	$hChildWin = GUICreate('Дочерное окно', 300, 200, 10, 10, $WS_SYSMENU)
		GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')

	GUISetState(@SW_SHOW, $hParentWin)
	_WinAPI_SetParent($hChildWin, $hParentWin)
	GUISetState(@SW_SHOW, $hChildWin)
EndFunc
 

Jotun

Новичок
Сообщения
31
Репутация
0
Если я правильно понимаю, то чтобы закрыть дочернее окно мне нужно его "уничтожить" GUIDelete ( $OptionsWindow )

Если у меня скажем окно с настройками, где прописываются пути к файлам, то при следующем запуске дочернего окна, его элементы заново создаются,
а настройки которые были сделаны должны, например, заново считаться из файла настроек optons.ini. ? Или лучше просто спрятать его: GUISetState(@SW_HIDE, $OptionsWindow) ?
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Jotun
Пересоздавать окно с чтением настроек или скрывать - это зависит от ситуации, от логики программы и т.д. Если предполагается частое использование окна, то лучше скрывать, если этим окном будут пользоваться "раз в пол года", то лучше пересоздавать. Если вы при закрытии окна сразу сохраняете настройки в файл и затем из файла читаете, то окно вам не нужно. Если же вы считываете из элементов окна, то, естественно, окно нужно скрыть, а не закрыть. Решайте сами, что вам удобней.
 
Верх