Как правильно обрабатывать перетаскивание мышью? - PullRequest
6 голосов
/ 26 мая 2011

Мне нужно реализовать события перетаскивания мышью, которые выглядят примерно так:

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

Я думаю, мне нужно будет проверить сообщения WM_LBUTTONDOWN и WM_LBUTTONUP и вручную найти изменения в x и y.Есть ли сообщение о перетаскивании или лучший способ?

Ответы [ 3 ]

7 голосов
/ 26 мая 2011

Начните с обнаружения WM_LBUTTONDOWN. Запишите начальные координаты, где была нажата кнопка мыши. Проверьте для WM_MOUSEMOVE, и когда мышь переместилась за пределы прямоугольника, определенного с помощью GetSystemParameters(SM_CXDRAG) и GetSystemParameters(SM_CYDRAG), используйте SetCapture для захвата мыши. На этом этапе продолжайте отвечать на WM_MOUSEMOVE и проверьте на WM_LBUTTONUP. Вы можете изменить курсор мыши в этой точке. Также проверьте для WM_CAPTURECHANGED, что означает, что перетаскивание было прервано. После завершения перетаскивания позвоните ReleaseCapture.

Редактировать: Большая часть этого процесса может быть автоматизирована с помощью функции DragDetect. Вызовите эту функцию из обработчика WM_LBUTTONDOWN.

0 голосов
/ 26 мая 2011

Вы пробовали это: http://www.codeproject.com/KB/miscctrl/rdragdropfiles.aspx

Это также может быть полезно: http://msdn.microsoft.com/en-us/magazine/cc163915.aspx

0 голосов
/ 26 мая 2011

В Windows есть API-интерфейсы перетаскивания (например, RegisterDragDrop), но они связаны с окнами «из» и «в» (часто в разных приложениях), а не с координатами.

Если вы хотите иметь дело с координированными дельта-х и дельта-у, то обработка сообщений «вниз» и «вверх» подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...