关于父子窗口不知道是不是BUG,求高手协助测试!!
关于父子窗口不知道是不是BUG,可以帮忙测试看看 是不是有跟我一样的情况呢??在设计父子窗口的时候,操作上经常会卡住,控件经常会失效,觉得怪怪的,经过反复
测试 终于发现了,如果子窗口 加上了 $WS_CHILD 这个样式,就不会卡住,但是后来
发现 加了$WS_CHILD 这个样式,会导致 无法在子窗口 使用INPUT 或者 EDIT 控件
因为会无法输入
但是拿掉了$WS_CHILD 这个,在操作上又会卡住,不知道大家的情况是否一样??
有人可以帮忙测试的吗??问题怎么解决??
卡住的情况是这样的,程序开启后 把程序缩到最小,再还原,再缩小,再还原….
有时候一次就会卡住,卡住后似乎 窗口的焦点都被子窗占走了,父窗上面的按钮全部失效
包括了 放大.. 缩小 关闭等按钮….
程序语法如下:
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <winapi.au3>
Opt("GUIOnEventMode", 1)
$WinMain = GUICreate("Main", 1000, 750, -1, -1, $WS_MAXIMIZEBOX + $WS_MINIMIZEBOX + $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUI_COMMAND")
GUISetState(@SW_SHOW, $WinMain)
$WinMainSub = GUICreate("A視窗", 300, 300, 200, 200, -1, -1, $WinMain)
_WinAPI_SetParent($WinMainSub, $WinMain)
GUISetState(@SW_SHOW, $WinMainSub)
$WinMainSub2 = GUICreate("B視窗", 300, 300, 300, 300, -1, -1, $WinMain)
_WinAPI_SetParent($WinMainSub2, $WinMain)
GUISetState(@SW_SHOW, $WinMainSub2)
$WinMainSub3 = GUICreate("C視窗", 300, 300, 400, 400, -1, -1, $WinMain)
_WinAPI_SetParent($WinMainSub2, $WinMain)
GUISetState(@SW_SHOW, $WinMainSub3)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUI_COMMAND")
While 1
Sleep(20)
WEnd
Func GUI_COMMAND()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Switch @GUI_WinHandle
Case $WinMain
Exit
Case Else
GUIDelete(@GUI_WinHandle)
EndSwitch
EndSwitch
EndFunc ;==>GUI_COMMAND
回复 1# kk_lee69
到官方網站 找到一段程式這個程式運作很正常,但是 拿掉其中 無關緊要的一行 就會出問題......
原討論的網址為:
http://www.autoitscript.com/forum/topic/126189-bug-with-setparent/
If you comment out the <<<<<<<<<<<<<<<< label you get the same effect.
So I agree that it is a bug.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinApi.au3>
Global $hMain, $ahChild = [], $SC_MOVE = 0xF010
$hMain = GUICreate("Parent Window", 633, 447, 192, 200)
GUICtrlCreateLabel("", 0, 0, 0, 0) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 拿掉這一行程式就會卡住
$mMain = GUICtrlCreateMenu("New")
$mChild = GUICtrlCreateMenuItem("Child", $mMain)
GUISetState(@SW_SHOW)
; Prevent maximised children being moved
GUIRegisterMsg($WM_SYSCOMMAND, "On_WM_SYSCOMMAND")
While 1
; Use advanced GUIGetMsg to distinguish between windows
$aMsg = GUIGetMsg(1)
Switch $aMsg
; It is the parent
Case $hMain
; Now check the message
Switch $aMsg
Case $GUI_EVENT_CLOSE
Exit
Case $mChild
CreateChild()
EndSwitch
; Must be a child
Case Else
; But which one?
For $i = 1 To $ahChild
If $aMsg = $ahChild[$i] Then
; Check the message
Switch $aMsg
Case $GUI_EVENT_CLOSE
GUIDelete($ahChild[$i])
Case $GUI_EVENT_MAXIMIZE
; Set the Maximised flag
$ahChild[$i] = True
Case $GUI_EVENT_MINIMIZE
; Clear the Maximised flag
$ahChild[$i] = False
Case $GUI_EVENT_RESTORE
; Clear the Maximised flag
$ahChild[$i] = False
EndSwitch
EndIf
Next
EndSwitch
WEnd
Func CreateChild()
$hNew_Child = GUICreate("Child " & $ahChild + 1, 300, 300, 10, 0, BitOR($GUI_SS_DEFAULT_GUI , $WS_MAXIMIZEBOX))
_WinAPI_SetParent($hNew_Child, $hMain)
Add($ahChild, $hNew_Child)
GUISetState()
EndFunc ;==>CreateChild
Func Add(ByRef $aArray, $hHandle)
; Increase the number of children
$aArray += 1
; Resize the array
ReDim $aArray[$aArray + 1]
; Add the child details
$aArray[$aArray] = $hHandle
$aArray[$aArray] = False
EndFunc ;==>Add
Func On_WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
ConsoleWrite($hWnd&@TAB&$wParam&@CRLF)
For $i = 1 To $ahChild
; Does the message come from a child?
If $hWnd = $ahChild[$i] Then
; Is the child maximised?
If $ahChild[$i] Then
;Is it a MOVE mesage?
If BitAND($wParam, 0xFFF0) = $SC_MOVE Then Return False
ExitLoop
EndIf
EndIf
Next
Return $GUI_RUNDEFMSG
EndFunc ;==>On_WM_SYSCOMMAND 回复 2# kk_lee69
谢谢分享
回复 3# chzj589
你會有主控件失效的情況嗎?? 回复 4# kk_lee69
不会啊,我是用2楼的代码 回复 5# chzj589
那可以幫我測試一下 用二樓的代碼註釋掉 <<<<<<<<<<<<<<<<這一行的控件後測試一下嗎?? 回复 6# kk_lee69
注释掉主窗口失控,这一句有什么影响吗? 回复 7# chzj589
刚又试了一下,可以注释掉,但要有其它控件就行。
GUICtrlCreateLabel("", 0, 0, 0, 0 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 拿掉這一行程式就會卡住
上一行换下一行就行
$Input1 = GUICtrlCreateInput("", 10, 16, 200, 21 回复 7# chzj589
多按幾次最小化 與還原之後就不能還原了似乎 像子窗口變成 焦點而父窗口的功能就完全失效 回复 9# kk_lee69
三个子窗口都按了20次以上,没出现问题。 回复 10# chzj589
你的作業系統?? 回复 8# chzj589
不要加入任何˙控件直接註解掉 第七行然後 按 父窗口的放大縮小 回复 12# kk_lee69
$hMain = GUICreate("Parent Window", 633, 447, 192, 200)
GUICtrlCreateLabel("", 0, 0, 0, 0) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 拿掉這一行程式就會卡住
$mMain = GUICtrlCreateMenu("New")
$mChild = GUICtrlCreateMenuItem("Child", $mMain)
GUISetState(@SW_SHOW)
; Prevent maximised children being moved
GUIRegisterMsg($WM_SYSCOMMAND, "On_WM_SYSCOMMAND")
注释掉-GUICtrlCreateLabel("", 0, 0, 0, 0)
主窗口除了Menu控件,没有其它控件不能运行。
我用的是--3.3.13.18版本 回复 13# chzj589
@@ 我的版本 可以運行@@ v3.3.8.1會卡住@@ 回复 14# kk_lee69
主窗口不放任何控件,我也不能点击放大缩小。
但只要有任何一个控件就行