同步移动两个窗口(保证窗口的相对位置一起移动)

Prerequisite:C++ developer

作者:收割者

有时候,我们开发一个软件,有两个或是多个窗口,我们希望能够移动主窗口的同时,别的窗口同步移动,或是如果我们编写的一个窗口,没有边框,那么这个时候,就要我们自己来处理窗口的移动问题。其实这很简单,就是一个坐标换算的问题。
首先来讲讲两个桌面窗口,当移动主窗口的时候,两个窗口同时移动,并保持相对位置不变,两个窗口如下:


大的这个窗口上还有一个按钮,这个按钮我们选中它,然后按下鼠标左键的同时移动鼠标,这个按钮就可以随鼠标一起移动。左右两个大窗口,当鼠标放到大窗口的客户区按下鼠标左键并移动的时候,两个窗口将同时移动,并保持相对位置。我试了一下,实现在大窗口的非客户,按下鼠标左键并移动,只能移动大窗口。为什么呢,因为在非客户区是由系统管理的。即使你响应WM_NCLBUTTONDWON ,WM_NCMOUSEMOVE等等鼠标消息也是一样。当你在非客户区按下鼠标左键并移动的时候,用spy++查看发送的消息,是WM_MOUSEMOVE HitTest是CAPTION。但是这并不是我们自己的WM_MOUSEMOVE消息并不能捕捉。因为我们响应的WM_MOUSEMOVE消息是响应客户区的。因此,在非客户去只能移动本窗口。本博客只说明了在主窗口的客户区按下鼠标并移动窗口时移动与之对应的另一个窗口。

其实原理就是计算出鼠标按下的时候,各个要移动的窗口的屏幕坐标与鼠标的屏幕坐标的相对位置。当我们在WM_MOUSEMOVE中响应的时候,通过鼠标的屏幕坐标计算出要移动的窗口的新的位置,并调用MoveWindow移动它。

另外,要注意的是,当我们按下鼠标左键的时候,调用SetCapture函数,来捕捉鼠标,将鼠标锁定在当前窗口。这样一来,即使鼠标移出了本窗口,这个窗口依然能够收到鼠标消息。在左键弹起的的时候,调用ReleaseCapture函数,释放捕捉。

下面再讲讲大窗口中的那个按钮,也实现了当鼠标在上面按下并移动的时候,这个按钮窗口就可以随着鼠标一起移动。道理和上面讲的一样,只是有一点,那就是,按钮的坐标系和刚才的窗口不同,上面讲的大小两个并排的窗口都是以屏幕为坐标系,坐标系一致,但是按钮确不同,按钮窗口的坐标系是它的父窗口,也就是这个对话框的客户区的坐标系。但是我们计算按钮与鼠标的相对位置的时候,仍然是以屏幕坐标系为坐标系。因此,在这里,当我们通过相对位置计算按钮随着鼠标移动新位置以后,我们获取其父窗口对象指针,并调用其ScreenToClient将按钮的屏幕坐标转换为对话框的客户区坐标。这样一来就可以实现移动按钮的功能了。

本文的代码:http://download.csdn.net/detail/xinzhiyounizhiyouni/7153667

另外推荐阅读地址:http://www.panshy.com/article/Sort_Desktop/UI/2014-04-07/2472.php

除了CSDN博客和我推荐的地址,别的网站出现该文章均为非法盗用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值