Udostępnij przez


Informacje o paskach przewijania

Okno może wyświetlać obiekt danych, taki jak dokument lub mapa bitowa, który jest większy niż obszar klienta okna. Po udostępnieniu paska przewijania użytkownik może przewinąć obiekt danych w obszarze klienta, aby wyświetlić części obiektu, które wykraczają poza granice okna.

Paski przewijania powinny znajdować się w dowolnym oknie, dla którego zawartość obszaru klienta wykracza poza obramowania okna. Orientacja paska przewijania określa kierunek, w którym odbywa się przewijanie, gdy użytkownik obsługuje pasek przewijania. Poziomy pasek przewijania umożliwia użytkownikowi przewijanie zawartości okna w lewo lub w prawo. Pionowy pasek przewijania umożliwia użytkownikowi przewijanie zawartości w górę lub w dół.

W tej sekcji omówiono następujące tematy.

Części paska przewijania

Pasek przewijania składa się z zacienionego wału z przyciskiem strzałki na każdym końcu i pole przewijania (czasami nazywane kciukiem) między przyciskami strzałek. Pasek przewijania reprezentuje ogólną długość lub szerokość obiektu danych w obszarze klienta okna; pole przewijania reprezentuje część obiektu widocznego w obszarze klienta. Położenie pola przewijania zmienia się za każdym razem, gdy użytkownik przewija obiekt danych, aby wyświetlić jego inną część. System dostosowuje również rozmiar suwaka paska przewijania, aby wskazać, która część całego elementu danych jest obecnie widoczna w oknie. Jeśli większość obiektu jest widoczna, pole przewijania zajmuje większość prowadnicy paska przewijania. Podobnie, jeśli tylko niewielka część obiektu jest widoczna, pole przewijania zajmuje niewielką część wału paska przewijania.

Użytkownik przewija zawartość okna, klikając jeden z przycisków strzałek, klikając obszar w zacienionym wału paska przewijania lub przeciągając pole przewijania. Gdy użytkownik kliknie przycisk strzałki, aplikacja przewija zawartość według jednej jednostki (zazwyczaj pojedynczy wiersz lub kolumna). Gdy użytkownik kliknie zacienione pola, aplikacja przewija zawartość o jedną stronę. Wielkość przewijania, która zachodzi, gdy użytkownik przeciąga pole przewijania, zależy od pokonanej odległości i zakresu paska przewijania. Aby uzyskać więcej informacji na temat zakresu przewijania, zobacz Położenie pola przewijania i Zakres przewijania.

Poniższy zrzut ekranu przedstawia zaawansowane pole edycji z pionowymi i poziomymi paskami przewijania, tak jak mogą być wyświetlane w systemie Windows Vista. Pionowy pasek przewijania jest obecnie "gorący", ponieważ wskaźnik myszy zatrzymał się na nim podczas wykonywania zrzutu ekranu.

zrzut ekranu kontrolki edycji rozszerzonej z paskami przewijania

Standardowe paski przewijania i kontrolki paska przewijania

Pasek przewijania znajduje się w oknie jako standardowy pasek przewijania lub jako kontrolka paska przewijania. Standardowy pasek przewijania znajduje się w obszarze nieklientowym okna. Zostanie on utworzony za pomocą okna i wyświetlony po wyświetleniu okna. Jedynym celem standardowego paska przewijania jest umożliwienie użytkownikowi generowania żądań przewijania w celu wyświetlenia całej zawartości obszaru klienta. Standardowy pasek przewijania można uwzględnić w oknie, określając WS_HSCROLL, WS_VSCROLLlub oba style podczas tworzenia okna. Styl WS_HSCROLL tworzy poziomy pasek przewijania umieszczony w dolnej części obszaru klienta. Styl WS_VSCROLL tworzy pionowy pasek przewijania umieszczony po prawej stronie obszaru klienta. Wartości metryk systemowych SM_CXHSCROLL i SM_CYHSCROLL określają szerokość i wysokość standardowego poziomego paska przewijania. Wartości SM_CXVSCROLL i SM_CYVSCROLL definiują szerokość i wysokość standardowego pionowego paska przewijania. Standardowy pasek przewijania jest częścią skojarzonego okna i dlatego nie ma własnego uchwytu okna.

