找回密码
 加入
搜索
查看: 7098|回复: 15

[GUI管理] [已解决]如何获得窗口被拖动的消息?

 火.. [复制链接]
发表于 2010-8-17 18:26:24 | 显示全部楼层 |阅读模式
本帖最后由 雨林GG 于 2010-8-17 21:02 编辑

如何获得窗口被拖动的消息?

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-8-17 18:51:52 | 显示全部楼层
本帖最后由 xsjtxy 于 2010-8-17 19:08 编辑

不是很科学。但是力所能及。。。无奈啊。
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 633, 454, 192, 114,$WS_MAXIMIZEBOX+$WS_MINIMIZEBOX)
GUISetState(@SW_SHOW)

$a = WinGetPos($Form1)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                case $GUI_EVENT_PRIMARYUP
                        $b = WinGetPos($Form1)
                        if $a[0] <> $b[0] or $a[1] <> $b[1] then
                        msgbox(0,"","窗口被移动过")
                        endif
                        $a = WinGetPos($Form1)
                case $GUI_EVENT_MAXIMIZE
                        $a = WinGetPos($Form1)
                case $GUI_EVENT_RESTORE
                        $a = WinGetPos($Form1)
        EndSwitch
WEnd

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-8-17 19:08:37 | 显示全部楼层
2#的是一种方法,也可以注册WM_MOVING消息。

评分

参与人数 1金钱 +20 收起 理由
雨林GG + 20 心意一下!

查看全部评分

 楼主| 发表于 2010-8-17 20:03:30 | 显示全部楼层
我的主循环主要实时接收TCP/UDP信息,而其他窗体全都用的事件模式,不想添加到主循环中了!先谢谢xsjtxy !
关于注册消息事件,俺是一窍不通! 哪儿有WM_MOVING的实例啊!? 先论坛找找去!谢谢P版 !
发表于 2010-8-17 20:21:13 | 显示全部楼层
GUICreate('')
GUISetState()

GUIRegisterMsg(0x216, 'WM_MOVING')

While GUIGetMsg() + 3
        ToolTip('')
WEnd

Func WM_MOVING()
        ToolTip('窗口正在移动')
EndFunc   ;==>WM_MOVING

评分

参与人数 1金钱 +20 收起 理由
雨林GG + 20 感谢您的多次帮助 !

查看全部评分

 楼主| 发表于 2010-8-17 20:52:39 | 显示全部楼层
谢谢 Afan

真是热心人 !
 楼主| 发表于 2010-8-17 21:00:43 | 显示全部楼层
OK,这个问题暂时解决! 下一步想得到窗体被托动后的位置!  继续去想办法了!
发表于 2010-8-17 21:02:55 | 显示全部楼层
回复 7# 雨林GG


    位置用 WinGetPos() 不就行了?
 楼主| 发表于 2010-8-17 21:06:22 | 显示全部楼层
回复 8# afan

可是要等托动窗体后,也就是松开鼠标才能用WingetPOS啊!
发表于 2010-8-17 21:08:59 | 显示全部楼层
WM_MOVING的lparam就是RECT指针,记录着XY坐标、宽度、高度信息,相当于WinGetPos。

评分

参与人数 1金钱 +30 贡献 +5 收起 理由
afan + 30 + 5 学习了

查看全部评分

 楼主| 发表于 2010-8-17 21:11:29 | 显示全部楼层
回复 10# pusofalse

多谢您的关注 !
发表于 2010-8-17 21:38:03 | 显示全部楼层
拖动窗口松开鼠标时,会发送WM_EXITSIZEMOVE (0x232) 消息,这个消息的wparam和lparam都是0,没有意义的2个参数,在消息函数中调用WinGetPos。
发表于 2010-8-17 22:36:41 | 显示全部楼层
Global Const $tagRECT = 'int;int;int;int'
GUICreate('')
GUISetState()
GUIRegisterMsg(0x216, 'WM_MOVING')

While GUIGetMsg() + 3
        ToolTip('')
WEnd

Func WM_MOVING($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tBuffer, $L, $T, $R, $B
        $tBuffer = DllStructCreate($tagRECT, $ilParam)
        $L = DllStructGetData($tBuffer, 1)
        $T = DllStructGetData($tBuffer, 2)
        $R = DllStructGetData($tBuffer, 3)
        $B = DllStructGetData($tBuffer, 4)
        ToolTip('当前窗口位置:X = ' & $L & ', Y = ' & $T & ', W = ' & $R - $L & ', H = ' & $B - $T)
        $tBuffer = 0
EndFunc   ;==>WM_MOVING

评分

参与人数 1金钱 +20 贡献 +10 收起 理由
pusofalse + 20 + 10

查看全部评分

发表于 2011-5-2 10:15:12 | 显示全部楼层
good example.thanks!!!!!!!!!!!!
发表于 2011-8-14 14:37:33 | 显示全部楼层
谢谢。学习了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 15:39 , Processed in 0.090323 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表