CScrollView Klasa

Element CView z możliwościami przewijania.

Składnia

class CScrollView : public CView

Członkowie

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_DOWNVK_PREV i wywołaj metodę WM_KEYDOWNSetScrollPos.

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 CScrollViewsystemu , 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 CScrollViewCViewklasy . 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 OnDrawelementu .

Aby dostosować źródło widoku dla okna przewijania, CScrollView zastępuje CView::OnPrepareDCelement . Ta korekta jest automatyczna dla CPaintDC kontekstu urządzenia, który CScrollView przekazuje do OnDrawelementu , 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 i WS_VSCROLL.

  • Kontrolki paska przewijania można również dodać do ramki zawierającej widok, w tym przypadku platforma przekazuje dalej WM_HSCROLL i WM_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 obiekcie CSplitterWnd 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

CObject

CCmdTarget

CWnd

CView

CScrollView

Wymagania

Nagłówka: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