CScrollView
Klasa
Element CView
z możliwościami przewijania.
Składnia
class CScrollView : public CView
Elementy członkowskie
Konstruktory chronione
Nazwa/nazwisko | opis |
---|---|
CScrollView::CScrollView |
CScrollView Tworzy obiekt. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CScrollView::CheckScrollBars |
Wskazuje, czy widok przewijania ma poziome i pionowe paski przewijania. |
CScrollView::FillOutsideRect |
Wypełnia obszar widoku poza obszarem przewijania. |
CScrollView::GetDeviceScrollPosition |
Pobiera bieżące położenie przewijania w jednostkach urządzenia. |
CScrollView::GetDeviceScrollSizes |
Pobiera bieżący tryb mapowania, całkowity rozmiar oraz rozmiar linii i strony widoku z możliwością przewijania. Rozmiary znajdują się w jednostkach urządzeń. |
CScrollView::GetScrollPosition |
Pobiera bieżące położenie przewijania w jednostkach logicznych. |
CScrollView::GetTotalSize |
Pobiera całkowity rozmiar widoku przewijania w jednostkach logicznych. |
CScrollView::ResizeParentToFit |
Powoduje, że rozmiar widoku określa rozmiar ramki. |
CScrollView::ScrollToPosition |
Przewija widok do danego punktu określonego w jednostkach logicznych. |
CScrollView::SetScaleToFitSize |
Umieszcza widok przewijania w tryb skalowania do dopasowania. |
CScrollView::SetScrollSizes |
Ustawia tryb mapowania widoku przewijania, całkowity rozmiar oraz kwoty przewijania w poziomie i w pionie. |
Uwagi
Standardowe przewijanie można obsługiwać w dowolnej klasie pochodzącej z CView
klasy, przesłaniając funkcje mapowane OnHScroll
komunikatów i OnVScroll
składowe. Dodaje jednak CScrollView
następujące funkcje do swoich CView
możliwości:
Zarządza rozmiarami okien i widoków oraz trybami mapowania.
Automatycznie przewija się w odpowiedzi na komunikaty paska przewijania.
Przewija się automatycznie w odpowiedzi na komunikaty z klawiatury, nie przewijającej myszy lub koła IntelliMouse.
Aby przewinąć automatycznie w odpowiedzi na komunikaty z klawiatury, dodaj komunikat i przetestuj polecenie VK_DOWN
VK_PREV
i wywołaj metodę WM_KEYDOWN
SetScrollPos
.
Przewijanie kół myszy można obsługiwać samodzielnie, przesłaniając funkcje mapowane OnMouseWheel
na komunikaty i OnRegisteredMouseWheel
składowe. Ponieważ są one przeznaczone dla CScrollView
systemu , te funkcje członkowskie obsługują zalecane zachowanie dla WM_MOUSEWHEEL
, komunikat obracania koła.
Aby skorzystać z automatycznego przewijania, utwórz klasę widoku zamiast z CScrollView
CView
klasy . Jeśli widok zostanie utworzony po raz pierwszy, jeśli chcesz obliczyć rozmiar widoku przewijanego na podstawie rozmiaru dokumentu, wywołaj SetScrollSizes
funkcję składową z przesłonięcia CView::OnInitialUpdate
wartości lub CView::OnUpdate
. (Musisz napisać własny kod, aby wykonać zapytanie dotyczące rozmiaru dokumentu. Przykład można znaleźć w przykładzie Scribble.
Wywołanie funkcji składowej SetScrollSizes
ustawia tryb mapowania widoku, łączne wymiary widoku przewijania oraz kwoty przewijania w poziomie i w pionie. Wszystkie rozmiary znajdują się w jednostkach logicznych. Rozmiar logiczny widoku jest zwykle obliczany na podstawie danych przechowywanych w dokumencie, ale w niektórych przypadkach może być konieczne określenie stałego rozmiaru. Przykłady obu podejść można znaleźć w temacie CScrollView::SetScrollSizes
.
Możesz określić kwoty do przewijania w poziomie i w pionie w jednostkach logicznych. Domyślnie jeśli użytkownik kliknie wał paska przewijania poza polem przewijania, CScrollView
przewija stronę. Jeśli użytkownik kliknie strzałkę przewijania na każdym końcu paska przewijania, CScrollView
przewija "linię". Domyślnie strona to 1/10 całkowitego rozmiaru widoku; wiersz ma rozmiar strony 1/10. Zastąpij te wartości domyślne, przekazując niestandardowe rozmiary w funkcji składowej SetScrollSizes
. Na przykład można ustawić rozmiar poziomy na część szerokości całkowitego rozmiaru i rozmiar pionowy na wysokość linii w bieżącej czcionki.
Zamiast przewijania można CScrollView
automatycznie skalować widok do bieżącego rozmiaru okna. W tym trybie widok nie ma pasków przewijania, a widok logiczny jest rozciągnięty lub skurczony, aby dokładnie dopasować obszar klienta okna. Aby użyć tej możliwości skalowania do dopasowania, wywołaj metodę CScrollView::SetScaleToFitSize
. (Wywołaj metodę SetScaleToFitSize
lub SetScrollSizes
, ale nie obie).
Zanim zostanie wywołana OnDraw
funkcja składowa klasy widoku pochodnego, CScrollView
automatycznie dostosuje źródło widoku dla CPaintDC
obiektu kontekstu urządzenia, który przekazuje do OnDraw
elementu .
Aby dostosować źródło widoku dla okna przewijania, CScrollView
zastępuje CView::OnPrepareDC
element . Ta korekta jest automatyczna dla CPaintDC
kontekstu urządzenia, który CScrollView
przekazuje do OnDraw
elementu , ale musisz wywołać CScrollView::OnPrepareDC
się samodzielnie dla innych używanych kontekstów urządzenia, takich jak CClientDC
. Możesz zastąpić CScrollView::OnPrepareDC
ustawienie pióra, koloru tła i innych atrybutów rysunku, ale wywołaj klasę bazową, aby wykonać skalowanie.
Paski przewijania mogą być wyświetlane w trzech miejscach względem widoku, jak pokazano w następujących przypadkach:
Standardowe paski przewijania stylu okna można ustawić dla widoku przy użyciu
WS_HSCROLL
stylów systemu Windows iWS_VSCROLL
.Kontrolki paska przewijania można również dodać do ramki zawierającej widok, w tym przypadku platforma przekazuje dalej
WM_HSCROLL
iWM_VSCROLL
komunikaty z okna ramki do aktualnie aktywnego widoku.Platforma przekazuje również komunikaty przewijania z kontrolki rozdzielającej
CSplitterWnd
do aktualnie aktywnego okienka podziału (widoku). W przypadku umieszczania w obiekcieCSplitterWnd
z udostępnionymi paskami przewijania obiekt będzie używać udostępnionych,CScrollView
a nie tworzyć własnych.
Aby uzyskać więcej informacji na temat używania programu CScrollView
, zobacz Architektura dokumentów/widoków i klasy widoków pochodnych dostępne w MFC.
Hierarchia dziedziczenia
CScrollView
Wymagania
Nagłówek: afxwin.h
CScrollView::CheckScrollBars
Wywołaj tę funkcję składową, aby określić, czy widok przewijania ma paski poziome i pionowe.
void CheckScrollBars(
BOOL& bHasHorzBar,
BOOL& bHasVertBar) const;
Parametry
bHasHorzBar
Wskazuje, że aplikacja ma poziomy pasek przewijania.
bHasVertBar
Wskazuje, że aplikacja ma pionowy pasek przewijania.
CScrollView::CScrollView
CScrollView
Tworzy obiekt.
CScrollView();
Uwagi
Musisz wywołać widok SetScrollSizes
przewijania lub SetScaleToFitSize
przed użyciem widoku przewijania.
CScrollView::FillOutsideRect
Wywołaj metodę FillOutsideRect
, aby wypełnić obszar widoku, który pojawia się poza obszarem przewijania.
void FillOutsideRect(
CDC* pDC,
CBrush* pBrush);
Parametry
pDC
Kontekst urządzenia, w którym należy wykonać wypełnienie.
pBrush
Szczotka, z którą należy wypełnić obszar.
Uwagi
Użyj FillOutsideRect
funkcji obsługi widoku przewijania OnEraseBkgnd
, aby zapobiec nadmiernemu przemalowaniu w tle.
Przykład
BOOL CMyScrollView::OnEraseBkgnd(CDC* pDC)
{
CBrush br(GetSysColor(COLOR_WINDOW));
FillOutsideRect(pDC, &br);
return TRUE; // Erased
}
CScrollView::GetDeviceScrollPosition
Wywołaj funkcję GetDeviceScrollPosition
, gdy potrzebujesz bieżących pozycji poziomych i pionowych pól przewijania na paskach przewijania.
CPoint GetDeviceScrollPosition() const;
Wartość zwracana
Pozycje poziome i pionowe (w jednostkach urządzeń) pól przewijania CPoint
jako obiekt.
Uwagi
Ta para współrzędnych odpowiada lokalizacji w dokumencie, do której przewinięty został lewy górny róg widoku. Jest to przydatne w przypadku wyłączania pozycji urządzenia myszy w celu przewijania pozycji urządzeń.
GetDeviceScrollPosition
zwraca wartości w jednostkach urządzeń. Jeśli chcesz jednostki logiczne, użyj GetScrollPosition
zamiast tego.
CScrollView::GetDeviceScrollSizes
GetDeviceScrollSizes
pobiera bieżący tryb mapowania, całkowity rozmiar oraz rozmiar linii i strony widoku z możliwością przewijania.
void GetDeviceScrollSizes(
int& nMapMode,
SIZE& sizeTotal,
SIZE& sizePage,
SIZE& sizeLine) const;
Parametry
nMapMode
Zwraca bieżący tryb mapowania dla tego widoku. Aby uzyskać listę możliwych wartości, zobacz SetScrollSizes
.
sizeTotal
Zwraca bieżący całkowity rozmiar widoku przewijania w jednostkach urządzenia.
sizePage
Zwraca bieżące kwoty poziome i pionowe, aby przewijać w każdym kierunku w odpowiedzi na kliknięcie myszą w wałek paska przewijania. Element cx
członkowski zawiera wartość poziomą. Element cy
członkowski zawiera wartość pionową.
sizeLine
Zwraca bieżące kwoty poziome i pionowe, aby przewijać w każdym kierunku w odpowiedzi na kliknięcie myszą w strzałki przewijania. Element cx
członkowski zawiera wartość poziomą. Element cy
członkowski zawiera wartość pionową.
Uwagi
Rozmiary znajdują się w jednostkach urządzeń. Ta funkcja składowa jest rzadko wywoływana.
CScrollView::GetScrollPosition
Wywołaj funkcję GetScrollPosition
, gdy potrzebujesz bieżących pozycji poziomych i pionowych pól przewijania na paskach przewijania.
CPoint GetScrollPosition() const;
Wartość zwracana
Pozycje poziome i pionowe (w jednostkach logicznych) pól przewijania CPoint
jako obiekt.
Uwagi
Ta para współrzędnych odpowiada lokalizacji w dokumencie, do której przewinięty został lewy górny róg widoku.
GetScrollPosition
zwraca wartości w jednostkach logicznych. Jeśli chcesz jednostki urządzeń, użyj GetDeviceScrollPosition
zamiast tego.
CScrollView::GetTotalSize
Wywołaj metodę GetTotalSize
, aby pobrać bieżące rozmiary w poziomie i pionowym widoku przewijania.
CSize GetTotalSize() const;
Wartość zwracana
Całkowity rozmiar widoku przewijania w jednostkach logicznych. Rozmiar poziomy znajduje się w elemencie cx
wartości zwracanej CSize
. Rozmiar pionowy znajduje się w elemencie cy
członkowskim.
CScrollView::ResizeParentToFit
Wywołaj metodę ResizeParentToFit
, aby umożliwić rozmiarowi widoku dyktowanie rozmiaru okna ramowego.
void ResizeParentToFit(BOOL bShrinkOnly = TRUE);
Parametry
bShrinkOnly
Rodzaj zmiany rozmiaru do wykonania. Wartość domyślna , TRUE
, zmniejsza okno ramki, jeśli jest to konieczne. Paski przewijania będą nadal wyświetlane w przypadku dużych widoków lub małych okien ramowych. Wartość FALSE
powoduje, że widok zawsze zmienia rozmiar okna ramki dokładnie. Może to być nieco niebezpieczne, ponieważ okno ramki może być zbyt duże, aby zmieścić się wewnątrz okna ramowego interfejsu wielu dokumentów (MDI) lub ekranu.
Uwagi
Jest to zalecane tylko w przypadku widoków w oknach ramek podrzędnych MDI. Użyj ResizeParentToFit
funkcji OnInitialUpdate
obsługi klasy pochodnej CScrollView
. Aby zapoznać się z przykładem tej funkcji składowej, zobacz CScrollView::SetScrollSizes
.
ResizeParentToFit
zakłada, że rozmiar okna widoku został ustawiony. Jeśli rozmiar okna widoku nie został ustawiony po ResizeParentToFit
wywołaniu, otrzymasz asercji. Aby upewnić się, że tak się nie stanie, przed wywołaniem metody wykonaj następujące wywołanie ResizeParentToFit
:
GetParentFrame()->RecalcLayout();
CScrollView::ScrollToPosition
Wywołaj metodę ScrollToPosition
, aby przewinąć do danego punktu w widoku.
void ScrollToPosition(POINT pt);
Parametry
pt
Punkt do przewinięcia w jednostkach logicznych. Element x
członkowski musi być wartością dodatnią (większą lub równą 0, do całkowitego rozmiaru widoku). To samo dotyczy elementu y
członkowskiego, gdy tryb mapowania to MM_TEXT
. Element y
członkowski jest ujemny w trybach mapowania innych niż MM_TEXT
.
Uwagi
Widok zostanie przewinięty tak, aby ten punkt był w lewym górnym rogu okna. Ta funkcja składowa nie może być wywoływana, jeśli widok jest skalowany w celu dopasowania.
CScrollView::SetScaleToFitSize
Wywołaj metodę SetScaleToFitSize
, gdy chcesz automatycznie skalować rozmiar widoku do bieżącego rozmiaru okna.
void SetScaleToFitSize(SIZE sizeTotal);
Parametry
sizeTotal
Rozmiary poziome i pionowe, do których ma zostać przeskalowany widok. Rozmiar widoku przewijania jest mierzony w jednostkach logicznych. Rozmiar poziomy znajduje się w elemencie cx
członkowskim. Rozmiar pionowy znajduje się w elemencie cy
członkowskim. Obie cx
wartości muszą cy
być większe lub równe 0.
Uwagi
Za pomocą pasków przewijania tylko część widoku logicznego może być widoczna w dowolnym momencie. Jednak dzięki możliwości skalowania do dopasowania widok nie ma pasków przewijania, a widok logiczny jest rozciągany lub zmniejszany, aby dokładnie dopasować obszar klienta okna. Po zmianie rozmiaru okna widok pobiera dane na nową skalę na podstawie rozmiaru okna.
Zazwyczaj wywołanie metody należy umieścić SetScaleToFitSize
w zastąpieniu funkcji składowej widoku OnInitialUpdate
. Jeśli nie chcesz automatycznego skalowania, wywołaj funkcję składową SetScrollSizes
.
SetScaleToFitSize
Można użyć do zaimplementowania operacji "Zoom to Fit". Służy SetScrollSizes
do ponownego inicjowania przewijania.
SetScaleToFitSize
zakłada, że rozmiar okna widoku został ustawiony. Jeśli rozmiar okna widoku nie został ustawiony po SetScaleToFitSize
wywołaniu, otrzymasz asercji. Aby upewnić się, że tak się nie stanie, przed wywołaniem metody wykonaj następujące wywołanie SetScaleToFitSize
:
GetParentFrame()->RecalcLayout();
CScrollView::SetScrollSizes
Wywołaj metodę SetScrollSizes
, gdy widok ma zostać zaktualizowany.
void SetScrollSizes(
int nMapMode,
SIZE sizeTotal,
const SIZE& sizePage = sizeDefault,
const SIZE& sizeLine = sizeDefault);
Parametry
nMapMode
Tryb mapowania ustawiony dla tego widoku. Możliwe wartości to:
Tryb mapowania | Jednostka logiczna | Oś dodatnia y rozszerza... |
---|---|---|
MM_TEXT |
1 piksel | W dół |
MM_HIMETRIC |
0,01 mm | Górę |
MM_TWIPS |
1/1440 w | Górę |
MM_HIENGLISH |
0.001 w | Górę |
MM_LOMETRIC |
0,1 mm | Górę |
MM_LOENGLISH |
0.01 in | Górę |
Wszystkie te tryby są definiowane przez system Windows. Dwa standardowe tryby MM_ISOTROPIC
mapowania i MM_ANISOTROPIC
, nie są używane w programie CScrollView
. Biblioteka klas udostępnia funkcję składową SetScaleToFitSize
do skalowania widoku do rozmiaru okna. Kolumna trzecia w powyższej tabeli opisuje orientację współrzędnych.
sizeTotal
Całkowity rozmiar widoku przewijania. Element cx
członkowski zawiera zakres poziomy. Element cy
członkowski zawiera zakres pionowy. Rozmiary znajdują się w jednostkach logicznych. Obie cx
wartości muszą cy
być większe lub równe 0.
sizePage
Pozioma i pionowa ilość przewijania w każdym kierunku w odpowiedzi na kliknięcie myszą w wałek paska przewijania. Element cx
członkowski zawiera wartość poziomą. Element cy
członkowski zawiera wartość pionową.
sizeLine
Poziome i pionowe kwoty, aby przewijać w każdym kierunku w odpowiedzi na kliknięcie myszą w strzałkę przewijania. Element cx
członkowski zawiera wartość poziomą. Element cy
członkowski zawiera wartość pionową.
Uwagi
Wywołaj ją w przesłonięciu funkcji składowej OnUpdate
, aby dostosować właściwości przewijania, gdy na przykład dokument jest początkowo wyświetlany lub zmienia rozmiar.
Zazwyczaj uzyskujesz informacje o rozmiarze ze skojarzonego dokumentu w widoku, wywołując funkcję składową dokumentu, być może nazywaną GetMyDocSize
, która jest dostarczana z klasą dokumentów pochodnych. Poniższy kod przedstawia następujące podejście:
CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
SetScrollSizes(nMapMode, pMyDoc->GetMyDocSize());
Alternatywnie czasami może być konieczne ustawienie stałego rozmiaru, jak w poniższym kodzie:
SetScrollSizes(nMapMode, CSize(100, 100));
Należy ustawić tryb mapowania na dowolny z trybów mapowania systemu Windows z wyjątkiem MM_ISOTROPIC
lub MM_ANISOTROPIC
. Jeśli chcesz użyć trybu mapowania bez ograniczeń, wywołaj SetScaleToFitSize
funkcję składową zamiast SetScrollSizes
.
Przykład
void CMyScrollView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/,
CObject* /*pHint*/)
{
// Implement a GetMyDocSize() member function in
// your document class; it returns a CSize.
CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
SetScrollSizes(MM_LOENGLISH, pMyDoc->GetMyDocSize());
ResizeParentToFit(); // Default bShrinkOnly argument
}
void CMyScrollView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// The GetMyDocSize() member function is implemented in
// your document class. The return type is CSize.
CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
SetScrollSizes(MM_TEXT, pMyDoc->GetMyDocSize());
}
Zobacz też
Przykład MFC DIBLOOK
CView
Klasa
Wykres hierarchii
CSplitterWnd
Klasa