【已解决】如何让子窗体最小化到父窗体的下方而不是到任务栏
本帖最后由 xms77 于 2012-4-2 10:22 编辑请教大家的问题如题,图片如下,谢谢了!
winmove
winsetstate 本帖最后由 风行者 于 2012-4-1 21:20 编辑
$Form1 = GUICreate("Form1", 623, 449, 192, 124,-1,-1,WinGetHandle(AutoItWinGetTitle()))
GUISetState()
Do
Until GUIGetMsg()=-3
我不知道 是不是理解错误,但是最小化这个窗口有这个效果 本帖最后由 netegg 于 2012-4-1 15:39 编辑
回复 3# 风行者
lz好像说的不是隐藏的意思
楼主这个似乎直接用winmove就行了 Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 623, 449)
GUISetOnEvent(-3,"exitfunc")
$Form2 = GUICreate("Form2",300,200,10,10,-1,0x00000040,$Form1)
GUISetOnEvent(-4,"mymin")
GUISetState(@SW_SHOW,$Form1)
GUISetState(@SW_SHOW,$Form2)
While 1
Sleep(10)
WEnd
Func exitfunc()
Exit
EndFunc
Func mymin()
$xywh = WinGetPos($Form1)
WinMove($Form2,"",$xywh+10,$xywh+400,50,20)
;~ WinSetState($Form2,"",@SW_MINIMIZE)
EndFunc这个快了基本看不出,慢了会看到先到财到位置
应该注册消息最好,等会发注册消息的 本帖最后由 netegg 于 2012-4-1 15:56 编辑
回复 5# seniors
其实无所谓的,这类窗体嵌套样式根本不用考虑内部窗体到底在什么位置,只要隐藏客户区就行了,本身就是可以在内部移动的,只要注意下对拖出界(禁止)的处理就行了 回复 6# netegg
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 623, 449)
GUISetOnEvent(-3,"exitfunc")
$Form2 = GUICreate("Form2",300,200,10,10,-1,0x00000040,$Form1)
GUISetState(@SW_SHOW,$Form1)
GUISetState(@SW_SHOW,$Form2)
GUIRegisterMsg(0x0112,"mymin")
While 1
Sleep(10)
WEnd
Func exitfunc()
Exit
EndFunc
Func mymin($hWnd, $iMsg, $iwParam, $ilParam)
If $hWnd = $Form2 And $iwParam = 0xF020 Then
$xywh = WinGetPos($Form1)
WinMove($Form2,"",$xywh+10,$xywh+400,150,24,2)
Return 0
EndIf
EndFunc
注册了消息,就不会出现原来的最过程,现在找不到方法让最小化按钮改成恢复按钮了 回复 7# seniors
如果用模拟按钮+GUI方式,而不用原有的最小化控件,楼主的消息+窗口移动原理,是否会实现? 回复 7# seniors
FORM2没有注册恢复事件嘛? 代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#include包含进常量库文件,并用常量名称来代替纯数值。 代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#in ...
pusofalse 发表于 2012-4-1 17:09 http://www.autoitx.com/images/common/back.gif
是呀, 要不在后面加个注释才好, 才方便别人阅读! 代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#in ...
pusofalse 发表于 2012-4-1 09:09 http://www.autoitx.com/images/common/back.gif
是啊,要读懂还得去查 #include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <winapi.au3>
Global Const $SC_CLOSE = 0xF060
Local $ChildForm =
$MainForm = GUICreate("Main", 500, 500)
$menu = GUICtrlCreateMenu("窗口")
$new = GUICtrlCreateMenuItem("新建", $menu)
GUISetState(@SW_SHOW, $MainForm)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
While 1
Sleep(2500)
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
$iControl = BitAND($iwParam, 0xFFFF)
$iMsg = BitShift($iwParam, 16)
Switch $iControl
Case $new
Local $j = 0
For $i = 0 To UBound($ChildForm) - 1
If Not IsHWnd($ChildForm[$i]) Then
$j = $i
EndIf
Next
If $j < 1 Then
$j = $i
ReDim $ChildForm[$j + 1]
EndIf
$ChildForm[$j] = GUICreate("Child" & $j, 200, 100, 10, 50, -1, -1, $MainForm)
GUICtrlCreateLabel("我的句柄:" & $ChildForm[$j], 10, 10, 200, 60)
_WinAPI_SetParent($ChildForm[$j], $MainForm)
GUISetState(@SW_SHOW, $ChildForm[$j])
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iID = BitAND($wParam, 0x0000FFFF)
Switch $iID
Case $SC_CLOSE
If $hWnd = $MainForm Then
For $i = 0 To UBound($ChildForm) - 1
GUIDelete($ChildForm[$i])
Next
Exit
Else
For $i = 0 To UBound($ChildForm) - 1
If $ChildForm[$i] = $hWnd Then
GUIDelete($ChildForm[$i])
$ChildForm[$i] = Null
ExitLoop
EndIf
Next
EndIf
EndSwitch
EndFunc ;==>WM_SYSCOMMAND 回复 13# 298311657
#include <winapi.au3>
$Form1 = GUICreate("Form1", 623, 449)
GUISetState(@SW_SHOW,$Form1)
$Form2 = GUICreate("Form2",300,200,10,10)
_WinAPI_SetParent($Form2, $Form1)
GUISetState(@SW_SHOW,$Form2)
Do
Until GUIGetMsg()=-3
上面代码就是简化版
发现问题:$Form2 = GUICreate("Form2",300,200,10,10,-1,-1,$Form1)这种形式的设置父窗口为什么不行?
另:上面方法子窗口在前面时,按父窗口的关闭不能关闭,只能按子窗口的关闭按钮才行 大家别忙加钱啊,找找系统发送最小化完成的是什么消息啊,什么时候系统把最小化按钮改成还原按钮的啊?或者是发送什么命令让系统改变按钮的?