Kontrolka paska przewijania to okno sterowania należące do klasy okna SCROLLBAR. Zostanie wyświetlona kontrolka paska przewijania i działa jak standardowy pasek przewijania, ale jest to oddzielne okno. W osobnym oknie kontrolka paska przewijania ma bezpośredni fokus danych wejściowych. W przeciwieństwie do standardowego paska przewijania kontrolka paska przewijania ma również wbudowany interfejs klawiatury.

W jednym oknie można użyć jak najwięcej kontrolek paska przewijania. Podczas tworzenia kontrolki paska przewijania należy określić rozmiar i położenie paska przewijania. Jeśli jednak można zmienić rozmiar okna kontrolki paska przewijania, należy wprowadzić zmiany rozmiaru paska przewijania przy każdym zmianie rozmiaru okna.

Zaletą korzystania ze standardowego paska przewijania jest to, że system tworzy pasek przewijania i automatycznie ustawia jego rozmiar i położenie. Jednak standardowe paski przewijania są czasami zbyt restrykcyjne. Załóżmy na przykład, że chcesz podzielić obszar klienta na ćwiartki i użyć oddzielnego zestawu pasków przewijania, aby kontrolować zawartość każdej ćwiartki. Nie można użyć standardowych pasków przewijania, ponieważ można utworzyć tylko jeden zestaw pasków przewijania dla określonego okna. Zamiast tego użyj kontrolek paska przewijania, ponieważ można dodać dowolną liczbę z nich do okna.

Aplikacje mogą udostępniać kontrolki paska przewijania do celów innych niż przewijanie zawartości okna. Na przykład aplikacja wygaszacza ekranu może zapewnić pasek przewijania umożliwiający ustawienie szybkości przenoszenia grafiki na ekranie.

Kontrolka paska przewijania może mieć wiele stylów, które służą do kontrolowania orientacji i położenia paska przewijania. Należy określić żądane style podczas wywoływania funkcji CreateWindowEx, aby utworzyć kontrolkę paska przewijania. Niektóre style tworzą kontrolkę paska przewijania, która używa domyślnej szerokości lub wysokości. Należy jednak zawsze określać współrzędne x-i y oraz inne wymiary paska przewijania.

Aby uzyskać tabelę stylów kontrolek paska przewijania, zobacz Style kontrolek paska przewijania.

Notatka

Aby używać stylów wizualizacji z paskami przewijania, aplikacja musi zawierać manifest i musi wywołać InitCommonControls na początku programu. Aby uzyskać informacje na temat stylów wizualizacji, zobacz Style wizualne. Aby uzyskać informacje na temat manifestów, zobacz Włączanie stylów wizualnych.

 

Położenie pola przewijania i zakres przewijania

Pozycja pola przewijania jest reprezentowana jako liczba całkowita; jest względem lewego lub górnego końca paska przewijania, w zależności od tego, czy pasek przewijania jest poziomy, czy pionowy. Pozycja musi należeć do minimalnych i maksymalnych wartości zakresu przewijania. Na przykład na pasku przewijania z zakresem od 0 do 100 pozycja 50 znajduje się w środku, a pozostałe pozycje są rozłożone równomiernie wzdłuż paska przewijania. Początkowy zakres zależy od paska przewijania. Standardowe paski przewijania mają początkowy zakres od 0 do 100; Kontrolki paska przewijania mają pusty zakres (zarówno wartości minimalne, jak i maksymalne są zerowe), chyba że po utworzeniu kontrolki zostanie podany jawny zakres. Zakres można zmienić w dowolnym momencie. Za pomocą funkcji SetScrollInfo można ustawić wartości zakresu, a funkcja GetScrollInfo pobiera bieżące wartości zakresu.

