处理鼠标拖动的正确方法是啥?
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
【讨论】:
以上是关于处理鼠标拖动的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章