CScrollView
CScrollView 类 是 一 个 具 有 滚 动 性 能 的 CView 。 你 可 以 在 任 何 一 个 从 CView 派生 的 类 中 通 过 重 载 消 息 映 射 的 OnHScroll 和 OnVScroll 成 员 函 数 来 自 己 处 理 标
准 的 滚 动 。 但 是 CScrollView 给 它 的 CView 性 能 添 加 了 下 列 特 征 :
-
它 管 理 窗 口 和 视 口 的 大 小 和 映 射 模 式 。
-
它 响 应 滚 动 条 消 息 自 动 滚 动 。
-
它 响 应 来 自 键 盘 , 非 滚 动 鼠 标 或 IntelliMouse 滚 轮 的 消
息 自 动 滚 动 。
你 可 以 通 过 重 载 消 息 映 射 的 OnMouseWheel 和 OnRegisteredMouseWheel 成 员 函数 来 自 己 处 理 鼠 标 轮 的 滚 动 。 就 象 对 于 CScrollView 一 样 , 这 些 成 员 函 数 支 持为 轮 旋 转 消 息 WM_MOUSEWHEEL 推 荐 的 行 为 。
要 利 用 自 动 滚 动 的 优 点 ,可以从 CScrollView 派 生 你 的 视 类 来 代 替 CView 派 生 。当 视 第 一 次 被 创 建 时 , 如 果 你 希 望 根 据 文 档 的 大 小 来 计 算 可 滚 动 视 的 大 小 , 可以 从 重 载 的 CView::OnInitialUpdate 或 CView::OnUpdate 中 调 用 成 员 函 数SetScrollSize s。( 你 必 须 编 写 自 己 的 代 码 来 查 询 文 档 的 大 小 。参 见 在“ Visual C++ 教 程 ” 中 的 “ 增 强 视 ” 可 以 获 得 有 关 的 示 例 。 )
调 用 成 员 函 数 SetSc rollSize 可 以 设 置 视 的 映 射 模 式 , 可 滚 动 视 的 总 尺 寸 , 以 及可 在 水 平 或 垂 直 方 向 上 滚 动 的 量 。 所 有 的 尺 寸 都 是 以 逻 辑 单 位 给 出 的 。 视 的 逻辑 大 小 通 常 是 由 保 存 在 文 档 中 的 数 据 计 算 出 来 的 。 但 在 某 些 情 况 下 , 你 可 能 希望 为 视 指 定 一 个 固 定 的 尺 寸 。 有 关 这 两 种 方 法 的 例 子 , 参 见CScrollView::SetScrollSize s。
你 应 该 以 逻 辑 单 位 指 定 在 水 平 或 垂 直 方 向 上 滚 动 的 量 。 缺 省 情 况 下 , 如 果 用 户在 滚 动 框 之 外 单 击 了 滚 动 条 的 条 身 , 则 CScrollView 滚 动 一 “ 页 ” 。 如 果 用 户单 击 了 滚 动 条 两 端 的 滚 动 箭 头 , 则 CScrollView 滚 动 一 “ 行 ” 。 缺 省 情 况 下 , 一 页 是 指 整 个 视 的 大 小 的 1/10 ; 一 行 是 指 页 大 小 的 1/10 。 你 可 以 通 过 传 递 给SetScrollSize 成 员 函 数 定 制 的 尺 寸 来 代 替 这 些 缺 省 值 。 例 如 , 你 可 以 将 水 平 大小 设 置 为 宽 度 总 尺 寸 的 一 部 分 , 并 将 垂 直 大 小 设 置 为 当 前 字 体 的 一 行 的 高 度 。
除 了 滚 动 之 外 , CScrollView 还 可 自 动 将 视 的 大 小 按 比 例 变 换 成 当 前 窗 口 的 大
小 。 在 这 种 方 式 下 , 视 没 有 滚 动 条 , 这 个 逻 辑 视 被 扩 大 或 缩 小 以 精 确 符 合 窗 口的 客 户 区 。 要 使 用 这 种 “ scale-to-fit ” 的 功 能 , 可 以 调 用CScrollView::SetScaleToFitSize 。 ( 调 用 SetScaleToFitSize 或 SetScrollSize s, 但不 要 都 调 用 。 )
在 调 用 你 的 派 生 类 的 OnDraw 成 员 函 数 之 前 , CScrollView 自 动 调 整 传 递 给
OnDraw 的 CPaintDC 设 备 环 境 对 象 的 视 口 原 点 。
为 了 为 滚 动 窗 口 调 整 视 口 原 点 , CScrollView 重 载 CView::OnPrepareDC 。 这 种调 整 对 于 CScrollView 传 递 给 OnDraw 的 CPaintDC 设 备 环 境 来 说 是 自 动 的 , 但你 必 须 为 自 己 所 使 用 的 其 它 设 备 环 境 ( 例 如 CClientDC ) 自 己 调 用CScrollView::OnPrepareDC 。 你 可 以 重 载 CScrollView::OnPrepareDC 来 设 置 画笔 , 背 景 颜 色 , 和 其 它 绘 画 属 性 , 但 是 要 调 用 基 类 来 进 行 比 例 变 换 。
滚 动 条 可 以 显 示 在 与 一 个 视 相 关 的 三 个 位 置 , 如 下 所 示 :
-
可 以 使 用 WS_HSCROLL 和 WS_VSCROLL 风 格 为 视 设 置 标 准 的 窗
口 风 格滚 动 条 。
-
也 可 以 将 滚 动 条 加 在 包 含 视 的 框 架 上 , 在 这 种 情 况 下
, 框 架 将 来 自 框 架 窗口 的 WM_HSCROLL 和 WM_VSCROLL 消 息 向 前 传 递 给 当 前 的 活 动 视 。
-
框 架 也 可 以 将 来 自 CSplitterWnd 分 隔 器 控 件 的 滚 动 信 息
转 发 给 当 前 活 动 的分 隔 格 ( 一 个 视 ) 。 当 在 一 个 CSplitterWnd 中 放 置 了 一 个 可 共 享 的 滚 动 条时 , CScrollView 对 象 将 使 用 这 个 可 共 享 的 滚 动 条 而 不 再 去 创 建 它 自 己 的 滚动 条 。
#include <afxwin.h>
请 参 阅 CView, CSplitterWnd
CScrollView 类 成 员
Operation s FillOutsideRect 填 充 视 滚 动 区 域 之 外 的 其 它 区 域
GetDeviceScrollPositio n
获 取 以 设 备 单 位 表 示 的 当 前 滚 动 位 置
GetDeviceScrollSizes 获 取 可 滚 动 视 的 用 设 备 单 位 表 示 的 当 前 映 射 模
式 , 总 尺 寸 , 以 及 行 和 页 的 大 小GetScrollPosition 获 取 用 逻 辑 单 位 表 示 的 当 前 滚 动 位 置GetTotalSize 获 取 用 逻 辑 单 位 表 示 的 滚 动 视 的 总 尺 寸ResizeParentToFit 使 视 的 大 小 可 以 支 配 它 的 框 架 的 大 小ScrollToPosition 将 视 滚 动 到 用 逻 辑 单 位 指 定 的 给 定 点SetScaleToFitSize 将 视 设 置 为 “ scale-to-fit” 模 式
SetScrollSizes 设 置 滚 动 视 的 映 射 模 式 , 总 尺 寸 , 以 及 水 平 和 垂
直 滚 动 量
Construction
CscrollView 构 造 一 个 CScrollView 对 象
成 员 函 数
CScrollView::CScrollView
CScrollView( );
说 明
此 成 员 函 数 用 来 构 造 一 个 对 象 。 在 此 滚 动 视 可 用 之 前 你 必 须 调 用 SetScrollSize
或 SetScaleToFitSize 。
请 参 阅 CScrollView::SetScrollSizes, CScrollView::SetScaleToFitSize
CScrollView::FillOutsideRect
void FillOutsideRect( CDC* pDC , CBrush* pBrush );
参 数
pDC
将 在 其 中 完 成 填 充 操 作 的 设 备 环 境 。
pBrush
将 被 填 充 的 区 域 的 画 刷 。
说 明
调 用 FillOutsideRect 来 填 充 视 的 滚 动 区 域 之 外 的 区 域 。在 滚 动 视 的 OnEraseBkgnd
处 理 函 数 中 使 用 FillOutsideRect 可 以 避 免 连 续 的 背 景 重 画 。
示 例
BOOL CScaleView::OnEraseBkgnd( CDC* pDC )
{
CBrush br( GetSysColor( COLOR_WINDOW ) );
FillOutsideRect( pDC, &br );
return TRUE; // 擦除
}
请 参 阅 CWnd::OnEraseBkgnd
CScrollView::GetDeviceScrollPosition CPoint GetDeviceScrollPosition( ) const; 返 回 值
返 回 一 个 CPoint 对 象 , 包 含 了 滚 动 框 的 水 平 和 垂 直 位 置 ( 以 设 备 单 位 表 示 ) 。
说 明
当 你 需 要 滚 动 条 中 的 滚 动 框 的 当 前 水 平 和 垂 直 位 置 时 , 可 以 调 用
GetDeviceScrollPosition 。 此 函 数 返 回 的 坐 标 对 应 于 已 滚 动 的 视 的 左 上 角 在 文 档
中 的 位 置 。 在 将 鼠 标 设 备 的 位 置 偏 移 到 滚 动 视 的 设 备 位 置 时 , 这 一 点 是 很 有 用的 。
GetDeviceScrollPosition 的 返 回 值 是 以 设 备 单 位 表 示 的 。 如 果 你 需 要 的 是 逻 辑 单位 值 , 你 可 以 使 用 GetScrollPosition 来 代 替 。
请 参 阅 CScrollView::GetScrollPosition
CScrollView::GetDeviceScrollSizes
void GetDeviceScrollSizes( int& nMapMode , SIZE& sizeTotal , SIZE& sizePage , SIZE& sizeLine ) const;
参 数
nMapMode
返 回 这 个 视 的 当 前 映 射 模 式 。 参 见 SetScrollSize s 可 以 获 得 可 能 取 值 的 列
表 。
sizeTotal
返 回 这 个 滚 动 视 的 当 前 以 设 备 单 位 表 示 的 总 尺 寸 。
sizePage
返 回 在 响 应 滚 动 条 的 条 体 中 发 生 的 鼠 标 单 击 时 , 水 平 和 垂 直 方 向 上 的 当前 滚 动 量 。 cx 成 员 中 存 放 水 平 量 ; cy 成 员 中 存 放 垂 直 量 。
sizeLine
返 回 当 响 应 鼠 标 在 某 个 滚 动 箭 头 上 单 击 时 水 平 和 垂 直 方 向 上 的 当 前 滚 动量 。 cx 成 员 中 存 放 水 平 量 ; cy 成 员 中 存 放 垂 直 量 。
说 明
GetDeviceScrollSizes 用 来 获 取 当 前 的 映 射 模 式 , 总 尺 寸 , 以 及 这 个 可 滚 动 视 的行 和 页 的 大 小 。 各 个 尺 寸 都 是 以 设 备 单 位 表 示 的 。 这 个 成 员 函 数 很 少 被 调 用 。
CScrollView::GetScrollPosition CPoint GetScrollPosition( ) const; 返 回 值
返 回 一 个 CPoint 对 象 , 包 含 滚 动 框 的 水 平 和 垂 直 位 置 ( 以 逻 辑 单 位 表 示 ) 。
说 明
当 你 需 要 滚 动 条 中 的 滚 动 框 的 当 前 水 平 和 垂 直 位 置 时 可 以 调 用
GetScrollPosition 。 这 个 坐 标 对 是 对 应 于 已 滚 动 的 视 的 左 上 角 在 文 档 中 的 位 置 。
GetScrollPosition 的 返 回 值 是 以 逻 辑 单 位 表 示 的 。 如 果 你 需 要 的 是 以 设 备 单 位 表示 的 值 , 你 可 以 调 用 GetDeviceScrollPosition 来 代 替 。
CScrollView::GetTotalSize CSize GetTotalSize( ) const; 返 回 值
返 回 以 逻 辑 单 位 表 示 的 滚 动 视 的 总 尺 寸 。 水 平 尺 寸 被 保 存 在 CSize 返 回 值 的 cx
成 员 中 。 垂 直 尺 寸 被 保 存 在 cy 成 员 中 。
说 明
调 用 GetTotalSize 来 获 取 滚 动 视 的 当 前 水 平 和 垂 直 尺 寸 。
请 参 阅 CScrollView::GetDeviceScrollSizes, CScrollView::SetScrollSizes
CScrollView::ResizeParentToFit
void ResizeParentToFit( BOOL bShrinkOnly = TRUE );
参 数
bShrinkOnly
要 实 现 的 尺 寸 调 整 操 作 。 缺 省 值 是 TRUE , 表 示 要 根 据 需 要 缩 小 框 架 窗口 。 对 大 的 视 或 小 的 框 架 窗 口 , 滚 动 条 仍 然 是 可 见 的 。 该 值 为 FALSE , 表 示 视 总 是 要 精 确 地 调 整 框 架 窗 口 。 这 样 做 可 能 会 有 危 险 , 这 是 因 为 框架 窗 口 可 能 会 变 得 太 大 以 致 于 不 能 被 放 在 多 文 档 界 面 ( M D I ) 的 框 架 窗口 中 或 屏 幕 内 。
说 明
调 用 ResizeParentToFit 将 使 视 的 大 小 支 配 它 的 框 架 窗 口 的 大 小 。 仅 对 M D I 子窗
口 才 推 荐 使 用 此 函 数 。 你 应 该 在 CScrollView 派 生 类 的 OnInitialUpdate 处 理 函数 中 使 用 ResizeParentToFit 函 数 。 关 于 这 个 成 员 函 数 的 例 子 , 参 见CScrollView::SetScrollSize 。
ResizeParentToFit 假 设 视 图 窗 口 的 尺 寸 已 被 设 置 好 。 如 果 ResizeParentToFit 函数 被 调 用 时 视 图 窗 口 的 尺 寸 还 没 有 被 设 置 好 , 则 屏 幕 上 显 示 一 条 断 言 。 为 了 保证 不 发 生 此 类 事 件 , 应 确 保 在 调 用 ResizeParentToFit 函 数 之 前 进 行 如 下 调 用 :
GetParentFrame()->RecalcLayout();
请 参 阅 CView::OnInitialUpdate, CScrollView::SetScrollSizes
CScrollView::ScrollToPosition
void ScrollToPosition( POINT pt );
参 数
pt
用 逻 辑 单 位 表 示 的 要 滚 动 到 的 点 。 x 成 员 必 须 是 正 值 ( 大 于 或 等 于 0 , 小于 视 的 总 大 小 值 ) 。 当 映 射 模 式 时 MM_TEXT 时 , 对 y 成 员 有 同 样 的 要求 。 当 映 射 模 式 不 是 MM_TEXT 时 , y 成 员 是 一 个 负 值 。
说 明
调 用 ScrollToPosition 来 滚 动 到 视 中 的 一 个 给 定 点 。 视 也 将 被 滚 动 以 使 此 点 位 于窗 口 的 左 上 角 。 当 视 是 “ scale-to-fit ” 的 视 时 , 不 能 调 用 此 函 数 。
请 参 阅 CScrollView::GetDeviceScrollPosition, CScrollView::SetScaleToFitSize, CScrollView::SetScrollSizes
CScrollView::SetScaleToFitSize
void SetScaleToFitSize( SIZE sizeTotal );
参 数
sizeTotal
指 出 这 个 视 将 被 比 例 变 换 至 的 水 平 和 垂 直 尺 寸 。 可 滚 动 视 的 尺 寸 是 以 逻辑 单 位 测 量 的 。 cx 成 员 中 存 放 水 平 尺 寸 , cy 成 员 中 存 放 垂 直 尺 寸 。 cx 和cy 都 必 须 大 于 或 等 于 0 。
说 明
当 你 希 望 将 视 口 的 尺 寸 自 动 按 比 例 变 换 为 当 前 窗 口 的 尺 寸 时 , 可 以 调 用SetScaleToFitSize 函 数 。 使 用 滚 动 条 时 , 在 任 一 时 刻 可 能 只 能 看 到 逻 辑 视 的 一部 分 。 但 是 如 果 具 有 “ scale-to-fit” 的 功 能 , 则 视 没 有 滚 动 条 , 并 且 逻 辑 视 被 扩
大 或 缩 小 以 精 确 吻 合 窗 口 的 客 户 区 。 当 窗 口 被 重 新 调 整 大 小 时 , 该 视 将 根 据 窗口 的 尺 寸 以 新 的 比 例 绘 制 其 数 据 。
通 常 你 可 以 在 视 的 重 载 的 OnInitialUpdate 成 员 函 数 中 调 用 SetScaleToFitSize 。如 果 你 不 需 要 自 动 按 比 例 变 换 , 调 用 SetScrollSizes 成 员 函 数 来 代 替 。
SetScaleToFitSize 可 以 用 来 实 现 一 个 “ Zoom to fit ” 操 作 。 使 用 SetScrollSizes
来 重 新 初 始 化 滚 动 。
SetScaleToFitSize 假 设 视 图 窗 口 已 经 被 设 置 好 了 。 如 果 在 调 用 SetScaleToFitSize 时 视 图 窗 口 的 尺 寸 还 没 有 被 设 置 , 你 将 会 得 到 一 个 断 言 。 为 了 保 证 不 出 现 这 种情 况 , 在 调 用 SetScaleToFitSize 之 前 要 进 行 以 下 调 用 :
GetParentFrame()->RecalcLayout();
请 参 阅 CScrollView::SetScrollSizes, CView::OnInitialUpdate
CScrollView::SetScrollSizes
void SetScrollSizes( int nMapMode , SIZE sizeTota l, const SIZE& sizePage = sizeDefault,
const SIZE& sizeLine = sizeDefault );
参 数
nMapMode
要 为 这 个 视 设 置 的 映 射 模 式 。 可 能 的 取 值 包 括 :
Mapping Mode |
Logical Unit |
Positive Extends... |
y-axis |
---|---|---|---|
MM_TEXT |
1 个 像 素 |
向 下 |
|
Mapping Mode |
Logical Unit |
Positive |
y-axis |
Extends... |
|||
M M _ H IMETRIC MM_TWIPS |
0.01 毫 米 1/1440 英 寸 |
向 上向 上 |
|
M M _ H IENGLISH |
0.001 英 寸 |
向 上 |
|
MM_LOMETRIC |
0.1 毫 米 |
向 上 |
|
MM_LOENGLISH |
0.01 英 寸 |
向 上 |
所 有 的 这 些 模 式 都 是 Windows 定 义 的 。两 个 标 准 的 映 射 模 式 , M M _ ISOTROPIC 和 MM_ANISOTROPIC , 在 CScrollView 中 没 有 使 用 。 类 库 提 供 了SetScaleToFitSize 成 员 函 数 来 将 视 图 的 尺 寸 按 比 例 变 换 为 窗 口 的 尺 寸 。
sizeTotal
滚 动 视 的 总 尺 寸 。 cx 成 员 包 含 了 水 平 分 量 。 cy 成 员 包 含 了 垂 直 分 量 。 这些 尺 寸 是 以 逻 辑 单 位 表 示 的 。 cx 和 cy 都 必 须 大 于 或 等 于 0 。
sizePage
当 鼠 标 在 滚 动 条 的 条 体 上 单 击 时 , 要 在 水 平 和 垂 直 方 向 上 滚 动 的 量 。 cx
中 存 放 水 平 滚 动 量 , cy 成 员 中 存 放 垂 直 滚 动 量 。
sizeLine
当 响 应 鼠 标 单 击 滚 动 条 的 滚 动 箭 头 时 要 在 水 平 或 垂 直 方 向 上 滚 动 的 量 。cx
中 存 放 水 平 滚 动 量 , cy 成 员 中 存 放 垂 直 滚 动 量 。
当 视 要 被 更 新 时 , 调 用 SetScrollSize s。 在 你 的 重 载 的 OnUpdate 成 员 函 数 中 调用 这 个 函 数 来 调 整 滚 动 特 性 , 例 如 , 当 文 档 第 一 次 被 显 示 或 是 被 改 变 大 小 时 。
通 常 , 通 过 调 用 你 的 派 生 文 档 类 的 一 个 文 档 成 员 函 数 , 可 能 是 GetMyDocSize , 你 可 以 获 得 视 的 相 关 文 档 的 尺 寸 信 息 。 下 面 的 代 码 给 出 了 这 种 方 法 :
SetScrollSizes( nMapMode, GetDocument( )->GetMyDocSize( ) );
另 外 , 你 有 时 候 也 许 需 要 设 置 一 个 固 定 的 尺 寸 , 就 像 下 面 的 代 码 :
SetScrollSizes( nMapMode, CSize(100, 100) );
你 必 须 将 映 射 模 式 设 置 为 除 MM_ISOTROPIC 或 M M _ A N ISOTROPIC 之 外 的 任何 W indows 映 射 方 式 。 如 果 你 希 望 使 用 一 种 非 限 定 的 映 射 方 式 , 可 以 调 用SetScaleToFitSize 成 员 函 数 来 代 替 SetScrollSizes 。
void CScaleView::OnUpdate( )
{
// ...
// Implement a GetDocSize( ) member function in
// your document class; it returns a CSize.
SetScrollSizes( MM_LOENGLISH, GetDocument( )->GetDocSize( ) ); ResizeParentToFit( ); // Default bShrinkOnly argument
// ...
}
请 参 阅 CScrollView::SetScaleToFitSize, CScrollView::GetDeviceScrollSizes, CScrollView::GetTotalSize