Какие сообщения принимает окно приложения Windows, когда пользователь перемещает мышь с нажатой левой клавишей?

Рейтинг: 1Ответов: 1Опубликовано: 26.04.2015

Скажите, пожалуйста, какие сообщения принимает окно приложения Windows, когда пользователь нажал левую клавишу мыши и перемещает мышь с нажатой левой клавишей? И какое сообщение получит окно, когда пользователь отпустил левую клавишу мыши? Как вообще в приложении Visual C++ определить ситуацию, что пользователь перемещает мышь, удерживая её левую клавишу в нажатом состоянии?

Ответы

▲ 1

Смотря где происходит событие.

Если внутри окна — то WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP.

Если в non-client area, то WM_ENTERSIZEMOVE, WM_MOVING/WM_MOVE (в зависимости от системы), WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED и WM_EXITSIZEMOVE.


Если вам нужен drag'n'drop, тут есть различные случаи. Если вы таскаете свои собственные контролы в одном окне, то можно обойтись «малой кровью». Делается примерно так:

  1. На WM_LBUTTONDOWN, если вы ещё не в режиме перетаскивания, и находитесь в нужном месте, переходите в режим перетаскивания. (Может быть, достаточно булевого флага.) Не забудьте mouse capture, чтобы event'ы приходили даже если мышь уйдёт за окно.
  2. На WM_LBUTTONUP, если вы были в режиме перетаскивания, отпускайте capture и выполняйте Drop.
  3. На WM_MOUSEMOVE, если вы в режиме перетаскивания, выставьте соответствующий курсор, и отрисуйте контрол в новом месте, если в это место можно перетаскивать. Если перетаскивать нельзя, выставьте запрещающий курсор. Также можете подсветить drop target, например. Если надо (например, курсор упирается в стенку), отскроллируйте view.
  4. У вас может потеряться mouse capture (например, пользователь может переключиться в другое приложение), это надо корректно обрабатывать. На WM_CAPTURECHANGED, если вы в режиме перетаскивания, корректно закройте этот режим.

(Вот подробнее на английском и с MFC.)

В случае, если вам нужно таскать, например, файлы, или что-нибудь из другого приложения, придётся включать тяжёлую артиллерию в виде OLE. Вот статья с достаточно подробным описанием. А также каноническое описание от Microsoft.