[已解决]如何创建一个像对话框一样的子窗体
本帖最后由 itljl 于 2010-8-22 12:49 编辑#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 557, 381)
$Button1 = GUICtrlCreateButton("Button1", 5, 5, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
MsgBox(0,0,0,-1,$form1)
EndSwitch
WEnd
上面的代码,当我们把msgbox的父窗口设置为$form1后,再点击$form1,窗体内所有控件不可用,并且,msgbox还会闪烁。
我已经试过所有样式,都不行。
有一种方法是,禁用$form1,但那样在点击父窗口的时候,子窗口不会闪烁。 需要的效果和打开IE的,"intelnet 选项" 这个子窗口的效果一样。。 貌似没这样式,自己写个吧
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 800, 600)
$Button1 = GUICtrlCreateButton("子窗口", 360, 280, 80, 25)
GUISetState(@SW_SHOW,$Form1)
Opt("GUIOnEventMode", 1)
GUICtrlSetOnEvent($Button1, "Form2")
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")
$Form2 = GUICreate("Form2", 640, 480,-1,-1,-1,-1,$Form1)
$Button2 = GUICtrlCreateButton("退出子窗口", 270, 220, 100, 25)
GUICtrlSetOnEvent($Button2, "Form2")
While 1
sleep(10)
WEnd
func quit()
exit
endfunc
func Form2()
if WinGetState($Form2) < 7 then
GUISetState(@SW_DISABLE, $Form1)
GUISetState(@SW_SHOW,$Form2)
else
GUISetState(@SW_HIDE,$Form2)
GUISetState(@SW_ENABLE, $Form1)
endif
endfunc
回复 4# xsjtxy
谢谢啊,明白了,原来要用事件模式才有这样的效果,循环模式同样的写法,没有这样的效果! 本帖最后由 republican 于 2010-8-21 19:44 编辑
回复 5# itljl
差别在于,你用了MSGbox,而4楼没有。
这个例子挺有趣的,说明了啥?
代码:
回复 6# republican
你想说明的是。。 本帖最后由 republican 于 2010-8-21 20:24 编辑
回复 7# itljl
这个例子我自己的理解是:
1.AU3在一般情况下,一次只能做一件事.
2.没有经过特殊构造,MSGBOX后,界面将无响应。而原因是,消息无法直接传递。事实上,许多的阻塞,均来源于AU3自身。
3.后发消息优先级大于首发消息。 回复 5# itljl
问题好像出在谁是谁的子窗口。
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 800, 600)
$Button1 = GUICtrlCreateButton("子窗口", 360, 280, 80, 25)
GUISetState(@SW_SHOW,$Form1)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
case $Button1
Form2()
EndSwitch
WEnd
func Form2()
GUISetState(@SW_DISABLE, $Form1)
$Form2 = GUICreate("Form2", 640, 480,-1,-1,-1,-1,$Form1)
$Button2 = GUICtrlCreateButton("退出子窗口", 270, 220, 100, 25)
GUISetState(@SW_SHOW,$Form2)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
case $Button2
exitloop
EndSwitch
WEnd
GUISetState(@SW_ENABLE, $Form1)
GUIDelete($Form2)
endfunc
MSGBOX 后应该整个脚本都停了等待MSGBOX消息了吧 使用 MSGBOX ,主脚本已暂停了,等待 MSGBOX 处理完毕,主脚本才会继续 留脚印学习
页:
[1]