当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙应用框架开发【基于原生能力的无障碍模式】
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • 基于Deap遗传算法在全量可转债上做因子挖掘(附python代码及全量因子数据)
  • 《计算机网络》(学习笔记)
  • redis面试(三)Hash数据结构
  • Linux--Socket编程TCP
  • LIMS实验室管理系统的三大分类
  • Python自学第五天
  • 计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战
  • 【C++】用Lua绑定C/C++对象,实现对脚本调用(依赖LuaBridge实现)
  • Hello 算法:动画图解、一键运行的数据结构与算法教程
  • MySQL的面试题,从简单到困难三道题目
  • 【计算机网络】DHCP实验
  • Windows下编译安装Kratos
  • 用Python来DIY一个AI面部情绪识别API的简单方案
  • AWS实战 - 利用IAM对S3做访问控制
  • Babel配置的不完全指南
  • docker容器内的网络抓包
  • echarts的各种常用效果展示
  • Github访问慢解决办法
  • go语言学习初探(一)
  • Mac转Windows的拯救指南
  • QQ浏览器x5内核的兼容性问题
  • React+TypeScript入门
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 安装python包到指定虚拟环境
  • 从零开始的无人驾驶 1
  • 从零开始在ubuntu上搭建node开发环境
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端面试题总结
  • 什么软件可以剪辑音乐?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • nb
  • 从如何停掉 Promise 链说起
  • ​Java并发新构件之Exchanger
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #if 1...#endif
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Java入门)抽象类,接口,内部类
  • (void) (_x == _y)的作用
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (转)大型网站架构演变和知识体系
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)重识new
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ./configure、make、make install 命令
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 4.0中的泛型协变和反变
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET中分布式服务