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 |
设置滚动视图的映射模式、总大小以及水平和垂直滚动量。 |
备注
可以通过替代消息映射的 OnHScroll
和 OnVScroll
成员函数,自行处理派生自 CView
的任何类中的标准滚动。 但是 CScrollView
会将以下功能添加到其 CView
功能中:
管理窗口和视区大小以及映射模式。
自动滚动以响应滚动条消息。
自动滚动以响应来自键盘、非滚动鼠标或 IntelliMouse 滚轮的消息。
若要在响应来自键盘的消息时自动滚动,请添加 WM_KEYDOWN
消息,测试 VK_DOWN
、VK_PREV
并调用 SetScrollPos
。
可以通过替代消息映射的 OnMouseWheel
和 OnRegisteredMouseWheel
成员函数,自行处理鼠标滚轮滚动。 与 CScrollView
相同,这些成员函数也支持 WM_MOUSEWHEEL
的建议行为:滚轮旋转消息。
若要利用自动滚动,请从 CScrollView
(而不是 CView
)派生视图类。 首次创建视图时,如果希望根据文档的大小计算可滚动视图的大小,请从 CView::OnInitialUpdate
或 CView::OnUpdate
的替代调用 SetScrollSizes
成员函数。 (必须编写自己的代码才能查询文档的大小。有关示例,请参阅 Scribble 示例。)
对 SetScrollSizes
成员函数的调用将设置视图的映射模式、滚动视图的总维度以及水平和垂直滚动量。 所有大小都以逻辑单位为单位。 视图的逻辑大小通常根据存储在文档中的数据进行计算,但在某些情况下,可能需要指定固定的大小。 有关这两种方法的示例,请参阅 CScrollView::SetScrollSizes
。
应指定水平和垂直滚动的量(以逻辑单位为单位)。 默认情况下,如果用户单击滚动框外部的滚动条轴,CScrollView
会滚动一个“页面”。如果用户单击滚动条任一端的滚动箭头,CScrollView
会滚动一“行”。默认情况下,一个页面是视图总大小的 1/10;一行是页面大小的 1/10。 通过在 SetScrollSizes
成员函数中传递自定义大小来替代这些默认值。 例如,可以将水平大小设置为总大小宽度的一个分数,将垂直大小设置为采用当前字体一行的高度。
CScrollView
可以自动将视图缩放为当前窗口大小,而不是滚动。 在此模式下,视图没有滚动条,逻辑视图被拉伸或缩小,以完全适合窗口的工作区。 若要使用此缩放到合适大小功能,请调用 CScrollView::SetScaleToFitSize
。 (调用 SetScaleToFitSize
或 SetScrollSizes
,但不能同时调用。)
在调用派生视图类的 OnDraw
成员函数之前,CScrollView
会自动调整它传递给 OnDraw
的 CPaintDC
设备上下文对象的视区原点。
若要调整滚动窗口的视区原点,CScrollView
将替代 CView::OnPrepareDC
。 此调整对于 CScrollView
传递到 OnDraw
的 CPaintDC
设备上下文是自动执行的,但你必须为自己使用的任何其他设备上下文(例如,CClientDC
)调用 CScrollView::OnPrepareDC
。 可以替代 CScrollView::OnPrepareDC
以设置笔、背景色和其他绘图特性,但需要调用基类以进行缩放。
滚动条可以出现在视图的三个位置,如以下情况所示:
可以使用 Windows 样式为视图
WS_HSCROLL
WS_VSCROLL
设置标准窗口样式滚动条。滚动条控件也可以添加到包含视图的框架中,在这种情况下,框架会将
WM_HSCROLL
和WM_VSCROLL
消息从框架窗口转发到当前活动视图。框架还会将滚动消息从
CSplitterWnd
拆分器控件转发到当前活动的拆分器窗格(视图)。 当放置在具有共享滚动条的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
要用于填充区域的画笔。
备注
在滚动视图的 OnEraseBkgnd
处理程序函数中使用 FillOutsideRect
,以防止过度的后台重新绘制。
示例
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;
返回值
滚动视图的总大小(以逻辑单位为单位)。 水平大小位于 CSize
返回值的 cx
成员中。 垂直大小位于 cy
成员中。
CScrollView::ResizeParentToFit
调用 ResizeParentToFit
,以允许视图的大小决定其框架窗口的大小。
void ResizeParentToFit(BOOL bShrinkOnly = TRUE);
参数
bShrinkOnly
要执行的重设大小类型。 默认值 TRUE
会收缩框架窗口(如果适用)。 对于大型视图或小型框架窗口,滚动条仍将显示。 FALSE
值会导致视图始终完全重设框架窗口的大小。 这可能有点危险,因为框架窗口可能太大,无法容纳在多文档界面 (MDI) 框架窗口或屏幕中。
备注
这仅适用于 MDI 子框架窗口中的视图。 在 CScrollView
派生类的 OnInitialUpdate
处理程序函数中使用 ResizeParentToFit
。 有关此成员函数的示例,请参阅 CScrollView::SetScrollSizes
。
ResizeParentToFit
假定已设置视图窗口的大小。 如果在调用 ResizeParentToFit
时尚未设置视图窗口大小,你将获得断言。 若要确保这种情况不会发生,请先进行以下调用,然后再调用 ResizeParentToFit
:
GetParentFrame()->RecalcLayout();
CScrollView::ScrollToPosition
调用 ScrollToPosition
以滚动到视图中的给定点。
void ScrollToPosition(POINT pt);
参数
pt
要滚动到的点(以逻辑单位为单位)。 x
成员必须是正值(大于或等于 0,最大为视图的总大小)。 当映射模式为 MM_TEXT
时,y
成员也是如此。 在除 MM_TEXT
之外的映射模式下,y
成员为负数。
备注
将滚动视图,以便此点位于窗口的左上角。 如果视图已缩放到合适的大小,则不得调用此成员函数。
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 英寸 | 向上 |
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));
必须将映射模式设置为除 MM_ISOTROPIC
或 MM_ANISOTROPIC
之外的任何 Windows 映射模式。 如果要使用不受限制的映射模式,请调用 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());
}