Класс CScrollView

С CView возможностями прокрутки.

Синтаксис

class CScrollView : public CView

Участники

Защищенные конструкторы

Имя Описание
CScrollView::CScrollView Формирует объект CScrollView.

Открытые методы

Имя Описание
CScrollView::CheckScrollBars Указывает, имеет ли представление прокрутки горизонтальные и вертикальные полосы прокрутки.
CScrollView::FillOutsideRect Заполняет область представления за пределами области прокрутки.
CScrollView::GetDeviceScrollPosition Возвращает текущую позицию прокрутки в единицах устройства.
CScrollView::GetDeviceScrollSizes Возвращает текущий режим сопоставления, общий размер и размеры строк и страницы для прокручиваемого представления. Размеры находятся в единицах устройства.
CScrollView::GetScrollPosition Возвращает текущую позицию прокрутки в логических единицах.
CScrollView::GetTotalSize Возвращает общий размер представления прокрутки в логических единицах.
CScrollView::ResizeParentToFit Приводит к тому, что размер представления диктует размер его кадра.
CScrollView::ScrollToPosition Прокручивает представление до заданной точки, указанной в логических единицах.
CScrollView::SetScaleToFitSize Помещает представление прокрутки в режим масштабирования в соответствии с режимом.
CScrollView::SetScrollSizes Задает режим сопоставления представления прокрутки, общий размер и горизонтальный и вертикальный объем прокрутки.

Замечания

Вы можете обрабатывать стандартные прокрутки в любом классе, производным от CView любого класса, переопределяя сопоставленные OnHScroll с сообщением функции и OnVScroll функции-члены. Но CScrollView добавляет следующие функции в свои CView возможности:

  • Он управляет размерами окна и окна просмотра и режимами сопоставления.

  • Он автоматически прокручивается в ответ на сообщения полосы прокрутки.

  • Она прокручивается автоматически в ответ на сообщения с клавиатуры, не прокручиваемого мыши или колесика IntelliMouse.

Чтобы выполнить автоматическую прокрутку в ответ на сообщения с клавиатуры, добавить WM_KEYDOWN сообщение и проверить наличие VK_DOWNи VK_PREV вызов SetScrollPos.

Вы можете обрабатывать прокрутку колесика мыши самостоятельно, переопределяя сопоставленные OnMouseWheel с сообщением функции и OnRegisteredMouseWheel члены. Как и для CScrollView, эти функции-члены поддерживают рекомендуемое поведение для WM_MOUSEWHEELсообщения поворота колеса.

Чтобы воспользоваться преимуществами автоматической прокрутки, наследуйте класс представления, а не от CScrollViewCView. При первом создании представления, если вы хотите вычислить размер прокручиваемого представления на основе размера документа, вызовите SetScrollSizes функцию-член из переопределения либо CView::OnInitialUpdateCView::OnUpdate. (Для запроса размера документа необходимо написать собственный код. Пример см. в примере Scribble.)

Вызов SetScrollSizes функции-член задает режим сопоставления представления, общее измерение представления представления и объемы прокрутки по горизонтали и вертикали. Все размеры находятся в логических единицах. Логический размер представления обычно вычисляется из данных, хранящихся в документе, но в некоторых случаях может потребоваться указать фиксированный размер. Примеры обоих подходов см. в разделе CScrollView::SetScrollSizes.

Вы указываете объемы прокрутки по горизонтали и вертикали в логических единицах. По умолчанию, если пользователь щелкает вал полосы прокрутки за пределами поля прокрутки, CScrollView прокрутит страницу. Если пользователь щелкает стрелку прокрутки в любом конце полосы прокрутки, CScrollView прокрутит строку. По умолчанию страница составляет 1/10 общего размера представления; Строка составляет 1/10 размера страницы. Переопределите эти значения по умолчанию, передав пользовательские размеры в SetScrollSizes функции-члене. Например, можно задать горизонтальный размер для некоторой доли ширины общего размера и вертикального размера на высоту строки в текущем шрифте.

