Omówienie wprowadzania myszy
Mysz jest ważnym, ale opcjonalnym urządzeniem wejściowym użytkownika dla aplikacji. Dobrze napisana aplikacja powinna zawierać interfejs myszy, ale nie powinna zależeć wyłącznie od myszy w celu uzyskania danych wejściowych użytkownika. Aplikacja powinna również zapewnić pełną obsługę klawiatury.
Aplikacja odbiera dane wejściowe myszy w postaci komunikatów wysyłanych lub publikowanych w oknach.
W tej sekcji omówiono następujące tematy:
- kursor myszy
- Przechwytywanie myszy
- myszy
- Konfiguracja myszy
- XBUTTONs
-
komunikatów myszy
- komunikaty myszy obszaru klienta
- komunikatów myszy innych niż klient
- komunikatu WM_NCHITTEST
- Sonar myszy
- Mysz znika
- kółko myszy
- aktywacji okien
Kursor myszy
Gdy użytkownik przesuwa mysz, system przenosi mapę bitową na ekranie o nazwie kursor myszy. Kursor myszy zawiera punkt pojedynczego piksela o nazwie hot spot, punkt, który system śledzi i rozpoznaje jako położenie kursora. Gdy wystąpi zdarzenie myszy, okno zawierające punkt gorąca zwykle odbiera komunikat myszy wynikający z zdarzenia. Okno nie musi być aktywne lub ma fokus klawiatury, aby otrzymać komunikat myszy.
System utrzymuje zmienną, która kontroluje szybkość myszy — czyli odległość, z jaką kursor porusza się, gdy użytkownik przesuwa mysz. Aby pobrać lub ustawić szybkość myszy, możesz użyć funkcji SystemParameters Info z flagą SPI_GETMOUSE lub SPI_SETMOUSE. Aby uzyskać więcej informacji na temat kursorów myszy, zobacz Kursory.
Przechwytywanie myszy
System zazwyczaj publikuje komunikat myszy w oknie zawierającym kursor hot spot po wystąpieniu zdarzenia myszy. Aplikacja może zmienić to zachowanie przy użyciu funkcji SetCapture w celu kierowania komunikatów myszy do określonego okna. Okno odbiera wszystkie komunikaty myszy, dopóki aplikacja nie wywoła funkcji ReleaseCapture lub określi inne okno przechwytywania lub dopóki użytkownik nie kliknie okna utworzonego przez inny wątek.
Po zmianie przechwytywania myszy system wysyła komunikat WM_CAPTURECHANGED do okna, które traci przechwytywanie myszy. Parametr lParam komunikatu określa uchwyt okna, który uzyskuje przechwytywanie myszy.
Tylko okno pierwszego planu może przechwytywać dane wejściowe myszy. Gdy okno tła próbuje przechwycić dane wejściowe myszy, odbiera komunikaty tylko dla zdarzeń myszy, które występują, gdy punkt gorąca kursora znajduje się w widocznej części okna.
Przechwytywanie danych wejściowych myszy jest przydatne, jeśli okno musi odbierać wszystkie dane wejściowe myszy, nawet gdy kursor porusza się poza oknem. Na przykład aplikacja zwykle śledzi położenie kursora po zdarzeniu przycisku myszy w dół, postępując zgodnie z kursorem do momentu wystąpienia zdarzenia przycisku myszy. Jeśli aplikacja nie przechwyciła danych wejściowych myszy, a użytkownik zwolni przycisk myszy poza oknem, okno nie otrzyma komunikatu z przyciskiem myszy.
Wątek może używać funkcji GetCapture, aby określić, czy jeden z okien przechwycił mysz. Jeśli jedno z okien wątku przechwyciło mysz, GetCapture pobiera uchwyt do okna.
Kliknięcie myszą Blokada
Funkcja ułatwień dostępu Myszy ClickLock umożliwia użytkownikowi zablokowanie podstawowego przycisku myszy po jednym kliknięciu. W aplikacji przycisk nadal wydaje się być naciśnięty w dół. Aby odblokować przycisk, aplikacja może wysłać dowolny komunikat myszy lub użytkownik może kliknąć dowolny przycisk myszy. Ta funkcja umożliwia użytkownikowi wykonywanie bardziej złożonych kombinacji myszy. Na przykład osoby z pewnymi ograniczeniami fizycznymi mogą łatwiej wyróżniać tekst, przeciągać obiekty lub otwierać menu. Aby uzyskać więcej informacji, zobacz następujące flagi i uwagi w SystemParametersInfo:
- SPI_GETMOUSECLICKLOCK
- SPI_SETMOUSECLICKLOCK
- SPI_GETMOUSECLICKLOCKTIME
- SPI_SETMOUSECLICKLOCKTIME
Konfiguracja myszy
Chociaż mysz jest ważnym urządzeniem wejściowym dla aplikacji, nie każdy użytkownik musi mieć mysz. Aplikacja może określić, czy system zawiera mysz, przekazując wartość SM_MOUSEPRESENT do funkcji GetSystemMetrics.
System Windows obsługuje mysz z maksymalnie trzema przyciskami. Na trzy przyciski myszy przyciski są oznaczone jako lewe, środkowe i prawe przyciski. Komunikaty i nazwane stałe powiązane z przyciskami myszy używają liter L, M i R, aby zidentyfikować przyciski. Przycisk na jednym przycisku myszy jest uważany za lewy przycisk. Mimo że system Windows obsługuje mysz z wieloma przyciskami, większość aplikacji używa lewego przycisku przede wszystkim i innych minimalnych, jeśli w ogóle.
Aplikacje mogą również obsługiwać kółko myszy. Kółko myszy można nacisnąć lub obrócić. Po naciśnięciu kółka myszy działa on jako środkowy (trzeci) przycisk, wysyłając normalne komunikaty przycisku środkowego do aplikacji. Po obróceniu do aplikacji jest wysyłany komunikat koła. Aby uzyskać więcej informacji, zobacz sekcję Kółko myszy.
Aplikacje mogą obsługiwać przyciski poleceń aplikacji. Przyciski te, nazywane XBUTTON1 lub XBUTTON2, zostały zaprojektowane tak, aby umożliwić łatwiejszy dostęp do przeglądarki internetowej, poczty elektronicznej i usług multimedialnych. Po naciśnięciu XBUTTON1 lub XBUTTON2 do aplikacji zostanie wysłany komunikat WM_APPCOMMAND. Aby uzyskać więcej informacji, zobacz opis w komunikacie WM_APPCOMMAND.
Aplikacja może określić liczbę przycisków myszy, przekazując wartość SM_CMOUSEBUTTONS do funkcji GetSystemMetrics. Aby skonfigurować mysz dla użytkownika po lewej stronie, aplikacja może użyć funkcji SwapMouseButton, aby odwrócić znaczenie przycisków myszy po lewej i prawej stronie. Przekazanie wartości SPI_SETMOUSEBUTTONSWAP do funkcji SystemParametersInfo jest innym sposobem odwrócenia znaczenia przycisków. Należy jednak pamiętać, że mysz jest zasobem udostępnionym, więc odwrócenie znaczenia przycisków wpływa na wszystkie aplikacje.
XBUTTONs
System Windows obsługuje myszy z maksymalnie pięcioma przyciskami: lewym, środkowym i prawym oraz dwoma dodatkowymi przyciskami nazywanymi XBUTTON1 i XBUTTON2. Przyciski XBUTTON1 i XBUTTON2 są często zlokalizowane po bokach myszy w pobliżu podstawy. Te dodatkowe przyciski nie są obecne na wszystkich myszach. Jeśli istnieje, przyciski XBUTTON1 i XBUTTON2 są często mapowane na funkcję aplikacji, taką jak nawigacja do przodu i do tyłu w przeglądarce sieci Web.
Menedżer okien obsługuje komunikaty XBUTTON1 i XBUTTON2 za pośrednictwem WM_XBUTTON* i WM_NCXBUTTON*. HIWORD WPARAM w tych komunikatach zawiera flagę wskazującą, który XBUTTON został naciśnięty. Ponieważ te komunikaty myszy pasują również między stałymi WM_MOUSEFIRST i WM_MOUSELAST, aplikacja może filtrować wszystkie komunikaty myszy za pomocą GetMessage lub PeekMessage.
Następująca obsługa XBUTTON1 i XBUTTON2:
- WM_APPCOMMAND
- WM_NCXBUTTONDBLCLK
- WM_NCXBUTTONDOWN
- WM_NCXBUTTONUP
- WM_XBUTTONDBLCLK
- WM_XBUTTONDOWN
- WM_XBUTTONUP
- MOUSEHOOKSTRUCTEX
Następujące interfejsy API zostały zmodyfikowane w celu obsługi tych przycisków:
- mouse_event
- ShellProc
- MSLLHOOKSTRUCT
- MOUSEINPUT
- WM_PARENTNOTIFY
Jest mało prawdopodobne, że okno podrzędne w aplikacji składników będzie mogło bezpośrednio zaimplementować polecenia dla XBUTTON1 i XBUTTON2. Dlatego DefWindowProc wysyła komunikat WM_APPCOMMAND do okna po kliknięciu XBUTTON1 lub XBUTTON2. DefWindowProc wysyła również komunikat WM_APPCOMMAND do okna nadrzędnego. Jest to podobne do sposobu wywoływania menu kontekstowego za pomocą kliknięcia prawym przyciskiem myszy —DefWindowProc wysyła komunikat WM_CONTEXTMENU do menu, a także wysyła go do elementu nadrzędnego. Ponadto jeśli DefWindowProc odbiera komunikat WM_APPCOMMAND dla okna najwyższego poziomu, wywołuje punkt zaczepienia powłoki z HSHELL_APPCOMMAND kodu.
Istnieje obsługa klawiatur, które mają dodatkowe dla funkcji przeglądarki, funkcji multimedialnych, uruchamiania aplikacji i zarządzania energią. Aby uzyskać więcej informacji, zobacz klawiatury do przeglądania i innych funkcji.
Komunikaty myszy
Mysz generuje zdarzenie wejściowe, gdy użytkownik przesuwa mysz lub naciska lub zwalnia przycisk myszy. System konwertuje zdarzenia wprowadzania myszy na komunikaty i publikuje je w kolejce komunikatów odpowiedniego wątku. Gdy komunikaty myszy są publikowane szybciej niż wątek może je przetworzyć, system odrzuca wszystkie, ale najnowsze komunikaty myszy.
Okno otrzymuje komunikat myszy, gdy występuje zdarzenie myszy, gdy kursor znajduje się w granicach okna lub gdy okno przechwyciło mysz. Komunikaty myszy są podzielone na dwie grupy: komunikaty obszaru klienta i komunikaty obszaru innego klienta. Zazwyczaj aplikacja przetwarza komunikaty obszaru klienta i ignoruje komunikaty obszaru nieklienta.
W tej sekcji omówiono następujące tematy:
- komunikaty myszy obszaru klienta
- komunikatów myszy innych niż klient
- komunikatu WM_NCHITTEST
Komunikaty myszy obszaru klienta
Okno odbiera komunikat myszy obszaru klienta po wystąpieniu zdarzenia myszy w obszarze klienta okna. System publikuje komunikat WM_MOUSEMOVE do okna, gdy użytkownik przenosi kursor w obszarze klienta. Publikuje jeden z następujących komunikatów, gdy użytkownik naciska lub zwalnia przycisk myszy, gdy kursor znajduje się w obszarze klienta.
Komunikat | Znaczenie |
---|---|
WM_LBUTTONDBLCLK | Lewy przycisk myszy został dwukrotnie kliknięty. |
WM_LBUTTONDOWN | Lewy przycisk myszy został naciśnięty. |
WM_LBUTTONUP | Lewy przycisk myszy został zwolniony. |
WM_MBUTTONDBLCLK | Środkowy przycisk myszy został dwukrotnie kliknięty. |
WM_MBUTTONDOWN | Środkowy przycisk myszy został naciśnięty. |
WM_MBUTTONUP | Środkowy przycisk myszy został zwolniony. |
WM_RBUTTONDBLCLK | Kliknij dwukrotnie prawym przyciskiem myszy. |
WM_RBUTTONDOWN | Naciśnięty został prawy przycisk myszy. |
WM_RBUTTONUP | Prawy przycisk myszy został zwolniony. |
WM_XBUTTONDBLCLK | Dwukrotne kliknięcie przycisku myszy X. |
WM_XBUTTONDOWN | Naciśnięty został przycisk myszy X. |
WM_XBUTTONUP | Przycisk myszy X został zwolniony. |
Ponadto aplikacja może wywołać funkcję TrackMouseEvent, aby system wysyłał dwa inne komunikaty. Publikuje komunikat WM_MOUSEHOVER po umieszczeniu kursora na obszarze klienta przez określony czas. Publikuje komunikat WM_MOUSELEAVE, gdy kursor opuszcza obszar klienta.
Parametry komunikatu
Parametr lParam komunikatu myszy obszaru klienta wskazuje położenie punktu gorącego kursora. Wyraz o niskiej kolejności wskazuje współrzędną x punktu gorącego, a wyraz o wysokiej kolejności wskazuje współrzędną y. Współrzędne są określone we współrzędnych klienta. W systemie współrzędnych klienta wszystkie punkty na ekranie są określane względem współrzędnych (0,0) lewego górnego rogu obszaru klienta.
Parametr wParam zawiera flagi wskazujące stan innych przycisków myszy oraz CTRL i SHIFT w momencie zdarzenia myszy. Można sprawdzić te flagi, gdy przetwarzanie komunikatów myszy zależy od stanu innego przycisku myszy lub CTRL lub SHIFT. Parametr wParam może być kombinacją następujących wartości.
Wartość | Opis |
---|---|
MK_CONTROL | CTRL nie działa. |
MK_LBUTTON | Lewy przycisk myszy jest wyłączony. |
MK_MBUTTON | Środkowy przycisk myszy jest wyłączony. |
MK_RBUTTON | Prawy przycisk myszy jest wyłączony. |
MK_SHIFT | SHIFT jest wyłączony. |
MK_XBUTTON1 | XBUTTON1 nie działa. |
MK_XBUTTON2 | XBUTTON2 nie działa. |
komunikaty Double-Click
System generuje komunikat dwukrotnego kliknięcia, gdy użytkownik klika dwukrotnie przycisk myszy w krótkim odstępie czasu. Gdy użytkownik kliknie przycisk, system ustanawia prostokąt wyśrodkowany wokół punktu gorącego kursora. Oznacza również czas, w którym nastąpiło kliknięcie. Gdy użytkownik kliknie ten sam przycisk po raz drugi, system określi, czy punkt gorący jest nadal w obrębie prostokąta i oblicza czas, jaki upłynął od pierwszego kliknięcia. Jeśli punkt gorący jest nadal w obrębie prostokąta, a upłynął czas nie przekracza wartości przekroczenia limitu czasu dwukrotnego kliknięcia, system generuje komunikat dwukrotnie kliknięć.
Aplikacja może pobierać i ustawiać wartości limitu czasu dwukrotnego kliknięcia, używając odpowiednio funkcji GetDoubleClickTime i SetDoubleClickTime. Alternatywnie aplikacja może ustawić wartość limitu czasu dwukrotnego kliknięcia przy użyciu flagi SPI_SETDOUBLECLICKTIME z funkcją SystemParametersInfo. Można również ustawić rozmiar prostokąta używanego przez system do wykrywania dwukrotnych kliknięć, przekazując flagi SPI_SETDOUBLECLKWIDTH i SPI_SETDOUBLECLKHEIGHT do SystemParametersInfo. Należy jednak pamiętać, że ustawienie wartości limitu czasu dwukrotnego kliknięcia i prostokąta wpływa na wszystkie aplikacje.
Okno zdefiniowane przez aplikację domyślnie nie odbiera komunikatów dwukrotnie klikanych. Ze względu na obciążenie systemowe związane z generowaniem komunikatów dwukrotnego kliknięcia te komunikaty są generowane tylko dla okien należących do klas, które mają styl klasy CS_DBLCLKS. Aplikacja musi ustawić ten styl podczas rejestrowania klasy okna. Aby uzyskać więcej informacji, zobacz Klasy okien.
Komunikat dwukrotnego kliknięcia jest zawsze trzecim komunikatem w serii czterech komunikatów. Pierwsze dwa komunikaty są komunikatami w dół i przyciskami wygenerowanymi przez pierwsze kliknięcie. Drugie kliknięcie powoduje wygenerowanie komunikatu dwukrotnego kliknięcia, po którym następuje kolejny komunikat z przyciskiem. Na przykład dwukrotne kliknięcie lewego przycisku myszy powoduje wygenerowanie następującej sekwencji komunikatów:
Ponieważ okno zawsze odbiera komunikat z przyciskiem w dół przed otrzymaniem komunikatu dwukrotnego kliknięcia, aplikacja zazwyczaj używa komunikatu dwukrotnego kliknięcia w celu rozszerzenia zadania, które rozpoczęło się podczas komunikatu z przyciskiem w dół. Na przykład gdy użytkownik kliknie kolor na palecie kolorów programu Microsoft Paint, program Paint wyświetli wybrany kolor obok palety. Gdy użytkownik kliknie dwukrotnie kolor, aplikacja Paint wyświetli kolor i otworzy okno dialogowe Edytuj kolory.
Komunikaty myszy w obszarze nieklienta
Okno odbiera komunikat myszy o obszarze innym niż klient, gdy zdarzenie myszy występuje w dowolnej części okna z wyjątkiem obszaru klienta. Obszar niekliencki okna składa się z obramowania, paska menu, paska tytułu, paska przewijania, menu okna, przycisku minimalizowania i maksymalizowania przycisku.
System generuje komunikaty obszaru nieklientnego przede wszystkim do użytku własnego. Na przykład system używa komunikatów obszaru innego niż klient, aby zmienić kursor na strzałkę dwugłową, gdy kursor zostanie przeniesiony do obramowania okna. Aby móc korzystać z wbudowanego interfejsu myszy, okno musi przekazywać komunikaty myszy nieklienta do funkcjiDefWindowProc.
Dla każdego komunikatu myszy obszaru klienta dla każdego komunikatu myszy obszaru klienta jest wyświetlany odpowiedni komunikat myszy w obszarze klienta. Nazwy tych komunikatów są podobne, z tą różnicą, że nazwane stałe dla komunikatów obszaru nieklienckiego zawierają litery NC. Na przykład przesunięcie kursora w obszarze nonclient generuje komunikat WM_NCMOUSEMOVE, a naciśnięcie lewego przycisku myszy, gdy kursor znajduje się w obszarze nonclient, generuje komunikat WM_NCLBUTTONDOWN.
Parametr lParam komunikatu myszy o obszarze nieklienta jest strukturą zawierającą współrzędne x i y punktu gorącego kursora. W przeciwieństwie do współrzędnych komunikatów myszy obszaru klienta współrzędne są określane we współrzędnych ekranu, a nie współrzędnych klienta. W układzie współrzędnych ekranu wszystkie punkty na ekranie są względem współrzędnych (0,0) lewego górnego rogu ekranu.
Parametr wParam zawiera wartość testu trafienia, która wskazuje, gdzie w obszarze nieklienta wystąpiło zdarzenie myszy. W poniższej sekcji opisano przeznaczenie wartości testów trafień.
Komunikat WM_NCHITTEST
Za każdym razem, gdy wystąpi zdarzenie myszy, system wysyła komunikat WM_NCHITTEST do okna zawierającego kursor hot spot lub okno, które przechwyciło mysz. System używa tego komunikatu, aby określić, czy wysyłać komunikat myszy obszaru klienta, czy nieklienta. Aplikacja, która musi odbierać komunikaty dotyczące ruchu myszy i przycisku myszy, musi przekazać komunikat WM_NCHITTEST do funkcjiDefWindowProc.
Parametr lParam komunikatu WM_NCHITTEST zawiera współrzędne ekranu punktu gorącego kursora. Funkcja DefWindowProc sprawdza współrzędne i zwraca wartość testu trafienia, która wskazuje lokalizację punktu gorącego. Wartość testu trafień może być jedną z następujących wartości.
Wartość | Lokalizacja gorącego miejsca |
---|---|
HTBORDER | Na obramowaniu okna, które nie ma obramowania rozmiaru. |
HTBOTTOM | W dolnym poziomie obramowania okna. |
HTBOTTOMLEFT | W lewym dolnym rogu obramowania okna. |
HTBOTTOMRIGHT | W prawym dolnym rogu obramowania okna. |
HTCAPTION | Na pasku tytułu. |
HTCLIENT | W obszarze klienta. |
HTCLOSE | W przycisk Zamknij. |
HTERROR | Na tle ekranu lub na linii podziału między oknami (tak samo jak HTNOWHERE, z tą różnicą, że funkcja DefWindowProc generuje sygnał dźwiękowy systemu wskazujący błąd). |
HTGROWBOX | W polu rozmiaru (takim samym jak HTSIZE). |
HTHELP | W przycisku Pomoc. |
HTHSCROLL | Na pasku przewijania poziomego. |
HTLEFT | W lewym obramowanie okna. |
HTMENU | W menu. |
HTMAXBUTTON | W przycisk Maksymalizuj. |
HTMINBUTTON | W przycisk Minimalizuj. |
HTNOWHERE | Na tle ekranu lub na linii podziału między oknami. |
HTREDUCE | W przycisk Minimalizuj. |
HTRIGHT | W prawym obramowanie okna. |
HTSIZE | W polu rozmiaru (takim samym jak HTGROWBOX). |
HTSYSMENU | W menu systemu lub w Zamknij w oknie podrzędnym. |
HTTOP | W górnym poziomie obramowania okna. |
HTTOPLEFT | W lewym górnym rogu obramowania okna. |
HTTOPRIGHT | W prawym górnym rogu obramowania okna. |
HTTRANSPARENT | W oknie obecnie pokrytym innym oknem w tym samym wątku. |
HTVSCROLL | Na pasku przewijania w pionie. |
HTZOOM | W przycisk Maksymalizuj. |
Jeśli kursor znajduje się w obszarze klienta okna, DefWindowProc zwraca wartość HTCLIENT trafienia do procedury okna. Gdy procedura okna zwraca ten kod do systemu, system konwertuje współrzędne ekranu kursora hot spot do współrzędnych klienta, a następnie publikuje odpowiedni komunikat myszy obszaru klienta.
Funkcja DefWindowProc zwraca jedną z pozostałych wartości testu trafień, gdy punkt gorąca kursora znajduje się w obszarze innym niż klient okna. Gdy procedura okna zwraca jedną z tych wartości testu trafień, system publikuje komunikat myszy obszaru nieklienta, umieszczając wartość testu trafienia w wparam parametru i współrzędnych kursora w parametrze lParam.
Sonar myszy
Funkcja ułatwień dostępu Mouse Sonar krótko pokazuje kilka koncentrycznych okręgów wokół wskaźnika, gdy użytkownik naciska i zwalnia CTRL. Ta funkcja pomaga użytkownikowi zlokalizować wskaźnik myszy na ekranie, który jest zaśmiecony lub z rozdzielczością ustawioną na wysoką, na monitorze niskiej jakości lub dla użytkowników z niedowidzącymi. Aby uzyskać więcej informacji, zobacz następujące flagi w SystemParametersInfo:
SPI_GETMOUSESONAR
SPI_SETMOUSESONAR
Znika mysz
Funkcja ułatwień dostępu znika myszą ukrywa wskaźnik podczas wpisywania przez użytkownika. Wskaźnik myszy pojawia się ponownie, gdy użytkownik przenosi mysz. Ta funkcja zachowuje wskaźnik przed zaciemnianiem wpisywanego tekstu, na przykład w wiadomości e-mail lub innym dokumencie. Aby uzyskać więcej informacji, zobacz następujące flagi w SystemParametersInfo:
SPI_GETMOUSEVANISH
SPI_SETMOUSEVANISH
Koło myszy
Kółko myszy łączy cechy koła i przycisku myszy. Koło ma dyskretne, równomiernie rozmieszczone wycięcie. Po obróceniu koła do aplikacji jest wysyłany komunikat koła, gdy napotkano każdy wycięcie. Przycisk koła może również działać jako normalny przycisk środkowy systemu Windows (trzeci). Naciśnięcie i zwolnienie kółka myszy wysyła standardowe komunikaty WM_MBUTTONUP i WM_MBUTTONDOWN. Dwukrotne kliknięcie trzeciego przycisku spowoduje wysłanie standardowego komunikatu WM_MBUTTONDBLCLK.
Koło myszy jest obsługiwane za pośrednictwem komunikatu WM_MOUSEWHEEL.
Obracanie myszy wysyła komunikat WM_MOUSEWHEEL do okna koncentracji uwagi. Funkcja DefWindowProc propaguje komunikat do elementu nadrzędnego okna. Nie powinno istnieć wewnętrzne przekazywanie komunikatu, ponieważ DefWindowProc propaguje go w łańcuchu nadrzędnym do momentu znalezienia okna przetwarzanego.
Określanie liczby linii przewijania
Aplikacje powinny używać funkcji SystemParametersInfo, aby pobrać liczbę wierszy przewijania dokumentu dla każdej operacji przewijania (nacięcie koła). Aby pobrać liczbę wierszy, aplikacja wykonuje następujące wywołanie:
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)
Zmienna "pulScrollLines" wskazuje niepodpisaną wartość całkowitą, która otrzymuje sugerowaną liczbę wierszy do przewijania, gdy koło myszy jest obracane bez modyfikujących:
- Jeśli ta liczba ma wartość 0, nie powinno nastąpić przewijanie.
- Jeśli ta liczba jest WHEEL_PAGESCROLL, rzut koła powinien być interpretowany jako kliknięcie raz na stronie w dół lub na stronie w górę regionów paska przewijania.
- Jeśli liczba wierszy do przewinięcia jest większa niż liczba wierszy do wyświetlenia, operacja przewijania powinna być również interpretowana jako operacja stronicowania w dół lub strony w górę.
Wartość domyślna liczby linii przewijania to 3. Jeśli użytkownik zmieni liczbę linii przewijania przy użyciu arkusza Właściwości myszy w Panelu sterowania, system operacyjny emituje komunikat WM_SETTINGCHANGE do wszystkich okien najwyższego poziomu z określonymi SPI_SETWHEELSCROLLLINES. Gdy aplikacja odbierze komunikat WM_SETTINGCHANGE, może pobrać nową liczbę wierszy przewijania, wywołując następujące wywołanie:
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)
Kontrolki, które przewijają
W poniższej tabeli wymieniono kontrolki z funkcją przewijania (w tym wierszami przewijania ustawionymi przez użytkownika).
Kontrola | Przewijanie |
---|---|
Edytuj kontrolkę | Pionowo i poziomo. |
Kontrolka pola listy | Pionowo i poziomo. |
Pole kombi | Gdy nie zostaną usunięte, każde przewinięcie pobiera następny lub poprzedni element. Po usunięciu każdy przewija komunikat do przodu do pola listy, co odpowiednio się przewija. |
CMD (wiersz polecenia) | Pionowy. |
Widok drzewa | Pionowo i poziomo. |
Widok listy | Pionowo i poziomo. |
Przewijanie w górę/w dół | Jeden element naraz. |
Przewijanie paska śledzenia | Jeden element naraz. |
Microsoft Rich Edit 1.0 | Pionowy. Należy pamiętać, że klient programu Exchange ma własne wersje kontrolek widoku listy i widoku drzewa, które nie obsługują kół. |
Microsoft Rich Edit 2.0 | Pionowy. |
Wykrywanie myszy za pomocą koła
Aby określić, czy mysz z kółkiem jest połączona, wywołaj GetSystemMetrics za pomocą SM_MOUSEWHEELPRESENT. Wartość zwracana TRUE wskazuje, że mysz jest połączona.
Poniższy przykład pochodzi z procedury okna dla wielowierszowej kontrolki edycji:
BOOL ScrollLines(
PWNDDATA pwndData, //scrolls the window indicated
int cLinesToScroll); //number of times
short gcWheelDelta; //wheel delta from roll
PWNDDATA pWndData; //pointer to structure containing info about the window
UINT gucWheelScrollLines=0;//number of lines to scroll on a wheel rotation
gucWheelScrollLines = SystemParametersInfo(SPI_GETWHEELSCROLLLINES,
0,
pulScrollLines,
0);
case WM_MOUSEWHEEL:
/*
* Do not handle zoom and datazoom.
*/
if (wParam & (MK_SHIFT | MK_CONTROL)) {
goto PassToDefaultWindowProc;
}
gcWheelDelta -= (short) HIWORD(wParam);
if (abs(gcWheelDelta) >= WHEEL_DELTA && gucWheelScrollLines > 0)
{
int cLineScroll;
/*
* Limit a roll of one (1) WHEEL_DELTA to
* scroll one (1) page.
*/
cLineScroll = (int) min(
(UINT) pWndData->ichLinesOnScreen - 1,
gucWheelScrollLines);
if (cLineScroll == 0) {
cLineScroll++;
}
cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
assert(cLineScroll != 0);
gcWheelDelta = gcWheelDelta % WHEEL_DELTA;
return ScrollLines(pWndData, cLineScroll);
}
break;
Aktywacja okna
Gdy użytkownik kliknie nieaktywne okno najwyższego poziomu lub okno podrzędne nieaktywnego okna najwyższego poziomu, system wysyła komunikat WM_MOUSEACTIVATE (między innymi) do okna najwyższego poziomu lub podrzędnego. System wysyła tę wiadomość po opublikowaniu komunikatu WM_NCHITTEST do okna, ale przed opublikowaniem komunikatu przycisku w dół. Po przekazaniu WM_MOUSEACTIVATE do funkcjiDefWindowProc system aktywuje okno najwyższego poziomu, a następnie publikuje komunikat przycisku w dół do okna najwyższego poziomu lub elementu podrzędnego.
Dzięki przetwarzaniu WM_MOUSEACTIVATEokno może kontrolować, czy okno najwyższego poziomu staje się aktywnym oknem w wyniku kliknięcia myszy i czy kliknięty okno odbiera kolejny komunikat w dół przycisku. Robi to, zwracając jedną z następujących wartości po przetworzeniu WM_MOUSEACTIVATE.
Wartość | Znaczenie |
---|---|
MA_ACTIVATE | Aktywuje okno i nie odrzuca komunikatu myszy. |
MA_NOACTIVATE | Nie aktywuje okna i nie odrzuca komunikatu myszy. |
MA_ACTIVATEANDEAT | Aktywuje okno i odrzuca komunikat myszy. |
MA_NOACTIVATEANDEAT | Nie aktywuje okna, ale odrzuca komunikat myszy. |
Zobacz też
korzystanie z High-Definition ruchu myszy