标准的鼠标拖放的难题

二进制脑袋 2021-01-29 03:49:37
假定有一个源窗口,简称Win_S。要鼠标左键拖动到的目的窗口,简称Win_D。桌面上其它窗口和位置,简称Win_O。鼠标的光标(cursor)形状,如果是进入目的窗口Win_D,光标形状简称为Cursor_OK,如果是其它窗口Win_O(还包括源窗口Win_S),光标形状简称为Cursor_NO,无拖放的正常鼠标光标形状简称为Cursor_Normal。
现在的问题是:拖动发生后,1、如果在Win_S中不捕获鼠标,则Win_S不能检测到鼠标移出Win_S后(包括鼠标到Win_D和Win_O)的鼠标左键释放(弹起)的消息,把光标恢复为Cursor_Normal;2、如果在Win_S中捕获鼠标,这样虽然可以在鼠标左键在任意位置释放(弹起)后恢复光标形状Cursor_Normal,但这种情况下,拖动期间,其它窗口(Win_D和Win_O),则不能响应鼠标消息,Win_D中也就不能根据拖放到此而响应事件了。
这个两难问题应该是一个标准的鼠标跨窗口拖、放操作遇到的典型问题,请解决过类似问题的朋友提供些帮助。
...全文
149 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
二进制脑袋 2021-01-30
  • 打赏
  • 举报
回复
用OLE的drag and drop,可以满足我的要求。自己实现捕获鼠标,改变拖放鼠标的形状,是有困难的。还是用微软系统实现OLE拖放来得漂亮和容易。揭帖了。
二进制脑袋 2021-01-29
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
OLE drag and drop
不错,我在网上也搜到要用 OLE drag and drop,研究一下,看看能不能满足我的要求。
zgl7903 2021-01-29
  • 打赏
  • 举报
回复
二进制脑袋 2021-01-29
  • 打赏
  • 举报
回复
引用 3 楼 gz_qmc 的回复:
[quote=引用 2 楼 二进制脑袋 的回复:][quote=引用 1 楼 gz_qmc 的回复:]窗口有鼠标离开消息,只是需要手动响应而已
对于源窗口Win_S,响应鼠标离开消息是不能满足要求的,因为鼠标离开Win_S,拖放动作还没有结束,鼠标可能在拖动状态下进入Win_D或Win_O,也可能再到Win_S中,只有在鼠标释放(左键弹起),才是拖动事件的结束。[/quote] 你其实需要的是全局变量的操作 而且要重载主框架的PreTranslateMessage来操作 [/quote] 重载主框架的PreTranslateMessage也不见得可行,鼠标拖放的时候,可能会出现移出主框架窗口的范围,即前面的Win_O,此时释放(结束拖动),拖动源窗口仍能响应该释放消息,当然这是一次不成功的拖放。
gz_qmc 2021-01-29
  • 打赏
  • 举报
回复
引用 2 楼 二进制脑袋 的回复:
[quote=引用 1 楼 gz_qmc 的回复:]窗口有鼠标离开消息,只是需要手动响应而已

对于源窗口Win_S,响应鼠标离开消息是不能满足要求的,因为鼠标离开Win_S,拖放动作还没有结束,鼠标可能在拖动状态下进入Win_D或Win_O,也可能再到Win_S中,只有在鼠标释放(左键弹起),才是拖动事件的结束。[/quote]

你其实需要的是全局变量的操作
而且要重载主框架的PreTranslateMessage来操作

二进制脑袋 2021-01-29
  • 打赏
  • 举报
回复
引用 1 楼 gz_qmc 的回复:
窗口有鼠标离开消息,只是需要手动响应而已
对于源窗口Win_S,响应鼠标离开消息是不能满足要求的,因为鼠标离开Win_S,拖放动作还没有结束,鼠标可能在拖动状态下进入Win_D或Win_O,也可能再到Win_S中,只有在鼠标释放(左键弹起),才是拖动事件的结束。
gz_qmc 2021-01-29
  • 打赏
  • 举报
回复
窗口有鼠标离开消息,只是需要手动响应而已

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