Смотря где происходит событие.
Если внутри окна — то WM_LBUTTONDOWN
, WM_MOUSEMOVE
, WM_LBUTTONUP
.
Если в non-client area, то WM_ENTERSIZEMOVE
, WM_MOVING
/WM_MOVE
(в зависимости от системы), WM_WINDOWPOSCHANGING
, WM_WINDOWPOSCHANGED
и WM_EXITSIZEMOVE
.
Если вам нужен drag'n'drop, тут есть различные случаи. Если вы таскаете свои собственные контролы в одном окне, то можно обойтись «малой кровью». Делается примерно так:
- На
WM_LBUTTONDOWN
, если вы ещё не в режиме перетаскивания, и находитесь в нужном месте, переходите в режим перетаскивания. (Может быть, достаточно булевого флага.) Не забудьте mouse capture, чтобы event'ы приходили даже если мышь уйдёт за окно.
- На
WM_LBUTTONUP
, если вы были в режиме перетаскивания, отпускайте capture и выполняйте Drop.
- На
WM_MOUSEMOVE
, если вы в режиме перетаскивания, выставьте соответствующий курсор, и отрисуйте контрол в новом месте, если в это место можно перетаскивать. Если перетаскивать нельзя, выставьте запрещающий курсор. Также можете подсветить drop target, например. Если надо (например, курсор упирается в стенку), отскроллируйте view.
- У вас может потеряться mouse capture (например, пользователь может переключиться в другое приложение), это надо корректно обрабатывать. На
WM_CAPTURECHANGED
, если вы в режиме перетаскивания, корректно закройте этот режим.
(Вот подробнее на английском и с MFC.)
В случае, если вам нужно таскать, например, файлы, или что-нибудь из другого приложения, придётся включать тяжёлую артиллерию в виде OLE. Вот статья с достаточно подробным описанием. А также каноническое описание от Microsoft.