处理鼠标拖动的正确方法是啥?

Posted

技术标签:

【中文标题】处理鼠标拖动的正确方法是啥?【英文标题】:What is the proper way of handling a mouse drag?处理鼠标拖动的正确方法是什么? 【发布时间】:2011-05-26 16:52:50 【问题描述】:

我需要实现如下所示的鼠标拖动事件:

class MouseDragEvent

public:
   uint m_btn;
   uint m_x, m_y;
   uint m_delta_x, m_delta_y;
;

我想我需要检查 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息并手动查找 x 和 y 的变化。有没有拖动消息或更好的方法?

【问题讨论】:

【参考方案1】:

首先检测WM_LBUTTONDOWN。记录按下鼠标按钮的起始坐标。检查WM_MOUSEMOVE,当鼠标移出由GetSystemParameters(SM_CXDRAG)GetSystemParameters(SM_CYDRAG) 确定的矩形时,使用SetCapture 捕获鼠标。此时继续回复WM_MOUSEMOVE 并检查WM_LBUTTONUP。此时您可能想要更改鼠标光标。还要检查WM_CAPTURECHANGED,这意味着拖动已中止。拖动完成后调用ReleaseCapture

编辑:这个过程的大部分可以通过DragDetect 函数自动化。从 WM_LBUTTONDOWN 处理程序调用此函数。

【讨论】:

你不能在WM_LBUTTONDOWN 中打电话给SetCapture 吗?还是会破坏双击识别?事实上,我认为你应该这样做,否则从边界附近(SM_CXDRAG 之内)开始拖动可能不起作用。 @Ben Voigt,我认为你是对的。自从我不得不这样做已经有一段时间了,我只是凭记忆工作。 WRT DragDetect,这听起来像是一个模态消息循环。在使用它之前要非常小心。 (即研究后果) 应该记住,即使是窗口本身的定期释放也会触发 WM_CAPTURECHANGED。【参考方案2】:

Windows 中有拖放 API(例如 RegisterDragDrop),但关注的是起始窗口和终止窗口(通常在不同的应用程序中),而不是坐标。

如果你想处理 delta-x 和 delta-y 协调,那么处理 button down 和 button up 消息是合适的。

【讨论】:

【参考方案3】:

您是否尝试过: http://www.codeproject.com/KB/miscctrl/rdragdropfiles.aspx

这也可能有帮助: http://msdn.microsoft.com/en-us/magazine/cc163915.aspx

【讨论】:

以上是关于处理鼠标拖动的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

通过拖动鼠标滚动图像

动作脚本鼠标滚动/鼠标拖动

在 jquery drop UI 中,如何使用正确的鼠标位置将拖动元素克隆到放置位置?

在用鼠标拖动窗口时有阴影怎么办

如何区分鼠标“点击”和“拖动”

xshell拖动上传鼠标显示禁用