Megatutorial 3.3 - Mysz i klawiatura.pdf

(739 KB) Pobierz
Od zera do gier kodera
3
MYSZ I KLAWIATURA
Wiele rzeczy wymyślono po to,
aby nie trzeba było dużo myśleć.
Regedit
Tytułowe dwa urządzenia wejściowe (ang. input devices ) są najintensywniej
wykorzystywanymi środkami do komunikacji użytkownika z komputerem. Historycznie
starsza jest klawiatura, jednak obecnie oba te sprzęty wzajemnie się uzupełniają, a
obsługa większości dobrych programów może być realizowana przy pomocy każdego z
nich.
Powstało naturalnie mnóstwo innych urządzeń wejściowych, do których należą choćby
joysticki czy tablety graficzne. Coraz więcej mówi się też o sterowaniu aplikacjami za
pomocą komend głosowych. Wydaje się jednak, że nawet jeśli ten nowe interfejsy
komunikacyjne zostaną w przyszłości udoskonalone, to tradycyjne klawiatury i myszki
(albo ich zastępniki, np. trackballe ) nigdy nie odejdą całkiem do lamusa. Praca z nimi jest
po prostu szybka i wygodna, a nadto dyskretna - i chyba nie zmienią tego żadne
nadchodzące nowniki. Klawiatury zyskają oczywiście więcej klawiszy, myszki - więcej
przycisków i rolek, ale zasadnicze przeznaczenie i wykorzystanie obu tych urządzeń
będzie przez cały czas takie same.
Skoro więc są one dzisiaj podstawową metodą porozumienia się użytkownika z
komputerem, nowoczesny system operacyjny w rodzaju Windows musi zapewniać
właściwą obsługę klawiatury i myszy. I rzeczywiście, środowisko aplikacji rodem z
Microsoftu daje bodaj wszystko, co jest potrzebne, by programista mógł zaoferować
użytkownikom swych produktów pełną współpracę z możliwościami tych dwóch
kluczowych urządzeń. Ta kooperacja jest realizowana w ramach Windows API, którego
część za to odpowiedzialną poznamy bliżej w tym oto rozdziale.
Obsługa myszy
Mysz jest urządzeniem wskazującym (ang. pointing device ), którego przeznaczeniem
jest współpraca z graficznym interfejsem użytkownika. Nie ma ono większego
zastosowania w konsoli tekstowej, gdzie prym cały czas wiedzie (i musi wieść) klasyczna
klawiatura.
Każda osoba posługująca się komputerem wie oczywiście, w jaki sposób działa myszka.
Nie wszyscy jednak wiedzą, że nie jest ona jedynym możliwym urządzeniem, za pomocą
którego można sterować kursorem na ekranie. Do innych należy chociażby trackball ; jego
obsługa polega na umiejętnym poruszaniu kulką, której obroty powodują ruch kursora na
ekranie. Urządzenie to ma sporą zaletę w postaci braku konieczności posiadania
specjalnej podkładki i dlatego jest szczególnie często wykorzystywane w komputerach
przenośnych.
Słowo ‘trackball’ weszło już na dobre do słownika komputerowego i nikt już nawet nie
próbuje go tłumaczyć. Ale jeszcze kilka lat można było okazjonalnie spotkać wyjątkowo
idiotyczne określenie dla tego urządzenia: otóz nazywano je kotem, chcąc je rzekomo
20082936.018.png
424
odróżnić od standardowej myszki. Wyjaśnienie to jest raczej dziwne, bo chociaż
komputerowa mysz może faktycznie budzić skojarzenia z pospolitym gryzoniem, to
przecież trackball nie różni się od niej prawie wcale. Słusznie więc zdaje się, że obecność
jednego komputerowego zwierzęcia w zupełności nam wystarczy.
Fotografia 3 i 4. Komputerowe urządzenia wskazujące: myszka oraz trackball
(fotografie pochodzą z serwisu internetowego firmy Logitech )
Jako przyjazny system operacyjny Windows zawiera naturalnie odpowiednią obsługę
urządzeń wskazujących - niezależnie od tego, czym one są. W WinAPI przyjęło się
aczkolwiek nazywać je wszystkie myszami, ponieważ tak jest po prostu wygodniej. My
również będziemy tak wobec tego czynić.
W tym podrozdziale zajmiemy się więc tą częścią Windows API, która umożliwia
programom okienkowym wykorzystanie obecności myszy. Poznamy wpierw wszystkie
najważniejsze komunikaty o zdarzeniach myszy oraz reguły ich otrzymywania przez
okna. Później nauczymy się odczytywać stan myszy bezpośrednio, a nawet symulować
jego zmianę. Na sam koniec zostawimy sobie odczytywanie różnorakich parametrów
myszy.
Zdarzenia myszy
System Windows posługuje się łącznie kilkudziesięcioma (!) komunikatami o zdarzeniach
pochodzących od myszy. Spośród tej mnogości najważniejszych jest dla nas kilkanaście,
informujących przede wszystkim o wciśnięciu lub puszczeniu któregoś z przycisków
myszy, ruchu kursora lub też zmianie pozycji rolki (jeżeli jest obecna). Tymi właśnie
komunikatami zajmiemy się w tej sekcji.
One wszystkie posiadają przynajmniej jedną przyjemną cechę, związaną ze swymi
parametrami wParam i lParam . Otóż znaczenie tych parametrów jest dla wymienionych
zdarzeń zawsze takie samo: zmienne te zawierają mianowicie aktualną pozycję kursora
myszy oraz informację o tym, czy pewne klawisze są w danej chwili wciśnięte.
Pierwsza z tych danych zawarta jest w lParam . Pozioma i pionowa współrzędna kursora
jest w niej zapisana w dolnym i górnym słowie tej 32-bitowej wartości. Aby je uzyskać,
możemy zatem posłużyć się poznanymi makrami LOWORD() oraz HIWORD() . Windows API
deklaruje też dwa bardziej wyspecjalizowane makra:
nX = GET_X_LPARAM(lParam);
nY = GET_Y_LPARAM(lParam);
Jak wskazują ich nazwy, służą one właśnie do pobrania pozycji kursora z parametru
lParam . Aby z nich skorzystać, trzeba jeszcze dołaczyć nagłówek windowsx.h :
#include <windowsx.h>
20082936.019.png 20082936.020.png 20082936.021.png
425
Istnieje również makro MAKEPOINTS() , które zmienia lParam w strukturę POINTS - bardzo
podobną do poznanej wcześniej POINT , ale z polami typu SHORT (16-bitowymi).
Z kolei wParam zawiera nieco inną informację 120 . Jest to bowiem kombinacja bitowa
pewnych flag, które określają stan kilku ważnych klawiszy na klawiaturze oraz przycisków
myszy. Można tam znaleźć wartości stałych wymienionych w tabeli:
stała klawisz
MK_CONTROL Ctrl
MK_SHIFT Shift
MK_LBUTTON lewy przycisk myszy
MK_MBUTTON środkowy przycisk myszy
MK_RBUTTON prawy przycisk myszy
Tabela 42. Stałe parametru wParam komunikatów myszy, określające wciśnięte przy ich okazji
klawisze
Jako że są to flagi bitowe, wParam może mieć ustawioną więcej niż jedną taką stałą
naraz. Sprawdzenia, czy jakaś flaga jest tu zawarta, należy dokonywać za pomocą
odpowiedniej operacji bitowej:
if ((wParam & stała ) /* != 0 */ )
{
// stała jest ustawiona
}
Przykładowo, aby dowiedzieć się, czy w momencie zajścia zdarzenia myszy wciśnięty był
klawisz Shift , trzeba posłużyć się warunkiem:
if (wParam & MK_SHIFT)
Więcej informacji o flagach bitowych możesz znaleźć w Dodatku B, Reprezentacja danych
w pamięci .
To wszystko, jeżeli chodzi o parametry komunikatów myszy. Teraz wypadałoby przyjrzeć
się bliżej każdemu z tych ważnych zdarzeń.
Kliknięcia przycisków
Ewolucja komputerowych myszek, jaka następowała przez ostatnie dekady, polegała w
dużej mierze na dodawania kolejnych przycisków. Pierwsze urządzenia tego typu
posiadały tylko jeden taki przycisk, później standardem stały się dwa. Dzisiaj minimalna
liczba przycisków, potrzebna dla wygodnej pracy z każdą aplikacją, to trzy; jednak wiele
myszek posiada teraz nawet szerszy ich asortyment, z których wszystkie są często
konfigurowalne.
Liczbę dostępnych przycisków myszy można pobrać za pomocą wywołania
GetSystemMetrics(SM_CMOUSEBUTTONS) .
Wszystkie wersje Windows szeroko używane w chwili obecnej zapewniają standardową
obsługę dla trzech przycisków myszy:
120 W przypadku komunikatu WM_MOUSEWHEEL informacja ta zajmuje tylko młodsze słowo z wParam
( LOWORD(wParam) ), gdyż starsze jest przeznaczone na dane o pozycji rolki. Podobnie jest też z trzema
komunikatami WM_XBUTTON* w Windows 2000/XP.
20082936.001.png 20082936.002.png 20082936.003.png 20082936.004.png 20082936.005.png 20082936.006.png 20082936.007.png
426
¾ lewego, używanego zdecydowanie najczęściej. Kliknięcia tym przyciskiem są
standardową metodą wyboru elementów interfejsu użytkownika, jak na przykład
przycisków czy opcji menu
¾ prawego, służącego głównie do pokazywania menu podręcznego (ang. context
menu ) oraz specjalnych typów przeciągania (ang. dragging ) obiektów
¾ środkowego, którego działania jest zwykle zależne od aplikacji. Dla przykładu, w
programie 3ds max służy on między innymi do przewijania długich pasków
narzędzi; fani gry Saper zapewne znają zastosowanie tego przycisku w ich
ulubionej grze
Myszy dwuprzyciskowe symulują środkowy przycisk za pomocą jednoczesnego wciśnięcia
swego lewego i prawego przycisku.
Każdy z tych trzech przycisków myszy może z kolei generować trójkę związanych ze sobą
zdarzeń:
¾ wciśnięcie przycisku (ang. button down )
¾ zwolnienie przycisku (ang. button up )
¾ dwukrotne kliknięcie (ang. double click )
Zauważmy, że Windows nie generuje oddzielnego komunikatu dla pojedynczego
kliknięcia danym przyciskiem myszy. Takie kliknięcie jest bowiem interpretowane jako
dwa zdarzenia: wciśnięcia i zwolnienia przycisku, następujące po sobie.
Nazwy komunikatów
Trzy przyciski i trzy możliwe do wystąpienia akcje… Nie trzeba być specem od
matematyki, by wywnioskować, że łącznie daje to nam 9 komunikatów o zdarzeniach
myszy. Każdemu z nich odpowiada oczywiście pewna stała, której nazwę można łatwo
zbudować wedle następującego schematu:
WM_ przycisk BUTTON akcja
Etykiety przycisk i akcja powinny być w nim zastąpione fragmentami nazw,
odnoszącymi się do jednego z przycisków oraz do rodzaju występowanego zdarzenia.
Możliwe warianty w obu tych kwestiach przedstawiają dwie poniższe tabelki:
przycisk przycisk myszy
L lewy
M środkowy
R
Tabela 43 i 44. Fragmenty nazw komunikatów o zdarzeniach myszy
akcja zdarzenie przycisku
DOWN wciśnięcie przycisku
UP zwolnienie przycisku
DBLCLK dwukrotne kliknięcie
Budując z tych informacji wszystkie możliwe nazwy komunikatów, otrzymamy dziewięć
odpowiadających im stałych:
zdarzenie Æ
przycisk È
wciśnięcie przycisku zwolnienie przycisku dwukrotne kliknięcie
lewy
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
środkowy WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
prawy
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCK
Tabela 45. Nazwy komunikatów o zdarzeniach myszy
Windows 2000 i XP posiada też wbudowaną obsługę ewentualnych dwóch dodatkowych
przycisków myszy, oznaczanych jako X1 i X2. Związana jest z nimi aczkolwiek tylko
trójka stosownych komunikatów (zamiast sześciu); obydwa przyciski są bowiem
prawy
20082936.008.png 20082936.009.png
427
rozróżnianie przez wartość górnego słowa wParam .
Wszystkie informacje na temat możesz naturalnie znaleźć w MSDN przy opisach
komunikatów WM_XBUTTONDOWN , WM_XBUTTONUP i WM_XBUTTONDBLCLK .
Poznamy obecnie nieco bliżej wszystkie wymienione tu komunikaty.
Pojedyncze kliknięcia
Jak już nadmieniłem, Windows nie wyróżnia żadnego komunikatu do informowania o
pojedynczych kliknięciach przycisku myszy. Wysyła za to powiadomienia o wciśnięciu
oraz puszczeniu każdego z przycisków.
Szczególnie komunikaty o przyciśnięciach są dla nas interesujące. To właśnie ich używa
się, by reagować na kliknięcia w obszarze klienta okna.
Wśród tych zdarzeń zdecydowanie najczęściej jest z kolei wykorzystywane zawiadomienie
WM_LBUTTONDOWN . Jest to bowiem prosta droga reagowania na kliknięcia myszy dotyczące
okna. Na ten komunikat odpowiadaliśmy chociażby w przykładowym programie
TaskbarHider z poprzedniego rozdziału. Naciśnięcie lewego przycisku myszy powodowało
tam pokazywanie lub ukrywanie systemowego paska zadań.
Mówiąc na temat komunikatów o wciśnięciu lub zwolnieniu przycisków myszy trzeba
jeszcze zwrócić uwagę na pewien trudno uchwytny fakt. Otóż wystąpienie
WM_?BUTTONDOWN wcale nie musi pociągać za sobą późniejszego pojawienia się
WM_?BUTTONUP . Jeżeli bowiem użytkownik, wcisnąwszy przycisk, przeniesie kursor poza
obszar klienta okna programu, wówczas komunikat o puszczeniu przycisku nie trafi do
tego okna.
Niekiedy bywa to zachowaniem niepożądanym, ale na szczęście Windows oferuje
możliwość jego zmiany. Poznamy ją w jednym z następnych paragrafów.
Dwukrotne kliknięcia
Zdarzenie podwójnego kliknięcia występuje wtedy, gdy nastąpi dwukrotne, szybkie
wciśnięcie i zwolnienie jednego z przycisków myszy (nie tylko lewego). Musi to nastąpić
w odpowiednio krótkim czasie oraz przy stosunkowo niewielkiej lub żadnej zmianie
pozycji kursora.
Wiele modeli myszek umożliwia też przypisanie akcji dwukrotnego kliknięcia lewym
przyciskiem do jednego z dodatkowych przycisków myszy. Windows traktuje takie
emulowane kliknięcia identycznie jak normalne, jednak z wiadomych względów nie
stosują się do nich wymienione wyżej ograniczenia.
Restrykcyjność tych ograniczeń można oczywiście regulować i dopasować do swoich
potrzeb. Maksymalny interwał czasu jest ustawiany w Panelu Sterowania, zaś tolerowane
przesunięcie myszy przy pomocy narzędza Tweak UI.
Oba te parametry systemowe można też zmienić programowo poprzez Windows API -
tego również nauczymy się w tym podrozdziale.
Wróćmy jednak do samych komunikatów o dwukrotnych kliknięciach. Od razu trzeba
powiedzieć na ich temat dwie ważne kwestie.
Po pierwsze, żadnemu oknu nie jest bezwarunkowo dane odbieranie tych komunikatów.
Być może (mam nadzieję :D) pamiętasz, że w grę wchodzą tu style klasy okna.
Uściślając to stwierdzenie, trzeba powiedzieć, iż:
Tylko okna, których klasy zawierają styl CS_DBLCKLS , odbierają komunikaty o
dwukrotnych kliknięciach przyciskami myszy.
20082936.010.png 20082936.011.png 20082936.012.png 20082936.013.png 20082936.014.png 20082936.015.png 20082936.016.png 20082936.017.png
Zgłoś jeśli naruszono regulamin