Сообщения мыши, работа с мышью
Отдельно надо рассмотреть работу с мышью. Обычно, когда курсор мыши находится над каким-либо окном, это окно получает сообщения от мыши, причем внешний вид курсора мыши определен при регистрации класса окна - поле .hCursor структуры WNDCLASS. Если мы хотим использовать мышь в нашем приложении, то мы должны обрабатывать некоторые сообщения, посылаемые мышью.
WM_NCHITTEST 0 y & x
При перемещения мыши через область, занятую окном, окно получает сообщения WM_NCHITTEST, которые используются для того, что бы определить месторасположение мыши - на рамке, в углах рамки, на заголовке, во внутренней области и пр. Это должно быть определено при обработке данного сообщения и возвращаемый результат характеризует положение курсора мыши. Например HTCLIENT указывает, что курсор находится над внутренней областью окна, HTTOPLEFT - над верхним левым уголком рамки окна, размеры которого могут быть изменены и пр. Положение курсора указано в координатах экрана.
WM_NCMOUSEMOVE wHitTest y & x
Если WM_NCHITTEST определяет, что курсор находится над внешней областью окна, то окно получает сообщения WM_NCMOUSEMOVE; Y и X координаты заданы относительно экрана.
WM_NCLBUTTONDOWN wHitTest y & x
WM_NCLBUTTONUP wHitTest y & x
WM_NCRBUTTONDOWN wHitTest y & x
WM_NCRBUTTONUP wHitTest y & x
WM_NCMBUTTONDOWN wHitTest y & x
WM_NCMBUTTONUP wHitTest y & x
WM_NCLBUTTONDBLCLK wHitTest y & x
WM_NCRBUTTONDBLCLK wHitTest y & x
WM_NCMBUTTONDBLCLK wHitTest y & x
Эти сообщения посылаются при нажатии/отпускании соответствующих кнопок мыши над внешней областью окна; Положение курсора указано в координатах экрана, wParam указывает зону, над которой произошло данное событие.
WM_MOUSEMOVE nKeys y & x
Когда мышь перемещается во внутренней области окна (WM_NCHITTEST возвратило HTCLIENT) то оконная процедура обрабатывает поступающие сообщения WM_MOUSEMOVE, указывающие положение мыши в координатах окна и состояние некоторых клавиш (ctrl, shift и три кнопки мыши).
WM_LBUTTONDOWN nKeys y & x
WM_LBUTTONUP nKeys y & x
WM_RBUTTONDOWN nKeys y & x
WM_RBUTTONUP nKeys y & x
WM_MBUTTONDOWN nKeys y & x
WM_MBUTTONUP nKeys y & x
Эти сообщения посылаются окну, если Вы нажали одну из кнопок мыши, когда курсор находится над окном. Параметр nKeys указывает состояние некоторых клавиш.
WM_LBUTTONDBLCLK nKeys y&x
WM_RBUTTONDBLCLK nKeys y&x
WM_MBUTTONDBLCLK nKeys y&x
Это сообщения о двух быстрых нажатиях на одну кнопку мыши. Обычно окно их не получает. Если Вы хотите использовать эти сообщения, то Вы должны при регистрации класса окна указать стиль CS_DBLCLKS.
Кроме того надо иметь в виду, что перед сообщением о двойном нажатии на кнопку Вы получите сообщение о первом (одиночном) нажатии. Поэтому надо так распределять действия между одиночными и двойными нажатиями, что бы они не противоречили одно другому. В самом удачном случае двойное нажатие выполняет дополнительную обработку по сравнению с одиночным.
Вы можете легко изменять внешний вид курсора, изменяя его хендл в структуре класса окна:
UINT SetClassWord( hWnd, GCW_HCURSOR, hNewCursor );
однако при этом изменяется курсор для всех окон, принадлежащих к этому классу. ............