При движении мыши по рабочей области окна, Windows не вырабатывает сообщение WM_MOUSEMOVE для всех возможных положений мыши.
- Количество сообщений WM_MOUSEMOVE зависит от устройства мыши и скорости, с которой оконная процедура может обрабатывать сообщения о движении мыши.
Если пользователь щелкнет кнопкой мыши в рабочей области неактивного окна,Windows сделает активным окно, в котором был произведен щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN.
- Если приложение получает сообщение WM_LBUTTONDOWN, то ономожет уверенно считать, что в данный момент его окно активно.
Однако
- Оконная процедура может получить сообщение WM_LBUTTONUP, не получив вначале сообщения WM_LBUTTONDOWN. Это может случиться, если кнопка мыши нажимается в одном окне, мышь перемещается в другое окно, и кнопка отпускается.
Аналогично,
- Оконная процедура может получить сообщение WM_LBUTTONDOWN без соответствующего ему сообщения WM_LBUTTONUP, если кнопка мыши отпускается во время нахождения мыши в другом окне.
В этих правилах есть исключения:
- Оконная процедура может захватить мышь (capture the mouse) и продолжать получать сообщения мыши, даже если она находится вне рабочей области окна.
- Если системное модальное окно сообщений или системное модальное окно диалога находится на экране, никакая другая программа не может получать сообщения от мыши.
Обработка нажатия клавиш <Shift> и <Ctrl> и кнопок мыши
- При получении сообщений мыши, связанных с рабочей областью окна, через параметр wParam передается значение, позволяющее определить, были ли одновременно с этим нажаты кнопки мыши или клавиши <Shift> и <Ctrl> клавиатуры.
Например, если обработка должна зависеть от состояния клавиш <Shift> и <Ctrl>, то приложение могло бы воспользоваться следующей логикой:
UINT fwKeys = wParam; // состояние кнопок мыши if(MK_SHIFT & fwKeys) { if(MK_CONTROL & fwKeys) { /* нажаты клавиши <Shift> и <Ctrl> */ } else { /* нажата клавиша <Shift> */ } } else { if(MK_CONTROL & fwKeys) { /* нажата клавиша <Ctrl> */ } else { /* клавиши <Shift> и <Ctrl> не нажаты */ } }Функция GetKeyStateтакже может возвращать состояние кнопок мыши или клавиш <Shift> и <Ctrl>, используя виртуальные коды клавиш VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_SHIFT и VK_CONTROL. При нажатой кнопке или клавише возвращаемое значение функции GetKeyState отрицательно.
- Функция GetKeyState возвращает состояние кнопки мыши и клавиши в связи с обрабатываемым в данный момент сообщением, т.е. информация о состоянии должным образом синхронизируется с сообщением.
Дата добавления: 2017-01-26; просмотров: 1267;