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 设置滚动视图的映射模式、总大小以及水平和垂直滚动量。

备注

可以通过替代消息映射的 OnHScrollOnVScroll 成员函数,自行处理派生自 CView 的任何类中的标准滚动。 但是 CScrollView 会将以下功能添加到其 CView 功能中:

  • 管理窗口和视区大小以及映射模式。

  • 自动滚动以响应滚动条消息。

  • 自动滚动以响应来自键盘、非滚动鼠标或 IntelliMouse 滚轮的消息。

若要在响应来自键盘的消息时自动滚动,请添加 WM_KEYDOWN 消息,测试 VK_DOWNVK_PREV 并调用 SetScrollPos

可以通过替代消息映射的 OnMouseWheelOnRegisteredMouseWheel 成员函数,自行处理鼠标滚轮滚动。 与 CScrollView 相同,这些成员函数也支持 WM_MOUSEWHEEL 的建议行为:滚轮旋转消息。

若要利用自动滚动,请从 CScrollView(而不是 CView)派生视图类。 首次创建视图时,如果希望根据文档的大小计算可滚动视图的大小,请从 CView::OnInitialUpdateCView::OnUpdate 的替代调用 SetScrollSizes 成员函数。 (必须编写自己的代码才能查询文档的大小。有关示例,请参阅 Scribble 示例。)

SetScrollSizes 成员函数的调用将设置视图的映射模式、滚动视图的总维度以及水平和垂直滚动量。 所有大小都以逻辑单位为单位。 视图的逻辑大小通常根据存储在文档中的数据进行计算,但在某些情况下,可能需要指定固定的大小。 有关这两种方法的示例,请参阅 CScrollView::SetScrollSizes

应指定水平和垂直滚动的量(以逻辑单位为单位)。 默认情况下,如果用户单击滚动框外部的滚动条轴,CScrollView 会滚动一个“页面”。如果用户单击滚动条任一端的滚动箭头,CScrollView 会滚动一“行”。默认情况下,一个页面是视图总大小的 1/10;一行是页面大小的 1/10。 通过在 SetScrollSizes 成员函数中传递自定义大小来替代这些默认值。 例如,可以将水平大小设置为总大小宽度的一个分数,将垂直大小设置为采用当前字体一行的高度。

CScrollView 可以自动将视图缩放为当前窗口大小,而不是滚动。 在此模式下,视图没有滚动条,逻辑视图被拉伸或缩小,以完全适合窗口的工作区。 若要使用此缩放到合适大小功能,请调用 CScrollView::SetScaleToFitSize。 (调用 SetScaleToFitSizeSetScrollSizes,但不能同时调用。)

在调用派生视图类的 OnDraw 成员函数之前,CScrollView 会自动调整它传递给 OnDrawCPaintDC 设备上下文对象的视区原点。

若要调整滚动窗口的视区原点,CScrollView 将替代 CView::OnPrepareDC。 此调整对于 CScrollView 传递到 OnDrawCPaintDC 设备上下文是自动执行的,但你必须为自己使用的任何其他设备上下文(例如,CClientDC)调用 CScrollView::OnPrepareDC。 可以替代 CScrollView::OnPrepareDC 以设置笔、背景色和其他绘图特性,但需要调用基类以进行缩放。

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

  • 可以使用 WS_HSCROLLWS_VSCROLLWindows 样式为视图设置标准窗口样式滚动条。

  • 滚动条控件也可以添加到包含视图的框架中,在这种情况下,框架会将 WM_HSCROLLWM_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();

注解

必须在滚动视图可用之前调用 SetScrollSizesSetScaleToFitSize

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 成员中。 cxcy 必须都大于或等于 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_ISOTROPICMM_ANISOTROPIC 都不用于 CScrollView。 类库提供用于将视图缩放为窗口大小的 SetScaleToFitSize 成员函数。 上表中的第三列描述了坐标方向。

sizeTotal
滚动视图的总大小。 cx 成员包含水平盘区。 cy 成员包含垂直盘区。 大小以逻辑单位为单位。 cxcy 必须都大于或等于 0。

sizePage
每个方向上的水平和垂直滚动量,以响应滚动条轴中的鼠标单击。 cx 成员包含水平量。 cy 成员包含垂直量。

sizeLine
每个方向上的水平和垂直滚动量,以响应滚动箭头中的鼠标单击。 cx 成员包含水平量。 cy 成员包含垂直量。

注解

例如,在文档最初显示或更改大小时,在 OnUpdate 成员函数的替代中调用它可调整滚动特征。

通常,将通过调用与派生文档类一起提供的文档成员函数(可能称为 GetMyDocSize),从视图的关联文档中获取大小信息。 下面的代码演示了此方法:

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

或者,有时可能需要设置固定的大小,如以下代码所示:

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

必须将映射模式设置为除 MM_ISOTROPICMM_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