Aplikacja zazwyczaj dostosowuje zakres przewijania do wygodnych liczb całkowitych, co ułatwia tłumaczenie położenia pola przewijania na wartość odpowiadającą obiektowi danych do przewinięcia. Jeśli na przykład aplikacja musi wyświetlać 260 wierszy pliku tekstowego w oknie, które może wyświetlać tylko 16 wierszy jednocześnie, zakres pionowych pasków przewijania można ustawić na 1 do 244. Jeśli pole przewijania znajduje się w pozycji 1, pierwszy wiersz będzie w górnej części okna. Jeśli pole przewijania znajduje się w pozycji 244, ostatni wiersz (wiersz 260) będzie w dolnej części okna. Jeśli aplikacja próbuje określić wartość pozycji mniejszą niż minimalna lub większa niż maksymalna, zostanie użyta minimalna lub maksymalna wartość zakresu przewijania.

Rozmiar strony można ustawić dla paska przewijania. Rozmiar strony reprezentuje liczbę jednostek danych, które mogą mieścić się w obszarze klienta okna właściciela, biorąc pod uwagę bieżący rozmiar. Jeśli na przykład obszar klienta może zawierać 16 wierszy tekstu, aplikacja ustawi rozmiar strony na 16. System używa rozmiaru strony wraz z zakresem przewijania i długością wałka paska przewijania w celu ustawienia rozmiaru pola przewijania. Za każdym razem, gdy zmienia się rozmiar okna zawierającego pasek przewijania, aplikacja powinna wywołać funkcję SetScrollInfo, aby ustawić rozmiar strony. Aplikacja może pobrać bieżący rozmiar strony, wywołując funkcję wysyłania GetScrollInfo.

Aby ustanowić przydatną relację między zakresem paska przewijania i obiektem danych, aplikacja musi dostosować zakres za każdym razem, gdy zmienia się rozmiar obiektu danych.

Gdy użytkownik przesuwa pole na pasku przewijania, pasek przewijania zgłasza położenie pola jako liczbę całkowitą w zakresie przewijania. Jeśli pozycja jest minimalną wartością, pole przewijania znajduje się w górnej części pionowego paska przewijania lub na lewym końcu poziomego paska przewijania. Jeśli pozycja jest wartością maksymalną, pole przewijania znajduje się w dolnej części pionowego paska przewijania lub na prawym końcu poziomego paska przewijania.

Maksymalna wartość, którą pasek przewijania może zgłaszać (czyli maksymalną pozycję przewijania) zależy od rozmiaru strony. Jeśli pasek przewijania ma rozmiar strony większy niż jeden, maksymalna pozycja przewijania jest mniejsza niż maksymalna wartość zakresu. Aby obliczyć maksymalną pozycję przewijania, możesz użyć następującej formuły:

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

Aplikacja musi przesunąć suwak na pasku przewijania. Mimo że użytkownik wysyła żądanie przewijania na pasku przewijania, pasek przewijania nie aktualizuje automatycznie położenia pola przewijania. Zamiast tego przekazuje żądanie do okna nadrzędnego, które musi przewijać dane i aktualizować położenie pola przewijania. Aplikacja używa funkcji SetScrollInfo w celu zaktualizowania położenia pola przewijania; w przeciwnym razie używa funkcji SetScrollPos. Ponieważ steruje ruchem suwaka przewijania, aplikacja może go przesuwać w krokach, które najlepiej sprawdzają się w przypadku przewijanych danych.

Widoczność paska przewijania

