找回密码
 加入
搜索
查看: 16893|回复: 32

[GUI管理] 【已解决】如何让子窗体最小化到父窗体的下方而不是到任务栏

 火... [复制链接]
发表于 2012-4-1 13:37:40 | 显示全部楼层 |阅读模式
本帖最后由 xms77 于 2012-4-2 10:22 编辑

请教大家的问题如题,图片如下,谢谢了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +20 收起 理由
afan + 20 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2012-4-1 14:28:08 | 显示全部楼层
winmove
winsetstate
发表于 2012-4-1 15:08:04 | 显示全部楼层
本帖最后由 风行者 于 2012-4-1 21:20 编辑


$Form1 = GUICreate("Form1", 623, 449, 192, 124,-1,-1,WinGetHandle(AutoItWinGetTitle()))
GUISetState()
Do
Until GUIGetMsg()=-3


我不知道 是不是理解错误,但是最小化这个窗口有这个效果
发表于 2012-4-1 15:35:27 | 显示全部楼层
本帖最后由 netegg 于 2012-4-1 15:39 编辑

回复 3# 风行者
lz好像说的不是隐藏的意思
楼主这个似乎直接用winmove就行了
发表于 2012-4-1 15:42:44 | 显示全部楼层
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[0]+10,$xywh[1]+400,50,20)
;~         WinSetState($Form2,"",@SW_MINIMIZE)
EndFunc
这个快了基本看不出,慢了会看到先到财到位置
应该注册消息最好,等会发注册消息的

评分

参与人数 3金钱 +75 贡献 +5 收起 理由
xms77 + 40 + 5
afan + 20
user3000 + 15

查看全部评分

发表于 2012-4-1 15:53:54 | 显示全部楼层
本帖最后由 netegg 于 2012-4-1 15:56 编辑

回复 5# seniors
其实无所谓的,这类窗体嵌套样式根本不用考虑内部窗体到底在什么位置,只要隐藏客户区就行了,本身就是可以在内部移动的,只要注意下对拖出界(禁止)的处理就行了
发表于 2012-4-1 16:24:38 | 显示全部楼层
回复 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[0]+10,$xywh[1]+400,150,24,2)
        Return 0

        EndIf
EndFunc

注册了消息,就不会出现原来的最过程,现在找不到方法让最小化按钮改成恢复按钮了
发表于 2012-4-1 16:54:44 | 显示全部楼层
回复 7# seniors

如果用模拟按钮+GUI方式,而不用原有的最小化控件,楼主的消息+窗口移动原理,是否会实现?
发表于 2012-4-1 16:59:02 | 显示全部楼层
回复 7# seniors
FORM2没有注册恢复事件嘛?
发表于 2012-4-1 17:09:20 | 显示全部楼层
代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#include包含进常量库文件,并用常量名称来代替纯数值。
发表于 2012-4-1 17:27:00 | 显示全部楼层
代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#in ...
pusofalse 发表于 2012-4-1 17:09


是呀, 要不在后面加个注释才好, 才方便别人阅读!
发表于 2012-4-1 17:58:45 | 显示全部楼层
代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#in ...
pusofalse 发表于 2012-4-1 09:09



是啊,要读懂还得去查
发表于 2012-4-1 18:56:49 | 显示全部楼层
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <winapi.au3>
Global Const $SC_CLOSE = 0xF060
Local $ChildForm[1] = [Null]

$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

评分

参与人数 4金钱 +125 贡献 +6 收起 理由
xms77 + 40 + 5
zldfsz + 30 + 1
afan + 30
user3000 + 25 学习了

查看全部评分

发表于 2012-4-1 20:12:46 | 显示全部楼层
回复 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)这种形式的设置父窗口为什么不行?
另:上面方法子窗口在前面时,按父窗口的关闭不能关闭,只能按子窗口的关闭按钮才行

评分

参与人数 1金钱 +30 贡献 +1 收起 理由
zldfsz + 30 + 1 +

查看全部评分

发表于 2012-4-1 20:16:04 | 显示全部楼层
大家别忙加钱啊,找找系统发送最小化完成的是什么消息啊,什么时候系统把最小化按钮改成还原按钮的啊?或者是发送什么命令让系统改变按钮的?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-29 14:51 , Processed in 0.097926 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表