yhxhappy 发表于 2012-4-13 00:14:07

[已解决] 分辨率改变后,$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为什么用这么多子窗口,主要是因为:子窗口根据父窗口点击的项目,实时创建一些控件,因为控件的数量是随机的,而且点击父窗口另外一个项目时,子窗口内的控件要全部清除再刷新。
我感觉删除项目很麻烦,干脆直接删掉子窗口再重建。

haijie1223 发表于 2012-4-13 00:42:56

#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

lxzan 发表于 2012-4-13 07:51:26

学 习 了 ,

yhxhappy 发表于 2012-4-13 10:58:11

回复 2# haijie1223


    对Windows 系统消息代码不懂。我查了$WM_MOVE是移动一个窗口,这个在不是鼠标操作时是否有效?如果我正常的拖动父窗口,WM_MOVE()函数会不会也响应,这样会不会增加负荷?

haijie1223 发表于 2012-4-13 11:07:14

回复 4# yhxhappy


    注册成消息,所以在不操作鼠标的时候也管用,只要前一个窗口的位置变化,这个就会随之变化,至于增补增加负荷,你对比下cpu和内存占用,应该可以忽略不计吧。

qsy666888 发表于 2014-5-11 08:37:48

是标签,不是子窗口

梦倾天下 发表于 2016-9-19 10:50:15

学习了,谢谢
页: [1]
查看完整版本: [已解决] 分辨率改变后,$WS_POPUP 样式的子窗口会与父窗口错位