Udostępnij za pośrednictwem


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

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:

Następujące interfejsy API zostały zmodyfikowane w celu obsługi tych przycisków:

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

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:

  1. WM_LBUTTONDOWN
  2. WM_LBUTTONUP
  3. WM_LBUTTONDBLCLK
  4. WM_LBUTTONUP

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