CScrollView 类

注释

Microsoft基础类(MFC)库将继续受到支持。 但是,我们不再添加功能或更新文档。

带滚动功能的 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 以设置笔、背景色和其他绘图特性,但需要调用基类以进行缩放。

滚动条可以出现在视图的三个位置,如以下情况所示:

  • 可以使用 Windows 样式WS_HSCROLLWS_VSCROLL设置标准窗口样式滚动条。

  • 滚动条控件也可以添加到包含视图的框架中,在这种情况下,框架会将 WM_HSCROLL 和 WM_VSCROLL 消息从框架窗口转发到当前活动视图。

  • 框架还会将滚动消息从 CSplitterWnd 拆分器控件转发到当前活动的拆分器窗格(视图)。 当放置在具有共享滚动条的 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();

备注

必须在滚动视图可用之前调用 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 英寸 向上
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());
}

另请参阅

MFC 示例 DIBLOOK
CView 类
层次结构图
CSplitterWnd 类