处理鼠标拖动的正确方法是什么

What is the proper way of handling a mouse drag?

本文关键字:方法 是什么 鼠标 拖动 处理      更新时间:2023-10-16

我需要实现鼠标拖动事件,它看起来像这样:

class MouseDragEvent
{
public:
   uint m_btn;
   uint m_x, m_y;
   uint m_delta_x, m_delta_y;
};

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

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

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

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

如果您想协调处理delta-x和delta-y,那么处理按钮关闭和按钮打开消息是合适的。

你试过这个吗:http://www.codeproject.com/KB/miscctrl/rdragdropfiles.aspx

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