Обробка повідомлень від миші

Визначити наявність миші в системі можна за допомогою функції
GetSystemMetrics, передавши їй як параметр значення
SM_MOUSEPRESENT Якщо миша є, ця функція повертається не
нульове значення Для визначення кількості кнопок миші можна
використовувати виклик GetSystemMetrics   з параметром

SMCMOUSEBUTTONS

Коли користувач переміщує миша, Windows переміщує по екрану растрову картинку, яка називається курсор миші (mouse cursor) Курсор миші має вершину (hot spot) розміром в один піксель, точно який вказує положення миші на екрані

Ресурси Windows містять кілька курсорів миші, які можуть використовуватися в додатках Найбільш типовим курсором є похила стрілка, яка називається IDCARROW (вершина курсора вістрі стрілки) Курсор, у вигляді перехрестя (IDCCROSS) має гарячу точку в центрі хрестоподібного шаблону Курсор IDCWAIT у вигляді пісочного годинника зазвичай використовується для індикації того, що програма чимось зайнята

Кнопки трьохкнопковою миші позначаються абревіатурами LBUTTON, MBUTTON і RBUTTON

Посилка повідомлень від миші і від клавіатури розрізняються Віконна функція отримує повідомлення миші, коли миша проходить через вікно, при клацанні всередині вікна, навіть якщо вікно не активне або не має фокусу введення Якщо миша переміщається по клієнтській області вікна, то генерується повідомлення WMMOUSEMOVE Якщо кнопка ми-ши натискається або відпускається всередині клієнтської області, то віконна процедура отримує такі повідомлення:

WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN-одноразове натиснення лівої, середньої чи правої кнопки, WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP відпускання лівої, середньої чи правої кнопки, WMLBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK подвійне клацання лівою, середньої чи правої кнопки

Для всіх цих повідомлень значення параметра lParam містить положення миші, причому в молодшому слові знаходиться значення координати X, а в старшому слові – значення координати Y від лівого верхнього кута клієнтської області вікна Ці значення можна витягти з lParam за допомогою макросів LOWORD і HI WORD Значення пара-метра wParam показує стан кнопок миші і клавіш Shift і Ctrl Можна перевірити параметр wParam за допомогою бітових масок, визначених у заголовних файлах:

MKLBUTTON ліва кнопка натиснута

MKRBUTTON права кнопка натиснута

MKMBUTTON середня кнопка натиснута

MKSHIFT клавіша Shift натиснута

MKCONTROL клавіша Ctrl натиснута

Стан кнопок миші або клавіш Shift і Ctrl можна отримати також за допомогою функції GetKeyState

При обробці подвійного клацання миші слід зазначити, що вікно отримуватиме повідомлення про подвійне клацання тільки якщо стиль відповідного класу вікна містить прапор CSDBLCLKS Тому перед реєстрацією класу вікна потрібно присвоїти полю style структури WNDCLASS значення, що включає цей прапор

Для миші з колесом при натисканні на колесо Windows генерує такі ж повідомлення, які виробляються при натисканні середньої кнопки трьохкнопковою миші Прокрутка колеса призводить до генерації повідомлення WMMOUSEWHEEL Якщо потрібно обробити прокрутку колеса, то рекомендується підключити файл ztnouseh Молодша частина параметра wParam повідомлення WMMOUSEWHEEL показує стан кнопок і клавіш Shift і Ctrl Старша частина wParam містить значення, яке відображає відстань, пройдену колесом Воно розраховується як кількість кроків колеса при прокручуванні, помножене на коефіцієнт WHEELDELTA У файлі zmouseh цей коефіцієнт дорівнює 120

У Windows для миші визначений набір з 21 повідомлення Однак 11 з цих повідомлень не відносяться до клієнтської області, і програми для Windows зазвичай ігнорують їх

Кількість посилок повідомлення WMMOUSEMOVE залежить від пристрою миші і швидкості, з якою віконна функція може обробляти повідомлення про рух миші Якщо миша виявляється поза клієнтської області вікна, але все ще всередині вікна, то Windows посилає віконної процедури повідомлення миші, повязані з некліентской областю, що включає заголовок, меню, рамку і смуги прокрутки

Повідомлення миші для некліентской області містять в назвах букви NC, що означає некліентская (nonclient) Наприклад, якщо миша переміщується всередині некліентской області вікна, то віконна функція отримує повідомлення WMNCMOUSEMOVE Однак пара-метри wParam і lParam для таких повідомлень, повязаних з некліентской областю, мають інший зміст: Параметр wParam показує зону некліентской області, в якій відбулося переміщення або клацання Його значення збігається з одним із ідентифікаторів, що починаються з НТ, що означає тест влучення (hit-test) Повідомлення тесту попадання будуть розглянуті нижче

Параметр lParam містить в молодшому слові значення координати X, а в старшому Y Однак ці координати є координатами відносно початку екрану, а не щодо початку клієнтської області Значення координат X і Y верхнього лівого кута екрану рівні 0

Додаток може перетворити екранні координати в координати клієнтської області вікна і навпаки за допомогою функцій Windows ScreenToClient і ClientToScreen

Повідомлення WMNCHITTEST (тест попадання в неробочу область nonclient hit-test) передує всім іншим повідомленнями миші клієнтської і некліентской області Параметр lParam містить значення X і Y екранних координат положення миші Параметр wParam не використовується

У додатках Windows це повідомлення зазвичай передається в DefWindowProc У цьому випадку Windows використовує повідомлення WMNCHITTEST для вироблення всіх інших повідомлень на основі положення миші

Для повідомлень миші некліентской області повертається значення функції DefWindowProc при обробці повідомлення WMNCHITTEST передається як параметр wParam в повідомленні ми-ши

Якщо функція DefWindowProc після обробки повідомлення WMNCHITTEST повертає значення HTCLIENT, то Windows перетворює екранні координати в координати клієнтської області і виробляє повідомлення миші клієнтської області

Розглянуті вище повідомлення додаток отримує у випадках, коли курсор миші знаходиться в клієнтській або в некліентской області вікна Але іноді додатком може знадобитися отримувати повідомлення від миші навіть у випадках, коли курсор миші знаходиться поза вікна Якщо це необхідно зробити, то додаток може провести захоплення (capture) миші

Захоплення миші здійснюється за допомогою функції SetCapture Після виклику цієї функції, Windows посилає всі повідомлення миші у віконну функцію того вікна, чий дескриптор вікна був переданий у функцію SetCapture Поки миша захоплена, системні функції клавіатури теж не діють

Повідомлення миші в захопленому стані завжди залишаються повідомленнями клієнтської області, навіть якщо миша виявляється не в клієнтській області вікна Параметр lParam, однак, показує положення миші в координатах клієнтської області Ці координати, однак, можуть стати негативними, якщо миша виявиться лівіше або вище клієнтської області

Звільнити мишу можна за допомогою функції ReleaseCapture

При обробці повідомлень від миші слід зазначити, що якщо системне модальне вікно повідомлень або системне модальне вікно діалогу знаходиться на екрані, ніяка інша програма не може отримувати повідомлення від миші

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*