xms77 发表于 2012-4-1 13:37:40

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

本帖最后由 xms77 于 2012-4-2 10:22 编辑

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

seniors 发表于 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

我不知道 是不是理解错误,但是最小化这个窗口有这个效果

netegg 发表于 2012-4-1 15:35:27

本帖最后由 netegg 于 2012-4-1 15:39 编辑

回复 3# 风行者
lz好像说的不是隐藏的意思
楼主这个似乎直接用winmove就行了

seniors 发表于 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+10,$xywh+400,50,20)
;~         WinSetState($Form2,"",@SW_MINIMIZE)
EndFunc这个快了基本看不出,慢了会看到先到财到位置
应该注册消息最好,等会发注册消息的

netegg 发表于 2012-4-1 15:53:54

本帖最后由 netegg 于 2012-4-1 15:56 编辑

回复 5# seniors
其实无所谓的,这类窗体嵌套样式根本不用考虑内部窗体到底在什么位置,只要隐藏客户区就行了,本身就是可以在内部移动的,只要注意下对拖出界(禁止)的处理就行了

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+10,$xywh+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没有注册恢复事件嘛?

pusofalse 发表于 2012-4-1 17:09:20

代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#include包含进常量库文件,并用常量名称来代替纯数值。

user3000 发表于 2012-4-1 17:27:00

代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#in ...
pusofalse 发表于 2012-4-1 17:09 http://www.autoitx.com/images/common/back.gif

是呀, 要不在后面加个注释才好, 才方便别人阅读!

zldfsz 发表于 2012-4-1 17:58:45

代码真难读懂啊,*Constants.au3中定义的那些常量,只记得GUI_EVENT_CLOSE等于-3。十分建议在写代码时,#in ...
pusofalse 发表于 2012-4-1 09:09 http://www.autoitx.com/images/common/back.gif


是啊,要读懂还得去查

298311657 发表于 2012-4-1 18:56:49

#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

seniors 发表于 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)这种形式的设置父窗口为什么不行?
另:上面方法子窗口在前面时,按父窗口的关闭不能关闭,只能按子窗口的关闭按钮才行

seniors 发表于 2012-4-1 20:16:04

大家别忙加钱啊,找找系统发送最小化完成的是什么消息啊,什么时候系统把最小化按钮改成还原按钮的啊?或者是发送什么命令让系统改变按钮的?
页: [1] 2 3
查看完整版本: 【已解决】如何让子窗体最小化到父窗体的下方而不是到任务栏