Класс 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
сообщения поворота колеса.
Чтобы воспользоваться преимуществами автоматической прокрутки, наследуйте класс представления, а не от CScrollView
CView
. При первом создании представления, если вы хотите вычислить размер прокручиваемого представления на основе размера документа, вызовите SetScrollSizes
функцию-член из переопределения либо CView::OnInitialUpdate
CView::OnUpdate
. (Для запроса размера документа необходимо написать собственный код. Пример см. в примере Scribble.)
Вызов SetScrollSizes
функции-член задает режим сопоставления представления, общее измерение представления представления и объемы прокрутки по горизонтали и вертикали. Все размеры находятся в логических единицах. Логический размер представления обычно вычисляется из данных, хранящихся в документе, но в некоторых случаях может потребоваться указать фиксированный размер. Примеры обоих подходов см. в разделе CScrollView::SetScrollSizes
.
Вы указываете объемы прокрутки по горизонтали и вертикали в логических единицах. По умолчанию, если пользователь щелкает вал полосы прокрутки за пределами поля прокрутки, CScrollView
прокрутит страницу. Если пользователь щелкает стрелку прокрутки в любом конце полосы прокрутки, CScrollView
прокрутит строку. По умолчанию страница составляет 1/10 общего размера представления; Строка составляет 1/10 размера страницы. Переопределите эти значения по умолчанию, передав пользовательские размеры в SetScrollSizes
функции-члене. Например, можно задать горизонтальный размер для некоторой доли ширины общего размера и вертикального размера на высоту строки в текущем шрифте.
Вместо прокрутки CScrollView
можно автоматически масштабировать представление до текущего размера окна. В этом режиме представление не имеет полос прокрутки, а логическое представление растянуто или сжато, чтобы точно соответствовать клиентской области окна. Чтобы использовать эту возможность масштабирования для соответствия, вызовите .CScrollView::SetScaleToFitSize
(Вызов либо SetScaleToFitSize
, SetScrollSizes
но не оба.)
Перед вызовом OnDraw
CScrollView
функции-члена производного класса представления автоматически настраивает источник окна просмотра для CPaintDC
объекта контекста устройства, в OnDraw
который он передается.
Чтобы настроить источник окна прокрутки, CScrollView
переопределяется CView::OnPrepareDC
. Эта корректировка автоматически применяется для CPaintDC
контекста устройства, который CScrollView
передается OnDraw
, но вы должны вызывать CScrollView::OnPrepareDC
себя для любых других используемых контекстов устройств, таких как CClientDC
. Можно переопределить CScrollView::OnPrepareDC
, чтобы задать перо, цвет фона и другие атрибуты рисования, но вызвать базовый класс для масштабирования.
Полосы прокрутки могут отображаться в трех местах относительно представления, как показано в следующих случаях:
Полосы прокрутки стандартного стиля окна можно задать для представления с помощью
WS_HSCROLL
WS_VSCROLL
стилей Windows.Элементы управления полосой прокрутки также можно добавить в кадр, содержащий представление, в этом случае платформа пересылает
WM_HSCROLL
иWM_VSCROLL
сообщения из окна кадра в активное представление.Платформа также перенаправит сообщения прокрутки из
CSplitterWnd
элемента управления splitter в активную область разделения (представление). При размещении в общихCSplitterWnd
полосахCScrollView
прокрутки объект будет использовать общие, а не создавать собственные.
Дополнительные сведения об использовании CScrollView
см. в разделе "Архитектура и представление документов" и "Производные классы представлений", доступные в MFC.
Иерархия наследования
CScrollView
Требования
Заголовок: afxwin.h
CScrollView::CheckScrollBars
Вызовите эту функцию-член, чтобы определить, имеет ли представление прокрутки горизонтальные и вертикальные полосы.
void CheckScrollBars(
BOOL& bHasHorzBar,
BOOL& bHasVertBar) const;
Параметры
bHasHorzBar
Указывает, что приложение имеет горизонтальную полосу прокрутки.
bHasVertBar
Указывает, что приложение имеет вертикальную полосу прокрутки.
CScrollView::CScrollView
Формирует объект CScrollView
.
CScrollView();
Замечания
Необходимо вызвать или SetScrollSizes
SetScaleToFitSize
перед использованием представления прокрутки.
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_ISOTROPIC
MM_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
Класс