System ukrywa i wyłącza standardowy pasek przewijania po określeniu równych wartości minimalnych i maksymalnych. System ukrywa również standardowy pasek przewijania i wyłącza go, jeśli określisz rozmiar strony, który zawiera cały zakres przewijania paska przewijania. Jest to sposób tymczasowego ukrycia paska przewijania, gdy nie jest potrzebny do zawartości obszaru klienta. Nie trzeba wykonywać żądań przewijania przez pasek przewijania, gdy jest on ukryty. System włącza pasek przewijania i wyświetla go ponownie po ustawieniu wartości minimalnych i maksymalnych na nierówne wartości, a rozmiar strony nie zawiera całego zakresu przewijania. Funkcja ShowScrollBar może również służyć do ukrywania lub pokazywania paska przewijania. Nie ma to wpływu na zakres paska przewijania, rozmiar strony lub położenie pola przewijania.

Funkcja EnableScrollBar może służyć do wyłączania jednej lub obu strzałek paska przewijania. Aplikacja wyświetla wyłączone strzałki w kolorze szarym i nie odpowiada na dane wejściowe użytkownika.

Żądania paska przewijania

Użytkownik wykonuje żądania przewijania, klikając różne części paska przewijania. System wysyła żądanie do określonego okna w postaci komunikatu WM_HSCROLL lub WM_VSCROLL. Poziomy pasek przewijania wysyła komunikat WM_HSCROLL; pionowy pasek przewijania wysyła komunikat WM_VSCROLL. Każdy komunikat zawiera kod żądania, który odpowiada akcji użytkownika, uchwytowi paska przewijania (tylko dla kontrolek paska przewijania), a w niektórych przypadkach położeniu pola przewijania.

Na poniższym diagramie przedstawiono kod żądania generowany przez użytkownika podczas klikania różnych części paska przewijania.

diagram przedstawiający kody żądań skojarzone z każdym regionem na dwóch paskach przewijania

Wartości SB_ określają akcję wykonywaną przez użytkownika. Aplikacja analizuje kody towarzyszące komunikatowi WM_HSCROLL oraz WM_VSCROLL, a następnie wykonuje odpowiednią operację przewijania. W poniższej tabeli akcja użytkownika jest określona dla każdej wartości, a następnie odpowiedź aplikacji. W każdym przypadku jednostka jest definiowana przez aplikację odpowiednio dla danych. Na przykład typowa jednostka przewijania tekstu w pionie to wiersz tekstu.

Prośba Akcja Odpowiedź
SB_LINEUP Użytkownik klika strzałkę przewijania u góry. Zmniejsza pozycję suwaka; przewija w górę danych o jedną jednostkę.
SB_LINEDOWN Użytkownik klika dolną strzałkę przewijania. Zwiększa położenie paska przewijania; przewija się w dół treści o jedną jednostkę.
SB_LINELEFT Użytkownik klika strzałkę przewijania po lewej stronie. Zmniejsza położenie pola przewijania oraz przewija się w kierunku lewego końca danych o jedną jednostkę.
SB_LINERIGHT Użytkownik klika strzałkę przewijania w prawo. Zwiększa położenie pola przewijania; przewija się w kierunku prawego końca danych o jedną jednostkę.
SB_PAGEUP Użytkownik klika obszar paska przewijania nad przyciskiem przewijania. Zmniejsza położenie pola przewijania o liczbę jednostek danych widocznych w oknie; przewija dane w górę o tę samą liczbę jednostek.
SB_PAGEDOWN Użytkownik klika na część paska przewijania poniżej pola przewijania. Zwiększa położenie pola przewijania o liczbę jednostek danych w oknie; przewija dane w dół o tę samą liczbę jednostek.
SB_PAGELEFT Użytkownik klika wał paska przewijania po lewej stronie pola przewijania. Dekrementuje położenie pola przewijania według liczby jednostek danych w oknie; przewija się w kierunku lewego końca danych o tej samej liczbie jednostek.
SB_PAGERIGHT Użytkownik klika obszar paska przewijania z prawej strony pola przewijania. Zwiększa położenie pola przewijania według liczby jednostek danych w oknie; przewija się w prawo do prawej części danych o tej samej liczbie jednostek.
SB_THUMBPOSITION Użytkownik zwalnia pasek przewijania po jego przeciągnięciu. Ustawia pole przewijania na pozycję określoną w komunikacie; przewija dane o tej samej liczbie jednostek przeniesionych przez pole przewijania.
SB_THUMBTRACK Użytkownik przeciąga pole przewijania. Ustawia pasek przewijania na pozycję określoną w komunikacie i przewija dane o taką samą liczbę jednostek, o którą przeniesiono pasek przewijania, w przypadku aplikacji, które szybko rysują dane. Aplikacje, które nie mogą szybko pobierać danych, muszą czekać na kod żądania SB_THUMBPOSITION przed przesunięciem suwaka przewijania i rozpoczęciem przewijania danych.
SB_ENDSCROLL Użytkownik zwalnia mysz po przytrzymaniu jej na strzałce lub w rynnie paska przewijania. Nie jest wymagana odpowiedź.

 