Вместо прокрутки CScrollView можно автоматически масштабировать представление до текущего размера окна. В этом режиме представление не имеет полос прокрутки, а логическое представление растянуто или сжато, чтобы точно соответствовать клиентской области окна. Чтобы использовать эту возможность масштабирования для соответствия, вызовите .CScrollView::SetScaleToFitSize (Вызов либо SetScaleToFitSize , SetScrollSizesно не оба.)

Перед вызовом OnDrawCScrollView функции-члена производного класса представления автоматически настраивает источник окна просмотра для CPaintDC объекта контекста устройства, в OnDrawкоторый он передается.

Чтобы настроить источник окна прокрутки, CScrollView переопределяется CView::OnPrepareDC. Эта корректировка автоматически применяется для CPaintDC контекста устройства, который CScrollView передается OnDraw, но вы должны вызывать CScrollView::OnPrepareDC себя для любых других используемых контекстов устройств, таких как CClientDC. Можно переопределить CScrollView::OnPrepareDC , чтобы задать перо, цвет фона и другие атрибуты рисования, но вызвать базовый класс для масштабирования.

Полосы прокрутки могут отображаться в трех местах относительно представления, как показано в следующих случаях:

  • Полосы прокрутки стандартного стиля окна можно задать для представления с помощью WS_HSCROLLWS_VSCROLLстилей Windows.

  • Элементы управления полосой прокрутки также можно добавить в кадр, содержащий представление, в этом случае платформа пересылает WM_HSCROLL и WM_VSCROLL сообщения из окна кадра в активное представление.

  • Платформа также перенаправит сообщения прокрутки из CSplitterWnd элемента управления splitter в активную область разделения (представление). При размещении в общих CSplitterWnd полосах CScrollView прокрутки объект будет использовать общие, а не создавать собственные.

Дополнительные сведения об использовании CScrollViewсм. в разделе "Архитектура и представление документов" и "Производные классы представлений", доступные в MFC.

Иерархия наследования

CObject

CCmdTarget

CWnd

CView

CScrollView

Требования

Заголовок.afxwin.h

CScrollView::CheckScrollBars

Вызовите эту функцию-член, чтобы определить, имеет ли представление прокрутки горизонтальные и вертикальные полосы.

void CheckScrollBars(
    BOOL& bHasHorzBar,
    BOOL& bHasVertBar) const;

Параметры

bHasHorzBar
Указывает, что приложение имеет горизонтальную полосу прокрутки.

bHasVertBar
Указывает, что приложение имеет вертикальную полосу прокрутки.

CScrollView::CScrollView

Формирует объект CScrollView.

CScrollView();

Замечания

Необходимо вызвать или SetScrollSizesSetScaleToFitSize перед использованием представления прокрутки.

CScrollView::FillOutsideRect

Вызов FillOutsideRect для заполнения области представления, которая отображается за пределами области прокрутки.

void FillOutsideRect(
    CDC* pDC,
    CBrush* pBrush);

Параметры

pDC
Контекст устройства, в котором выполняется заполнение.

pBrush
Кисть, с которой должна быть заполнена область.

Замечания

Используйте FillOutsideRect в функции обработчика OnEraseBkgnd прокрутки, чтобы предотвратить чрезмерное переопределение фона.

Пример

BOOL CMyScrollView::OnEraseBkgnd(CDC* pDC)
{
   CBrush br(GetSysColor(COLOR_WINDOW));
   FillOutsideRect(pDC, &br);
   return TRUE;                   // Erased
}

CScrollView::GetDeviceScrollPosition

Вызов, GetDeviceScrollPosition если вам нужны текущие горизонтальные и вертикальные позиции прямоугольников прокрутки в полосах прокрутки.

CPoint GetDeviceScrollPosition() const;

Возвращаемое значение

Горизонтальные и вертикальные позиции (в единицах устройства) прямоугольника прокрутки в виде CPoint объекта.

Замечания

Эта пара координат соответствует расположению в документе, в котором прокручивается верхний левый угол представления. Это полезно для смещения позиций устройства мыши для просмотра позиций устройства прокрутки.

GetDeviceScrollPosition возвращает значения в единицах устройства. Если требуется логические единицы, используйте GetScrollPosition вместо этого.

CScrollView::GetDeviceScrollSizes

