Что нового

[Элементы GUI] Дочернее окно. Отрисовка элементов

F9

Новичок
Сообщения
71
Репутация
2
Добрый день!

Не могу вывести правильно дочернее окно, в нем отрисованы все элементы главного окна

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

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

Global  $hParentWin, $hChildWin

_Example3()

While 1
    Sleep(10)
WEnd

Func _ProExit()
    Exit
EndFunc

Func _CloseWin()
    GUIDelete(@GUI_WinHandle)
EndFunc


Func _Example3()
    local $hParent = 0

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

	GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit',$hParentWin)
	GUICtrlCreateLabel('111111111111', 10, 10, 10, 10)
	GUICtrlCreateListView(' 1|2', 10, 50, 200, 100)
	GUICtrlCreateInput("", 20, 200, 150)

	$hChildWin = GUICreate('Дочерное окно', 300, 200, 30, 30, -1,-1,$hParentWin)
;~ 	$hChildWin = GUICreate('Дочерное окно', 300, 200, 10, 10, BitOR($WS_POPUP, $WS_SIZEBOX),BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST),$hParentWin)
	GUICtrlCreateListView(' 1|2|3|4|', 7, 5, 290, 330)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin',$hChildWin)

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

Почему так прорисовываются элементы? Не потому ли, что их объявление было раньше чем дочернего окна?


За основу взят пример, в моем коде немного больше строк, но суть - та же.

Задача исходная:
по кнопке открываем дочернее окно, без гграниц и управляющих кнопок, в окне только один элемент типа List в виде таблицы, с отображением данных..
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У вас не дочернее окно, а а-ля MDI. AutoIt нативно не поддерживает работу с такими окнами. Уберите _WinAPI_SetParent() и будет вам счастье.
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
Yashied сказал(а):
У вас не дочернее окно, а а-ля MDI. AutoIt нативно не поддерживает работу с такими окнами.

Хм...
Тогда как можно вывести результат поверх основной формы, но привязанный к форме (т.е. перемещения основного окна будут перемещать всю эту связку) ?
Может что посоветуете?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это делается путем отслеживания перемещения родительского окна. Но я бы посоветовал на время вывода результата просто сделать неактивным родительское окно. Как вам такой вариант?
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
не подскажите, почему:
не выполняется отображение дочернего окна.
если делать вывод дочернего не через функцию, то при выходе из дочернего окна, пропадает фокус (принудительно даже установленный) на родительское?

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

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

Global  $hParentWin, $hChildWin,$btn


;~     local $hParent = 0

    $hParentWin = GUICreate('Родителськое окно')
	GUISetState(@SW_SHOW, $hParentWin)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit',$hParentWin)
    GUICtrlCreateLabel('111111111111', 10, 10, 10, 10)
    GUICtrlCreateListView(' 1|2', 10, 50, 200, 100)
    $btn = GUICtrlCreateButton("", 20, 200, 150,30)

	Func Child()
		$hChildWin = GUICreate('Дочерное окно', 300, 200, -1, -1, -1,-1,$hParentWin)
		GUICtrlCreateListView(' 1|2|3|4|', 7, 5, 290, 330)
		GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin',$hChildWin)
		GUISetState(@SW_SHOW, $hChildWin)
		GUISetState(@SW_DISABLE, $hParentWin)
   EndFunc

While 1
Switch GUIGetMsg()
	Case $GUI_EVENT_CLOSE
		_ProExit()

	Case $btn
		Child()

EndSwitch
WEnd

Func _ProExit()
    Exit
EndFunc

Func _CloseWin()

	GUISetState(@SW_ENABLE, $hParentWin)
	WinActivate("Родителськое окно")
	GUIDelete(@GUI_WinHandle)
EndFunc
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
Спасибо за советы !

Сделал окно без рамок и управляющих кнопок

Код:
$ParentWin_Pos = WinGetPos($MainForm, "")
	Global $ChildWin = GUICreate("Child GUI", 700, 240, $ParentWin_Pos[0]+ 25 , $ParentWin_Pos[1] + 90, BitOR($WS_POPUP, $WS_SIZEBOX),BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST), $MainForm)
	GUISetState(@SW_HIDE, $ChildWin)
 

CreatoR

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

Код:
GUISetState(@SW_DISABLE, $hParentWin)
GUISetState(@SW_SHOW, $hChildWin)

...


GUISetState(@SW_ENABLE, $hParentWin)
GUIDelete($hChildWin)


Как правильно создавать дочерние окна?
 
Верх