无标题栏窗口通过消息模拟拖动窗口时,无法拖动的一个原因

        在使用DUI库或者web控件来做窗口和UI时,常常遇到一个问题:整个窗口如果设置了CAPTION区域,那么在CAPTION区域中,web页面的内容无法正常响应鼠标事件,如果不设置CAPTION区域,那么对于窗口的拖动又有影响。在这种情况话,我们优先选择不设置CAPTION,然后通过模拟拖动的行为来实现拖动窗口。

常见的方法有两种:

一、MoveWindow,这种比较简单以web为例,c++只需要提供一个供js调用的函数,或者接受JS发来的消息,在消息里面去判断鼠标偏移,并且MoveWindow窗口即可。

简单来讲,就是js里面监听对应元素的mousemove事件,然后判断鼠标是按下状态,就调用c++代码(或者通知c++),把js里面event.movementX和event.movementY也顺便带给c++,c++里面去移动窗口即可。(movementX和movementY就是offset)

这种弊端就是跟随有延迟,快速拖动可能导致鼠标移出了窗口范围,窗口就没能很好的跟随鼠标。

二、PostMessage(HWND, WM_NCLBUTTONDOWN, HTCAPTION,0);这种就直接了,发消息告知系统鼠标在CAPTION区域按下了。然后系统的defwindowproc里面会自行处理拖动相关的。

简单来讲,类似第一种,仍然是js来监听并通知C++,但是c++里面是通过发送WM_NCLBUTTONDOWN消息来实现的。也不需要offset之类的数据。而且跟随窗口跟随的也很完美。就像点标题栏拖动窗口的手感一样。

但是,第二种方法我在win32窗口,mfc窗口等里面进行测试,在这些窗口的CLIENT区域去发送消息,完全没有问题,可以正常拖动。我把它用于webview窗口,由网页的js回调C++(我采用的回调),c++再去发送消息,消息也收到了,但是无论如何就是无法拖动!通过分析发现,在PostMessage(HWND, WM_NCLBUTTONDOWN, HTCAPTION,0);之前,需要ReleaseCapture();一下。我猜测原因应该是webview之类的把后续消息给吞了,通过在回调里面释放对鼠标的捕获,让鼠标消息能正常的被window的defwindowproc来处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值