GetDeviceScrollSizes получает текущий режим сопоставления, общий размер и размеры строк и страницы для прокручиваемого представления.

void GetDeviceScrollSizes(
    int& nMapMode,
    SIZE& sizeTotal,
    SIZE& sizePage,
    SIZE& sizeLine) const;

Параметры

nMapMode
Возвращает текущий режим сопоставления для этого представления. Список возможных значений см. в разделе SetScrollSizes.

sizeTotal
Возвращает текущий общий размер представления прокрутки в единицах устройства.

sizePage
Возвращает текущие горизонтальные и вертикальные объемы прокрутки в каждом направлении в ответ на щелчк мыши в вале полосы прокрутки. Элемент cx содержит горизонтальное количество. Элемент cy содержит вертикальную сумму.

sizeLine
Возвращает текущие горизонтальные и вертикальные объемы прокрутки в каждом направлении в ответ на щелчк мыши со стрелкой прокрутки. Элемент cx содержит горизонтальное количество. Элемент cy содержит вертикальную сумму.

Замечания

Размеры находятся в единицах устройства. Эта функция-член редко вызывается.

CScrollView::GetScrollPosition

Вызов, GetScrollPosition если вам нужны текущие горизонтальные и вертикальные позиции прямоугольников прокрутки в полосах прокрутки.

CPoint GetScrollPosition() const;

Возвращаемое значение

Горизонтальные и вертикальные позиции (в логических единицах) прямоугольника прокрутки в виде CPoint объекта.

Замечания

Эта пара координат соответствует расположению в документе, в котором прокручивается верхний левый угол представления.

GetScrollPosition возвращает значения в логических единицах. Если требуется единиц устройства, используйте GetDeviceScrollPosition вместо этого.

CScrollView::GetTotalSize

Вызов GetTotalSize для получения текущих горизонтальных и вертикальных размеров представления прокрутки.

CSize GetTotalSize() const;

Возвращаемое значение

Общий размер представления прокрутки в логических единицах. Горизонтальный размер находится в cx элементе возвращаемого CSize значения. Вертикальный размер находится в элементе cy .

CScrollView::ResizeParentToFit

Вызов, ResizeParentToFit чтобы позволить размеру представления диктовать размер окна кадра.

void ResizeParentToFit(BOOL bShrinkOnly = TRUE);

Параметры

bShrinkOnly
Тип изменения размера для выполнения. Значение TRUEпо умолчанию сокращает окно фрейма при необходимости. Полосы прокрутки по-прежнему отображаются для больших представлений или небольших окон кадров. Значение приводит к тому, FALSE что представление всегда изменяет размер окна фрейма точно. Это может быть несколько опасно, так как окно фрейма может оказаться слишком большим, чтобы поместиться в окно фрейма нескольких документов (MDI) или на экране.

Замечания

Это рекомендуется только для представлений в окнах дочерних кадров MDI. Используйте ResizeParentToFit в OnInitialUpdate функции обработчика производного CScrollView класса. Пример этой функции-члена см. в разделе CScrollView::SetScrollSizes.

ResizeParentToFit Предполагает, что установлен размер окна представления. Если размер окна представления не задан при ResizeParentToFit вызове, вы получите утверждение. Чтобы убедиться, что это не происходит, выполните следующий вызов перед вызовом ResizeParentToFit:

GetParentFrame()->RecalcLayout();

CScrollView::ScrollToPosition

Вызов ScrollToPosition прокрутки до заданной точки в представлении.

void ScrollToPosition(POINT pt);

Параметры

pt
Точка прокрутки в логических единицах. Элемент x должен быть положительным значением (больше или равно 0, вплоть до общего размера представления). То же самое верно для y элемента при использовании MM_TEXTрежима сопоставления. Элемент y отрицательный в режимах сопоставления, отличных от MM_TEXT.

Замечания

Представление будет прокручено таким образом, чтобы эта точка находится в левом верхнем углу окна. Эта функция-член не должна вызываться, если представление масштабируется для соответствия.

CScrollView::SetScaleToFitSize

Вызовите SetScaleToFitSize , когда вы хотите масштабировать размер окна представления до текущего размера окна автоматически.

void SetScaleToFitSize(SIZE sizeTotal);

