【问题标题】: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 的变化。有没有拖动消息或更好的方法?

【问题讨论】:

    标签: c++ windows


    【解决方案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】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2014-09-23
      • 2010-10-08
      • 2013-07-24
      • 2011-12-04
      相关资源
      最近更新 更多