前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >无标题栏窗口通过消息模拟拖动窗口时,无法拖动的一个原因

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

作者头像
大菊观
发布2024-07-31 10:06:19
1000
发布2024-07-31 10:06:19
举报
文章被收录于专栏:专业duilib使用+业余界面开发

        在使用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来处理。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档