标准的鼠标拖放的难题

二进制脑袋 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中也就不能根据拖放到此而响应事件了。
这个两难问题应该是一个标准的鼠标跨窗口拖、放操作遇到的典型问题,请解决过类似问题的朋友提供些帮助。
...全文
100 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
用OLE的drag and drop,可以满足我的要求。自己实现捕获鼠标,改变拖放鼠标的形状,是有困难的。还是用微软系统实现OLE拖放来得漂亮和容易。揭帖了。
回复
引用 5 楼 zgl7903 的回复:
OLE drag and drop
不错,我在网上也搜到要用 OLE drag and drop,研究一下,看看能不能满足我的要求。
回复
zgl7903 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 01-29
引用 2 楼 二进制脑袋 的回复:
[quote=引用 1 楼 gz_qmc 的回复:]窗口有鼠标离开消息,只是需要手动响应而已

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

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

回复
引用 1 楼 gz_qmc 的回复:
窗口有鼠标离开消息,只是需要手动响应而已
对于源窗口Win_S,响应鼠标离开消息是不能满足要求的,因为鼠标离开Win_S,拖放动作还没有结束,鼠标可能在拖动状态下进入Win_D或Win_O,也可能再到Win_S中,只有在鼠标释放(左键弹起),才是拖动事件的结束。
回复
gz_qmc 01-29
窗口有鼠标离开消息,只是需要手动响应而已
回复
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2021-01-29 03:49
社区公告
暂无公告