zldfsz 发表于 2012-4-1 21:09:31

回复 15# seniors


    你太了解我了,都知道我要加钱了   ^_^

xms77 发表于 2012-4-1 21:13:28

回复 13# 298311657
表达式错误报警,是不是3.3.7.15不支持Null?

xms77 发表于 2012-4-1 21:15:55

回复 14# seniors
好像必须子窗体全部最小化了后才能点父窗体的关闭按钮有效,不知道为什么?

seniors 发表于 2012-4-1 21:18:18

本帖最后由 seniors 于 2012-4-1 21:19 编辑

回复 18# xms77
就是发现了这问题,所以在问。可能真是3.3.7.15不支持Null,我也不行,我把Null改了0就行了

happytc 发表于 2012-4-1 21:54:58

回复298311657
上面代码就是简化版
发现问题:$Form2 = GUICreate("Form2",300,200,10,10,-1,-1,$Form1)这种形式的设置父窗口为什么不行?
另:上面方法子窗口在前面时,按父窗口的关闭不能关闭,只能按子窗口的关闭按钮才行


还要知其所以然呀
要想子窗口被定义于其父窗口区域内,就得有$WS_CHILD 样式,而用以上形式创建的子窗口并不带有,而是带有Pop-up Windows的样式WS_POPUP,所有就有你这样的问题了

下面是微软的说法:

For compatibility reasons, SetParent does not modify the WS_CHILD or WS_POPUP window styles of the window whose parent is being changed. Therefore, if hWndNewParent is NULL, you should also clear the WS_CHILD bit and set the WS_POPUP style after calling SetParent. Conversely, if hWndNewParent is not NULL and the window was previously a child of the desktop, you should clear the WS_POPUP style and set the WS_CHILD style before calling SetParent.


#include <winapi.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 623, 449)
$Form2 = GUICreate("Form2", 300, 200, 10, 10, BitOR($WS_CHILD, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_SYSMENU), -1, $Form1)
GUISetState(@SW_SHOW,$Form1)
GUISetState(@SW_SHOW,$Form2)
Do

Until GUIGetMsg()=-3

   

顺便大家也可以学学象下面这样的不同窗口样式创建
    Overlapped Windows
    Pop-up Windows
    Child Windows
    Layered Windows
    Message-Only Windows

xms77 发表于 2012-4-1 22:19:30

回复 20# happytc
E文不好,看得不明不白的。

happytc 发表于 2012-4-1 22:55:03

回复happytc
E文不好,看得不明不白的。
xms77 发表于 2012-4-1 22:19 http://www.autoitx.com/images/common/back.gif

For compatibility reasons, SetParent does not modify the WS_CHILD or WS_POPUP window styles of the window whose parent is being changed. Therefore, if hWndNewParent is NULL, you should also clear the WS_CHILD bit and set the WS_POPUP style after calling SetParent. Conversely, if hWndNewParent is not NULL and the window was previously a child of the desktop, you should clear the WS_POPUP style and set the WS_CHILD style before calling SetParent.

为了兼容,当具有WS_CHILD或WS_POPUP窗口的父窗口被改变时,SetParent函数也不会修改它们的窗口样式。因此,如果父窗口句柄为空,当调用了SetParent函数后,则应该清除子窗口的WS_CHILD样式,并且给子窗口加上WS_POPUP样式;相对应地是,如果父窗口句柄非空并且这个子窗口以前是桌面窗口的子窗口,则应该清除它的WS_POPUP样式,并且在调用SetParent前给它设置WS_CHILD样式。

298311657 发表于 2012-4-1 23:21:58

很多人回复,好像很有意思的样子,那我就再修复一下之前在13L发的代码。之前因为赶去上课,代码写的比较简单,这个应该可以了


#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <winapi.au3>
Global Const $SC_CLOSE = 0xF060
Local $ChildForm = , $ChildBtn =

$MainForm = GUICreate("Main", 500, 500)
$menu = GUICtrlCreateMenu("窗口")
$new1 = GUICtrlCreateMenuItem("新建", $menu)
$new2 = GUICtrlCreateMenuItem("批量新建", $menu)
GUICtrlCreateMenuItem("", $menu)
$mini = GUICtrlCreateMenuItem("全部最小化", $menu)
GUICtrlCreateMenuItem("", $menu)
$close = 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 $new1;新建子窗口
                        _CreateChildForm()
                Case $new2;批量新建子窗口
                        For $i = 0 To Random(3,10,1)
                                _CreateChildForm()
                        Next
                Case $close;关闭全部子窗口
                        _CloseChildForm()
                Case $mini;最小化全部子窗口
                        For $i = 0 To UBound($ChildForm) - 1
                                GUISetState(@SW_MINIMIZE, $ChildForm[$i])
                        Next                       
                Case Else;子窗口按钮点击
                        For $i = 0 To UBound($ChildBtn) - 1
                                If $iMsg = 0 And $iControl = $ChildBtn[$i] Then
                                        Return MsgBox(0,WinGetTitle($hWnd) & " 提示", "我是[" & $i & "]窗口。" & @CRLF & "我的句柄是:" & $ChildForm[$i], 0, $ChildForm[$i])
                                EndIf
                        Next
        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
                                _CloseChildForm()
                                Exit
                        Else
                                For $i = 0 To UBound($ChildForm) - 1
                                        If $ChildForm[$i] = $hWnd Then
                                                GUIDelete($ChildForm[$i])
                                                $ChildForm[$i] = 0
                                                ExitLoop
                                        EndIf
                                Next
                        EndIf
        EndSwitch
