Показать полную графическую версию : [решено] Создание дочерних окон
morgan1991
16-07-2009, 22:17
Люди добрые помогите пожалуйста.
Нашол в справке пример сосдания окна внутри которого ещё одно окно, но никак не могу понять как это работает.
Помогите пожалуйста разобраться.
Нужно как можно кратче!, чтоб небыло ничего лишнего...
Заранее спасибо...
morgan1991, никак не могу понять как это работает »
А как вы ожидаете от нас это понять, не зная о каком примере идёт речь?
P.S
И подберите более конкретное название темы, «Окно в окне» отражает ровным счётом ничего.
Есть такая функция - SetParent (http://msdn.microsoft.com/en-us/library/ms633541(VS.85).aspx). Поищи на форуме, если сам не сможешь разобраться, тогда поможем. Договорились?
Ну, или ждем proxy. :)
morgan1991
17-07-2009, 00:57
Вот пример:
#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
Local $nFileMenu, $nExititem, $GUIMsg, $hGUI, $h_cGUI, $h_cGUI2
Local $listview, $button
$hGUI = GUICreate("ScrollBar Example", 600, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
GUISetBkColor(0x88AABB)
$nFileMenu = GUICtrlCreateMenu("File")
$nExititem = GUICtrlCreateMenuItem("Exit", $nFileMenu)
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
GUICtrlSetResizing($button, $GUI_DOCKALL)
For $x = 1 To 30
GUICtrlCreateListViewItem("item" & $x & "|col2|col3", $listview)
Next
GUICtrlSetResizing($listview, $GUI_DOCKALL)
$h_cGUI = GUICreate("Child GUI", 200, 200, 10, 200, $WS_CHILD, $WS_EX_CLIENTEDGE, $hGUI)
GUICtrlCreateButton("a button", 10, 10, 90, 20)
GUISetBkColor(0X006400)
GUISetState()
GUICtrlSetResizing($h_cGUI, $GUI_DOCKALL)
GUISwitch($hGUI)
$h_cGUI2 = GUICreate("Child GUI", 200, 200, 215, 10, $WS_CHILD, $WS_EX_CLIENTEDGE, $hGUI)
GUICtrlCreateButton("a button", 10, 10, 90, 20)
GUISetBkColor(0X006400)
GUISetState()
GUICtrlSetResizing($h_cGUI2, $GUI_DOCKALL)
GUISwitch($hGUI)
GUISetState(@SW_SHOW, $hGUI)
While 1
$GUIMsg = GUIGetMsg()
Switch $GUIMsg
Case $GUI_EVENT_CLOSE, $nExititem
ExitLoop
EndSwitch
WEnd
Мне просто нужно понять, какие параметры обязательны для организации такой структуры?
и такой пример:
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
HotKeySet('{ESC}', '_Pro_Exit'); Закрыть скрипт: ESC
Global $hParentWin, $hChildWin
_Example_1()
Func _Example_1()
GUIDelete($hParentWin)
GUIDelete($hChildWin)
$hParentWin = GUICreate('Родительскоре окно', 300, 400, 100, 250)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUISetBkColor(0x0000ff, $hParentWin)
GUICtrlCreateButton('Пример 1', 10, 170, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_1')
GUICtrlCreateButton('Пример 2', 10, 195, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_2')
$hChildWin = GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Win_Close')
GUISetBkColor(0x00ff00, $hChildWin)
GUISwitch($hParentWin)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('1-1')
GUICtrlCreateTabItem('1-1')
GUISwitch($hChildWin)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('2-1')
GUICtrlCreateTabItem('2-1')
GUISetState(@SW_SHOW, $hParentWin)
GUISetState(@SW_SHOW, $hChildWin)
EndFunc
Func _Example_2()
GUIDelete($hParentWin)
GUIDelete($hChildWin)
$hParentWin = GUICreate('Родительскоре окно', 550, 400, 100, 250)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUISetBkColor(0x0000ff, $hParentWin)
GUICtrlCreateButton('Пример 1', 10, 170, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_1')
GUICtrlCreateButton('Пример 2', 10, 195, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_2')
$hChildWin = GUICreate('Дочерное окно', 250, 250, 200, 20, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hParentWin)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Win_Close')
GUISetBkColor(0x00ff00, $hChildWin)
GUISwitch($hParentWin)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('1-1')
GUICtrlCreateTabItem('1-1')
GUISwitch($hChildWin)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('2-1')
GUICtrlCreateTabItem('2-1')
GUISetState(@SW_SHOW, $hParentWin)
GUISetState(@SW_SHOW, $hChildWin)
EndFunc
While 1
Sleep(10)
WEnd
Func _Win_Close($hWnd='')
If NOT Eval('hWnd') Then Assign('hWnd', @GUI_WinHandle, 1)
GUIDelete($hWnd)
EndFunc
Func _Pro_Exit()
Exit
EndFunc
Func _Open_Example_1()
_Example_1()
EndFunc
Func _Open_Example_2()
_Example_2()
EndFunc
Ну, или ждем proxy. »
угадал )
Пример, что выше, с комментариями:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
Local $nFileMenu, $nExititem, $GUIMsg, $hGUI, $h_cGUI, $h_cGUI2
Local $listview, $button
;~ Создается родительское окно
$hGUI = GUICreate("ScrollBar Example", 600, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
GUISetBkColor(0x88AABB)
$nFileMenu = GUICtrlCreateMenu("File")
$nExititem = GUICtrlCreateMenuItem("Exit", $nFileMenu)
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
GUICtrlSetResizing($button, $GUI_DOCKALL)
For $x = 1 To 30
GUICtrlCreateListViewItem("item" & $x & "|col2|col3", $listview)
Next
GUICtrlSetResizing($listview, $GUI_DOCKALL)
;~ Созхдается дочерное окно
;~ Указывается стиль: $WS_CHILD, тогда окно будет внутри родительского окна
;~ Указывается хэндел (указатель) на родительское окно: $hGUI
$h_cGUI = GUICreate("Child GUI", 200, 200, 10, 200, BitOR($WS_CHILD, $WS_TABSTOP), $WS_EX_CLIENTEDGE, $hGUI)
GUICtrlCreateButton("a button", 10, 10, 90, 20)
GUICtrlCreateButton("a button", 10, 35, 90, 20)
GUISetBkColor(0X006400)
GUISetState()
GUICtrlSetResizing($h_cGUI, $GUI_DOCKALL)
GUISwitch($hGUI)
$h_cGUI2 = GUICreate("Child GUI", 200, 200, 215, 10, BitOR($WS_CHILD, $WS_TABSTOP), $WS_EX_CLIENTEDGE, $hGUI)
GUICtrlCreateButton("a button", 10, 10, 90, 20)
GUISetBkColor(0X006400)
GUISetState()
GUICtrlSetResizing($h_cGUI2, $GUI_DOCKALL)
GUISwitch($hGUI)
GUISetState(@SW_SHOW, $hGUI)
While 1
$GUIMsg = GUIGetMsg()
Switch $GUIMsg
Case $GUI_EVENT_CLOSE, $nExititem
ExitLoop
EndSwitch
WEnd
Одна беда у этой технологии, имхо все рушит, - то, что в дочерных окнах нет возможности перемещатся между элементами управления с помощью клавиши TAB ....
Запусти это пример и попробуй перейти с одной кнопки на другу через TAB (в окне где 2-е кнопки).
Окно в окне. :)
#Include <WindowsConstants.au3>
$hParent = GUICreate('Parent', 400, 400, 200, 200)
GUICtrlCreateLabel('', 0, 0, 0, 0)
GUISetState()
$hChild = GUICreate('MDI', 200, 200, 0, 0, BitOR($WS_CAPTION, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_POPUP, $WS_SYSMENU))
DllCall('user32.dll', 'int', 'SetParent', 'hwnd', $hChild, 'hwnd', $hParent)
GUISetState()
Do
Until GUIGetMsg() = -3
DllCall('user32.dll', 'int', 'SetParent', 'hwnd', $hChild, 'hwnd', $hParent) »
GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
parent - [optional] The handle of another previously created window - this new window then becomes a child of that window.
т.е.
GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin) »
или
GUICreate('Дочерное окно', 250, 250, 200, 20, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hParentWin) »
Мысль не понял.
proxy, просто первоначальная тема имела название "Окно в окне ..." или как то так.
morgan1991
17-07-2009, 01:58
Мысль не понял. »
Это вроди одно и тоже...
Скажите вот ещё пожалуйста, а возможно ли сделать так:
есть окно, внутри него второе окно, можно ли заменить второе окно на третье, а потом обратно
Мысль не понял.
proxy, просто первоначальная тема имела название "Окно в окне ..." или как то так. »
так оно все и есть. Для создания дочерного окна, уже можно не использовать:
DllCall('user32.dll', 'int', 'SetParent', 'hwnd', $hChild, 'hwnd', $hParent)
так как можно указать вот так:
GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin)
Это вроди одно и тоже... »
В том то и дело, что не одно и тоже. Попробуй.
Скажите вот ещё пожалуйста, а возможно ли сделать так:
есть окно, внутри него второе окно, можно ли заменить второе окно на третье, а потом обратно »
А почему бы и нет, можно и третье, и четвертое, и т.д.
@proxy
Я под "Окно в окне" понял что имеется в виду MDI-окна. В принципе CreatOR прав, название темы должно быть более содержательным.
есть окно, внутри него второе окно, можно ли заменить второе окно на третье, а потом обратно »
пример:
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
HotKeySet('{ESC}', '_Pro_Exit'); Закрыть скрипт: ESC
Global $hParentWin, $hChild1Win, $hChild2Win
_Example_2()
Func _Example_1()
GUIDelete($hParentWin)
GUIDelete($hChild1Win)
GUIDelete($hChild2Win)
$hParentWin = GUICreate('Родительскоре окно', 300, 400, 100, 250)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUISetBkColor(0x0000ff, $hParentWin)
GUICtrlCreateButton('Пример 1', 10, 170, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_1')
GUICtrlCreateButton('Пример 2', 10, 170+25, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_2')
GUICtrlCreateButton('Сменить окно', 10, 170+25*2, 150, 22)
GUICtrlSetOnEvent(-1, '_ChangeChildWin')
$hChild1Win = GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Win_Close')
GUISetBkColor(0x00ff00, $hChild1Win)
$hChild2Win = GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Win_Close')
GUISetBkColor(0xf0ff0f, $hChild2Win)
GUISwitch($hParentWin)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('1-1')
GUICtrlCreateTabItem('1-1')
GUISwitch($hChild1Win)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('2-1')
GUICtrlCreateTabItem('2-1')
GUISwitch($hChild2Win)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('3-1')
GUICtrlCreateTabItem('4-1')
GUISetState(@SW_SHOW, $hParentWin)
GUISetState(@SW_SHOW, $hChild1Win)
EndFunc
Func _Example_2()
GUIDelete($hParentWin)
GUIDelete($hChild1Win)
GUIDelete($hChild2Win)
$hParentWin = GUICreate('Родительскоре окно', 550, 400, 100, 250)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUISetBkColor(0x0000ff, $hParentWin)
GUICtrlCreateButton('Пример 1', 10, 170, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_1')
GUICtrlCreateButton('Пример 2', 10, 170+25, 150, 22)
GUICtrlSetOnEvent(-1, '_Open_Example_2')
GUICtrlCreateButton('Сменить окно', 10, 170+25*2, 150, 22)
GUICtrlSetOnEvent(-1, '_ChangeChildWin')
$hChild1Win = GUICreate('Дочерное окно', 250, 250, 200, 20, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hParentWin)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Win_Close')
GUISetBkColor(0x00ff00, $hChild1Win)
$hChild2Win = GUICreate('Дочерное окно', 250, 250, 200, 20, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hParentWin)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Win_Close')
GUISetBkColor(0xf0ff0f, $hChild2Win)
GUISwitch($hParentWin)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('1-1')
GUICtrlCreateTabItem('1-1')
GUISwitch($hChild1Win)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('2-1')
GUICtrlCreateTabItem('2-1')
GUISwitch($hChild2Win)
GUICtrlCreateTab(10, 10, 150, 150)
GUICtrlCreateTabItem('3-1')
GUICtrlCreateTabItem('4-1')
GUISetState(@SW_SHOW, $hParentWin)
GUISetState(@SW_SHOW, $hChild1Win)
EndFunc
While 1
Sleep(10)
WEnd
Func _Win_Close($hWnd='')
If NOT Eval('hWnd') Then Assign('hWnd', @GUI_WinHandle, 1)
GUIDelete($hWnd)
EndFunc
Func _Pro_Exit()
Exit
EndFunc
Func _Open_Example_1()
_Example_1()
EndFunc
Func _Open_Example_2()
_Example_2()
EndFunc
Func _ChangeChildWin()
If BitAnd(WinGetState($hChild1Win), 2) Then
GUISetState(@SW_SHOW, $hChild2Win)
GUISetState(@SW_HIDE, $hChild1Win)
Else
GUISetState(@SW_SHOW, $hChild1Win)
GUISetState(@SW_HIDE, $hChild2Win)
EndIf
EndFunc
Окно в окне. »
ааааа, понял, забыл про этот вариант )
очень хороший пример!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.