Pasek przewijania generuje kod żądania SB_THUMBPOSITION i SB_THUMBTRACK, gdy użytkownik kliknie i przeciągnie pole przewijania. Aplikacja powinna być zaprogramowana do przetwarzania kodu żądania SB_THUMBTRACK lub SB_THUMBPOSITION.

Kod żądania SB_THUMBPOSITION występuje, gdy użytkownik zwolni przycisk myszy po kliknięciu pola przewijania. Aplikacja, która przetwarza ten komunikat, wykonuje operację przewijania po przeciągnięciu pola przewijania przez użytkownika do żądanej pozycji i zwolnił przycisk myszy.

Kod żądania SB_THUMBTRACK występuje, gdy użytkownik przeciąga pole przewijania. Jeśli aplikacja przetwarza kody żądań SB_THUMBTRACK, może przewijać zawartość okna, gdy użytkownik przeciąga suwak przewijania. Jednak pasek przewijania może wygenerować wiele SB_THUMBTRACK kodu żądania w krótkim czasie, więc aplikacja powinna przetwarzać te kody żądań tylko wtedy, gdy może szybko przemalować zawartość okna.

Interfejs klawiatury dla paska przewijania

Kontrolka paska przewijania udostępnia wbudowany interfejs klawiatury, który umożliwia użytkownikowi wydawanie żądań przewijania przy użyciu klawiatury; standardowy pasek przewijania nie. Gdy kontrolka paska przewijania ma fokus klawiatury, wysyła wiadomości WM_HSCROLL oraz WM_VSCROLL do swojego okna nadrzędnego, gdy użytkownik naciska klawisze strzałek. Kod żądania jest wysyłany z każdym komunikatem odpowiadającemu klawiszowi strzałki naciśniętemu przez użytkownika. Poniżej znajdują się klawisze strzałek i ich odpowiadające kody.

klawisz strzałki Żądanie kodu
Na dół SB_LINEDOWN lub SB_LINERIGHT
KONIEC SB_BOTTOM
DOM SB_TOP
LEWY SB_LINEUP lub SB_LINELEFT
PGDN SB_PAGEDOWN lub SB_PAGERIGHT
PGUP SB_PAGEUP lub SB_PAGELEFT
PRAWY SB_LINEDOWN lub SB_LINERIGHT
W górę SB_LINEUP lub SB_LINELEFT

 

 

Notatka

Interfejs klawiaturowy kontrolki paska przewijania wysyła kody żądań SB_TOP i SB_BOTTOM. Kod żądania SB_TOP wskazuje, że użytkownik osiągnął najwyższą wartość zakresu przewijania. Aplikacja przewija zawartość okna w dół, tak aby górna część obiektu danych jest widoczna. Kod żądania SB_BOTTOM wskazuje, że użytkownik osiągnął dolną wartość zakresu przewijania. Jeśli aplikacja przetwarza kod żądania SB_BOTTOM, przewija zawartość okna w górę, tak aby dół obiektu danych był widoczny.

 

