【发布时间】: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 的变化。有没有拖动消息或更好的方法?
【问题讨论】:
我需要实现如下所示的鼠标拖动事件:
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 处理程序调用此函数。
【讨论】:
WM_LBUTTONDOWN 中打电话给SetCapture 吗?还是会破坏双击识别?事实上,我认为你应该这样做,否则从边界附近(SM_CXDRAG 之内)开始拖动可能不起作用。
DragDetect,这听起来像是一个模态消息循环。在使用它之前要非常小心。 (即研究后果)
Windows 中有拖放 API(例如 RegisterDragDrop),但关注的是起始窗口和终止窗口(通常在不同的应用程序中),而不是坐标。
如果你想处理 delta-x 和 delta-y 协调,那么处理 button down 和 button up 消息是合适的。
【讨论】: