Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Создание дочерних окон (http://forum.oszone.net/showthread.php?t=145367)

morgan1991 16-07-2009 22:17 1169866

Создание дочерних окон
 
Люди добрые помогите пожалуйста.
Нашол в справке пример сосдания окна внутри которого ещё одно окно, но никак не могу понять как это работает.
Помогите пожалуйста разобраться.
Нужно как можно кратче!, чтоб небыло ничего лишнего...
Заранее спасибо...

Creat0R 16-07-2009 23:37 1169947

morgan1991,
Цитата:

Цитата morgan1991
никак не могу понять как это работает »

А как вы ожидаете от нас это понять, не зная о каком примере идёт речь?

P.S
И подберите более конкретное название темы, «Окно в окне» отражает ровным счётом ничего.

Yashied 17-07-2009 00:10 1169974

Есть такая функция - SetParent. Поищи на форуме, если сам не сможешь разобраться, тогда поможем. Договорились?

Ну, или ждем proxy. :)

morgan1991 17-07-2009 00:57 1170003

Вот пример:


Код:

#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


Мне просто нужно понять, какие параметры обязательны для организации такой структуры?

proxy 17-07-2009 01:23 1170017

и такой пример:
читать дальше »


Код:

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



Цитата:

Цитата Yashied
Ну, или ждем 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-е кнопки).

Yashied 17-07-2009 01:32 1170022

Окно в окне. :)

Код:

#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


proxy 17-07-2009 01:35 1170023

Цитата:

Цитата Yashied
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.
т.е.
Цитата:

Цитата proxy
GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin) »

или
Цитата:

Цитата proxy
GUICreate('Дочерное окно', 250, 250, 200, 20, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hParentWin) »


Yashied 17-07-2009 01:50 1170033

Мысль не понял.

proxy, просто первоначальная тема имела название "Окно в окне ..." или как то так.

morgan1991 17-07-2009 01:58 1170040

Цитата:

Цитата Yashied
Мысль не понял. »

Это вроди одно и тоже...

Скажите вот ещё пожалуйста, а возможно ли сделать так:

есть окно, внутри него второе окно, можно ли заменить второе окно на третье, а потом обратно

proxy 17-07-2009 02:03 1170045

Цитата:

Цитата Yashied
Мысль не понял.
proxy, просто первоначальная тема имела название "Окно в окне ..." или как то так. »

так оно все и есть. Для создания дочерного окна, уже можно не использовать:
Цитата:

DllCall('user32.dll', 'int', 'SetParent', 'hwnd', $hChild, 'hwnd', $hParent)
так как можно указать вот так:
Цитата:

GUICreate('Дочерное окно', 250, 250, 300, 300, -1, -1, $hParentWin)

Yashied 17-07-2009 02:04 1170046

Цитата:

Цитата morgan1991
Это вроди одно и тоже... »

В том то и дело, что не одно и тоже. Попробуй.

Цитата:

Цитата morgan1991
Скажите вот ещё пожалуйста, а возможно ли сделать так:
есть окно, внутри него второе окно, можно ли заменить второе окно на третье, а потом обратно »

А почему бы и нет, можно и третье, и четвертое, и т.д.


@proxy

Я под "Окно в окне" понял что имеется в виду MDI-окна. В принципе CreatOR прав, название темы должно быть более содержательным.

proxy 17-07-2009 02:11 1170051

Цитата:

Цитата morgan1991
есть окно, внутри него второе окно, можно ли заменить второе окно на третье, а потом обратно »

пример:
читать дальше »


Код:

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



Цитата:

Цитата Yashied
Окно в окне. »

ааааа, понял, забыл про этот вариант )
очень хороший пример!


Время: 18:09.

Время: 18:09.
© OSzone.net 2001-