Параметры

sizeTotal
Горизонтальные и вертикальные размеры, в которых должно масштабироваться представление. Размер представления прокрутки измеряется в логических единицах. Горизонтальный размер содержится в элементе cx . Вертикальный размер содержится в элементе cy . Оба cx значения и cy должны быть больше или равно 0.

Замечания

С полосами прокрутки в любое время может отображаться только часть логического представления. Но при использовании возможности масштабирования в соответствии с масштабом представление не имеет полос прокрутки, а логическое представление растянуто или сжато, чтобы точно соответствовать клиентской области окна. При изменении размера окна представление рисует данные в новом масштабе на основе размера окна.

Обычно вызов SetScaleToFitSize выполняется в переопределении функции-члена представления OnInitialUpdate . Если вы не хотите автоматического масштабирования, вызовите функцию-член SetScrollSizes .

SetScaleToFitSize можно использовать для реализации операции "Масштабирование в соответствии". Используется SetScrollSizes для повторной инициализации прокрутки.

SetScaleToFitSize Предполагает, что установлен размер окна представления. Если размер окна представления не задан при SetScaleToFitSize вызове, вы получите утверждение. Чтобы убедиться, что это не происходит, выполните следующий вызов перед вызовом SetScaleToFitSize:

GetParentFrame()->RecalcLayout();

CScrollView::SetScrollSizes

Вызов при SetScrollSizes обновлении представления.

void SetScrollSizes(
    int nMapMode,
    SIZE sizeTotal,
    const SIZE& sizePage = sizeDefault,
    const SIZE& sizeLine = sizeDefault);

Параметры

nMapMode
Режим сопоставления, заданный для этого представления. Возможные значения включают:

Режим сопоставления Логическая единица Положительное расширение оси Y...
MM_TEXT 1 пиксель В меньшую сторону
MM_HIMETRIC 0,01 мм Вверх
MM_TWIPS 1/1440 в Вверх
MM_HIENGLISH 0.001 in Вверх
MM_LOMETRIC 0,1 мм Вверх
MM_LOENGLISH 0.01 в Вверх

Все эти режимы определяются Windows. Два стандартных режима сопоставления и MM_ISOTROPICMM_ANISOTROPICне используются для CScrollView. Библиотека классов предоставляет SetScaleToFitSize функцию-член для масштабирования представления до размера окна. В приведенной выше таблице три столбца описывается ориентация координат.

sizeTotal
Общий размер представления прокрутки. Элемент cx содержит горизонтальную степень. Элемент cy содержит вертикальную степень. Размеры находятся в логических единицах. Оба cx значения и cy должны быть больше или равно 0.

sizePage
Горизонтальное и вертикальное количество прокрутки в каждом направлении в ответ на щелчк мыши в вале полосы прокрутки. Элемент cx содержит горизонтальное количество. Элемент cy содержит вертикальную сумму.

sizeLine
Горизонтальное и вертикальное количество прокрутки в каждом направлении в ответ на щелчк мыши в стрелке прокрутки. Элемент cx содержит горизонтальное количество. Элемент cy содержит вертикальную сумму.

Замечания

Вызовите его в переопределении OnUpdate функции-члена, чтобы настроить характеристики прокрутки, когда, например, документ изначально отображается или при изменении размера.

Обычно вы получите сведения о размере из связанного документа представления, вызвав функцию-член документа, возможно, вызывая GetMyDocSizeее, которую вы предоставляете производным классом документов. В следующем коде показан такой подход:

CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
SetScrollSizes(nMapMode, pMyDoc->GetMyDocSize());

Кроме того, иногда может потребоваться задать фиксированный размер, как в следующем коде:

SetScrollSizes(nMapMode, CSize(100, 100));

Необходимо задать режим сопоставления для любого из режимов сопоставления Windows, кроме MM_ISOTROPIC или MM_ANISOTROPIC. Если вы хотите использовать режим без ограничений сопоставления, вызовите SetScaleToFitSize функцию-член вместо SetScrollSizes.

Пример

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());
}

См. также

Пример MFC DIBLOOK
CView Класса
Диаграмма иерархии
CSplitterWnd Класса