Jeśli chcesz utworzyć interfejs klawiatury dla standardowego paska przewijania, możesz to zrobić samodzielnie, przetwarzając komunikat WM_KEYDOWN w procedurze okna, a następnie wykonując odpowiednie działanie przewijania na podstawie wirtualnego kodu klawisza, który towarzyszy komunikatowi. Aby uzyskać informacje na temat tworzenia interfejsu klawiatury dla paska przewijania, zobacz Creating a Keyboard Interface for a Standard Scroll Bar (Tworzenie interfejsu klawiaturowego dla standardowego paska przewijania).

Przewijanie obszaru klienta

Najprostszym sposobem przewijania zawartości obszaru klienta jest wymazywanie, a następnie ponowne jego rysowanie. Jest to metoda, której aplikacja może używać z SB_PAGEUP, SB_PAGEDOWN i kodami żądań SB_TOP, które zwykle wymagają zupełnie nowej zawartości.

W przypadku niektórych kodów żądań, takich jak SB_LINEUP i SB_LINEDOWN, nie wszystkie treści muszą zostać wymazane, ponieważ niektóre pozostają widoczne po przewinięciu. Funkcja ScrollWindowEx zachowuje część zawartości obszaru klienta, przenosi zachowaną część o określonej ilości, a następnie przygotowuje resztę obszaru klienta do malowania nowych informacji. ScrollWindowEx używa funkcji BitBlt, aby przenieść określoną część obiektu danych do nowej lokalizacji w obszarze klienta. Każda odkryta część obszaru klienta (nic nie jest zachowywana) jest unieważniana, wymazana i malowana po wystąpieniu następnego komunikatu WM_PAINT.

Funkcja ScrollWindowEx może służyć do wykluczania części obszaru klienta z operacji przewijania. Dzięki temu elementy mają stałe pozycje, takie jak okna podrzędne, nie przemieszczają się w obszarze klienta. Automatycznie unieważnia część obszaru klienta, która ma otrzymać nowe informacje, więc aplikacja nie musi obliczać własnych obszarów przycinania. Aby uzyskać więcej informacji na temat wycinania, zobacz Przycinanie.

Zazwyczaj aplikacja przewija zawartość okna w kierunku odwrotnym, co wskazuje pasek przewijania. Na przykład gdy użytkownik kliknie wał paska przewijania w obszarze poniżej pola przewijania, aplikacja przewija obiekt w oknie w górę, aby wyświetlić część obiektu znajdującego się poniżej widocznej części.

Możesz również przewijać prostokątny region przy użyciu funkcji ScrollDC.

Kolory i metryki paska przewijania

Wartość koloru zdefiniowanego przez system, COLOR_SCROLLBAR, kontroluje kolor w obszarze paska przewijania. Użyj funkcji GetSysColor, aby określić kolor wału paska przewijania i SetSysColors funkcji, aby ustawić kolor wału paska przewijania. Należy jednak pamiętać, że ta zmiana koloru wpływa na wszystkie paski przewijania w systemie.

Wymiary map bitowych używanych przez system można uzyskać na standardowych paskach przewijania, wywołując funkcję GetSystemMetrics. Poniżej przedstawiono wartości metryk systemowych skojarzonych z paskami przewijania.

Metryka systemu Opis
SM_CXHSCROLL Szerokość bitmapy strzałki na poziomym pasku przewijania
SM_CXHTHUMB Szerokość pola przewijania na poziomym pasku przewijania. Ta wartość pobiera szerokość paska przewijania, który ma rozmiar strony o zerowej wartości.
SM_CXVSCROLL Szerokość bitmapy strzałki na pionowym pasku przewijania
SM_CYHSCROLL Wysokość bitmapy strzałki na poziomym pasku przewijania
SM_CYVSCROLL Wysokość bitmapy strzałki pionowego paska przewijania
SM_CYVTHUMB Wysokość pola przewijania na pionowym pasku przewijania. Ta wartość pobiera wysokość paska przewijania, który ma rozmiar strony równy zeru.