[已解决] 分辨率改变后,$WS_POPUP 样式的子窗口会与父窗口错位
本帖最后由 yhxhappy 于 2012-4-14 21:54 编辑小弟在做一个驱动安装的程序,当安装到显卡驱动时,分辨率经常会改变。此时 $WS_POPUP 样式的子窗口就会与父窗口错位,见下图。
子窗口我还增加了$WS_EX_MDICHILD样式,以保证它能与父窗口一起移动。
还请大家帮看看,在没找到解决办法之前,我打算这样处理:
先注册分辨率改变的消息 GUIRegisterMsg($WM_DISPLAYCHANGE, "")
当检测到分辨率改变时,再对比各子窗口与父窗口坐标,发现不对再校正。但我有好几个子窗口,写起来挺麻烦的
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("函数演示", 400, 300) ; 创建居中显示的对话框窗口
GUISetState()
GUICreate("", 300, 200, 50, 50, $WS_POPUP+$WS_BORDER, $WS_EX_MDICHILD, $GUI) ;子窗口
GUISetBkColor(0xffff00)
GUICtrlCreateLabel("黄色窗口是子窗口", 100, 100, 120, 30)
GUISetState()
; 运行 GUI,直到对话框窗口关闭
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd为什么用这么多子窗口,主要是因为:子窗口根据父窗口点击的项目,实时创建一些控件,因为控件的数量是随机的,而且点击父窗口另外一个项目时,子窗口内的控件要全部清除再刷新。
我感觉删除项目很麻烦,干脆直接删掉子窗口再重建。 #include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("函数演示", 400, 300) ; 创建居中显示的对话框窗口
GUISetState()
$form = GUICreate("", 300, 200,-1, -1, $WS_POPUP + $WS_BORDER, $WS_EX_MDICHILD, $GUI) ;子窗口
GUISetBkColor(0xffff00)
$label = GUICtrlCreateLabel("黄色窗口是子窗口", 100, 100, 120, 30)
GUICtrlSetResizing($label, $GUI_DOCKALL)
GUISetState()
WM_MOVE()
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
; 运行 GUI,直到对话框窗口关闭
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd
Func WM_MOVE()
Local $pos = WinGetPos($GUI)
WinMove($form, "", $pos + 50, $pos + 50)
EndFunc ;==>WM_MOVE 学 习 了 , 回复 2# haijie1223
对Windows 系统消息代码不懂。我查了$WM_MOVE是移动一个窗口,这个在不是鼠标操作时是否有效?如果我正常的拖动父窗口,WM_MOVE()函数会不会也响应,这样会不会增加负荷? 回复 4# yhxhappy
注册成消息,所以在不操作鼠标的时候也管用,只要前一个窗口的位置变化,这个就会随之变化,至于增补增加负荷,你对比下cpu和内存占用,应该可以忽略不计吧。 是标签,不是子窗口 学习了,谢谢
页:
[1]