freewaybsq 发表于 2013-11-23 21:40:16

请高手指点GUI多窗体调用遇到的一些问题

我想实现的效果是:
      
      先弹出主窗口===》点击按钮时再弹出子窗口===》在子窗口输入数据

      要求: 1.子窗口出现时父窗口不可作任何操作,直到子窗口被关闭
               2.子窗口必须是由GUICREATE来创建的,不可以是MSGBOX 或 INPUTBOX.
               3.关闭子窗口后,子窗口输入的数据要能被父窗口调用

以上请各路大侠指教,最好能附上详细的代码。。。感谢啦。。。。

veket_linux 发表于 2013-11-23 22:53:54

au3写模态对话框 麻烦了点 要不要咱用delphi 把窗口封个dll给你调调

user3000 发表于 2013-11-23 23:04:55

我不清楚什么才是“模态对话框”,但楼主的问题无非是“父子窗口”的操作吧。
论坛有很多帖子及示例的。出于鼓励新手,我还是敲一个简单示例吧。
代码里几乎没有注释,希望楼主已经接触GUI才是。Local $sInput
_gui_main()
Func _gui_main()
        Local $hGui_main, $msg
        Local $bt_child, $bt_input
        $hGui_main = GUICreate('main gui', 300, 150)
        $bt_child = GUICtrlCreateButton('子窗口', 50, 50)
        $bt_input = GUICtrlCreateButton('信息', 180, 50)
        GUISetState()
        While True
                $msg = GUIGetMsg()
                Switch $msg
                        Case -3 ;点击了关闭窗体
                                GUIDelete($hGui_main)
                                ExitLoop
                        Case $bt_child
                                GUISetState(@SW_DISABLE, $hGui_main)
                                _gui_child()
                                GUISetState(@SW_ENABLE, $hGui_main)
                                WinActivate($hGui_main)
                        Case $bt_input
                                MsgBox(0, 'info from child', $sInput, 0, $hGui_main)
                EndSwitch
        WEnd
EndFunc

Func _gui_child()
        Local $hGui_child, $msg
        Local $bt_back, $input
        $hGui_child = GUICreate('child gui', 300, 100)
        $input = GUICtrlCreateInput('', 50, 25, 200, 17)
        $bt_back = GUICtrlCreateButton('返回', 130, 60)
        GUISetState()
        Do
                $msg = GUIGetMsg()
        Until $msg = -3 Or $msg = $bt_back
        $sInput = GUICtrlRead($input)
        GUIDelete($hGui_child)
EndFunc

anypac 发表于 2013-11-24 07:42:36

au3父子窗口对话其实很简单,传递的变量设置好作用于或者通过func参数传递就可以,堪比傻瓜模式

chzj589 发表于 2013-11-24 08:21:17

回复 3# user3000

学习了!

freewaybsq 发表于 2013-11-24 09:20:10

回复 3# user3000

user3000 大侠,
你的方法我明白,
可否再指教一下,如果不使用GUISetState(@SW_DISABLE, $hGui_main)类似语句,直接调用子窗口,而不是通过改变窗口属性,来达到同样的目的呢?

顺便再请教一下:如何让子窗口只显示在父窗体内。

user3000 发表于 2013-11-24 18:12:55

回复 6# freewaybsq
参考这个帖子吧:
http://61.153.183.105/forum.php?mod=viewthread&tid=31341&from=favorites

veket_linux 发表于 2013-11-24 22:21:52

原理是我把GUISetState的两个参数搞反了{:face (52):},修改自 autoit入门与提高 父子窗口

Global Const $GUI_EVENT_CLOSE = -3;窗口关闭消息的值
Dim $Child_Gui;定义一个变量用于存放子窗口的句柄
Opt("GUIOnEventMode", 1) ;开启Event 模式
$Gui = GUICreate("我的第一个窗口") ; 创建一个居中显示的GUI 窗口
GUISetOnEvent($GUI_EVENT_CLOSE, "main");注册关闭消息到自定义函数main 里面进行处理
$Input = GUICtrlCreateInput("", 10, 35, 300, 20)
$Show_btn = GUICtrlCreateButton("子窗口", 40, 75, 90, 20)
GUICtrlSetOnEvent($Show_btn, "main")
GUISetState(@SW_SHOW)
$Child_Gui = 0
$Child_Input = 0
While 1 ;死循环,保证脚本不会退出
        Sleep(1000)
WEnd
Func main()
        Switch @GUI_CtrlId;根据宏@GUI_CtrlId来判断消息
                Case $GUI_EVENT_CLOSE
                        Switch @GUI_WinHandle;根据宏@GUI_WinHandle 来判断产生关闭消息的窗口消息
                                Case $Gui
                                        Exit
                                Case $Child_Gui
                                        GUICtrlSetData($Input, GUICtrlRead($Child_Input))
                                        GUIDelete($Child_Gui)
                                        GUISetState(@SW_ENABLE,$Gui)
                        EndSwitch
                Case $Show_btn
                        Child_Gui()
        EndSwitch
EndFunc   ;==>main
Func Child_Gui()
        GUISetState(@SW_DISABLE,$Gui )
        $Child_Gui = GUICreate("我是子窗口", 200, 100, -1, -1, -1, -1, $Gui)
        $Child_Input = GUICtrlCreateInput("", 10, 35, 100, 20)
        GUISetOnEvent($GUI_EVENT_CLOSE, "main")
        GUISetState(@SW_SHOW)
EndFunc   ;==>Child_Gui
页: [1]
查看完整版本: 请高手指点GUI多窗体调用遇到的一些问题