EndFunc   ;==>WM_SYSCOMMAND

Func _CreateChildForm()
        Local $j = 0
        For $i = 0 To UBound($ChildForm) - 1
                If Not IsHWnd($ChildForm[$i]) Then
                        $j = $i
                        ExitLoop
                EndIf
        Next
        If $j < 1 Then
                $j = $i
                ReDim $ChildForm[$j + 1]
                ReDim $ChildBtn[$j + 1]
        EndIf

        $ChildForm[$j] = GUICreate("Child" & $j, 200, 100, 10 + $j * 10, 10 + $j * 15, BitOR($WS_CHILD, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_SYSMENU), -1, $MainForm)
        GUICtrlCreateLabel("我的句柄:" & $ChildForm[$j], 10, 10, 200, 60)
        $ChildBtn[$j] = GUICtrlCreateButton("点我", 10, 70, 75, 25)
        GUISetBkColor("0x" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2), $ChildForm[$j])
        _WinAPI_SetParent($ChildForm[$j], $MainForm)
        GUISetState(@SW_SHOW, $ChildForm[$j])
EndFunc

Func _CloseChildForm()
        For $i = 0 To UBound($ChildForm) - 1
                GUIDelete($ChildForm[$i])
                $ChildForm[$i] = 0
        Next
EndFunc

风行者 发表于 2012-4-2 06:08:06

本帖最后由 风行者 于 2012-4-2 06:09 编辑

最小化,最大化au3早已做了准备,不用注册消息这么麻烦

Opt("GUIEventOptions", 1) ;当窗口发生最小化,最大化,改变大小,就禁止这种事件并立即发出通知,等待自定义函数进行处理

$gui = GUICreate('系统消息通知')
GUISetState()

While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case -3 ;$GUI_EVENT_CLOSE
                        Exit
                Case -4 ;$GUI_EVENT_MINIMIZE
                        $min = MsgBox(33, "提示", "确认要最小化?")
                        If $min = 1 Then GUISetState(@SW_MINIMIZE)
                Case -5 ;$GUI_EVENT_RESTORE
                        GUISetState(@SW_RESTORE)
        EndSwitch
WEnd

seniors 发表于 2012-4-2 07:26:46

还要知其所以然呀
要想子窗口被定义于其父窗口区域内,就得有$WS_CHILD 样式,而用以上形式创建的子窗 ...
happytc 发表于 2012-4-1 21:54 http://www.autoitx.com/images/common/back.gif
$WS_CHILD帮助里有一句“创建一个子窗口.带有此风格的窗口不能带有菜单栏”,我看成标题栏了,晕啊


最小化,最大化au3早已做了准备,不用注册消息这么麻烦
风行者 发表于 2012-4-2 06:08 http://www.autoitx.com/images/common/back.gif
注册消息和guiEVENT是两回事,如果你运行了我上的代码,winmove加上时间参数,你能很容易看到, GUIEVENT处理过程是先系统做好,再做你的代码;而注册消息的,是完全能按你的意愿来处理的。

风行者 发表于 2012-4-2 07:36:56

回复 25# seniors

上面方法同样适用onEvent模式

虽然两种模式处理方式不同,但是onEvent也有过人之处
至少会比注册消息方式方便,完全按意愿也可以做到

当然喜欢用那种是个人喜好

seniors 发表于 2012-4-2 07:44:09

回复 26# 风行者
Opt("GUIEventOptions", 1),刚才也没注意到这句
真是能按意愿的

xms77 发表于 2012-4-2 09:56:05

回复 22# happytc
感谢快乐兄的翻译!学习了

xms77 发表于 2012-4-2 10:16:59

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

回复 27# seniors
回复 26# 风行者
回复 23# 298311657
回复 20# happytc
如果最小化不是到父窗体的最底面,不知道怎么实现?请看我的另一个帖子http://www.autoitx.com/forum.php?mod=viewthread&tid=31355&extra=

zldfsz 发表于 2012-4-2 12:20:30

回复 29# xms77

上面不是解决了吗,怎么又出同样的问题啊
页: 1 [2] 3
查看完整版本: 【已解决】如何让子窗体最小化到父窗体的下方而不是到任务栏