C V iew
CView 类 为 用 户 定 义 的 视 图 类 提 供 了 基 本 的 功 能 。 视 图 被 连 接 到 文 档 上 , 用 作文 档 和 用 户 之 间 的 媒 介 : 视 图 在 屏 幕 或 打 印 机 上 显 示 文 档 的 图 像 , 并 将 用 户 的输 入 解 释 为 对 文 档 的 操 作 。
视 图 是 框 架 窗 口 的 子 窗 口 。 可 能 会 有 多 个 视 图 共 用 一 个 框 架 窗 口 , 就 像 在 分 隔窗 口 中 那 样 。 视 图 类 、 框 架 窗 口 类 和 文 档 类 之 间 的 联 系 通 过 CDocTemplate 类来 建 立 。 当 用 户 打 开 一 个 新 窗 口 或 将 现 有 窗 口 分 隔 为 多 个 时 , 框 架 会 创 建 一 个新 视 图 并 将 它 连 接 到 文 档 对 象 上 。
- 个 视 图 只 能 被 连 接 到 一 个 文 档 , 但 是 一 个 文 档 可 以 有
多 个 视 图 与 之 相 连 接 ,
例 如 , 在 分 隔 窗 口 或 多 文 档 界 面 ( MDI ) 应 用 程 序 的 多 重 子 窗 口 中 显 示 的 文 档就 是 如 此 。 对 于 给 定 的 文 档 类 型 , 应 用 程 序 可 以 支 持 不 同 类 型 的 视 图 ; 例 如 , 一 个 字 处 理 程 序 可 能 既 要 提 供 文 档 的 完 整 文 本 视 图 , 又 要 提 供 只 显 示 每 节 标 题的 大 纲 视 图 。 这 些 不 同 的 视 图 类 型 可 以 放 在 不 同 的 框 架 窗 口 中 , 如 果 你 使 用 的是 分 隔 窗 口 , 你 也 可 以 把 它 们 放 在 同 一 框 架 窗 口 的 不 同 板 块 中 。
视 图 可 以 响 应 几 种 类 型 的 输 入 , 例 如 键 盘 输 入 , 鼠 标 输 入 或 拖 放 输 入 , 还 有 菜单 、 工 具 条 和 滚 动 条 产 生 的 命 令 输 入 。 视 图 接 收 框 架 窗 口 发 送 给 它 的 命 令 , 如果 视 图 不 接 受 一 个 给 定 的 命 令 , 它 就 将 这 个 命 令 发 送 给 相 连 接 的 文 档 。 与 所 有的 命 令 目 标 一 样 , 视 图 类 通 过 消 息 映 射 处 理 消 息 。
当 文 档 的 数 据 发 生 变 化 时 , 视 图 类 响 应 这 种 变 化 , 通 常 调 用 文 档 的 CDocument:: UpdateAllViews 函 数 , 通 知 所 有 其 它 的 视 图 调 用 OnUpdate 函 数 。 OnUpdate 数的 缺 省 实 现 使 视 图 的 整 个 用 户 区 域 无 效 。 你 可 以 重 载 这 个 函 数 , 只 使 视 图 中 与文 档 的 变 化 部 分 相 对 应 的 区 域 无 效 。
如 果 要 使 用 CView , 应 当 从 它 派 生 一 个 类 , 并 实 现 它 的 OnDraw 函 数 以 在 屏 幕上 显 示 。 你 还 可 以 利 用 OnDraw 函 数 来 进 行 打 印 和 打 印 预 览 。 框 架 将 处 理 打 印循 环 以 实 现 对 文 档 的 打 印 和 打 印 预 览 。
通 过 CWnd::OnHScroll 和 CWnd::OnVScroll 成 员 函 数 来 处 理 滚 动 条 消 息 。 你 可以 在 这 些 函 数 中 实 现 对 滚 动 消 息 的 处 理 , 你 也 可 以 利 用 CView 的 派 生 类SCrollView 来 处 理 滚 动 。
除 了 CScrollView 以 外 , 微 软 基 础 类 库 还 提 供 了 其 它 的 CView 派 生 类 :
-
CCtrlView , 允 许 你 在 树 , 列 表 和 带 格 式 编 辑 控 件 中 使
用 文 档 / 视 图 结 构 。
-
CDaoRecordView , 在 对 话 框 控 件 中 显 示 数 据 库 记 录 的 视 图
。
-
CEditView ,提 供 了 一 个 简 单 的 多 行 文 本 编 辑 器 的 视 图
。你 可 以 将 CEditView
用 作 对 话 框 中 的 一 个 控 件 , 也 可 以 将 它 用 作 文 档 的 视 图 。
-
CFormView , 一 种 可 以 滚 动 的 视 图 , 其 中 包 含 了 对 话 框
控 件 , 它 建 立 在 对话 框 模 板 资 源 的 基 础 上 。
-
CListView , 使 你 能 够 在 列 表 控 件 中 使 用 文 档 /视 结 构 的
视 图 。
-
CRecordView , 在 对 话 框 控 件 中 显 示 数 据 库 记 录 的 视 图 。
-
CRichEditView , 使 你 能 够 在 带 格 式 编 辑 控 件 中 使 用 文 档
/视 图 结 构 的 视 图 。
-
CScrollView , 自 动 提 供 滚 动 支 持 的 一 种 视 图 。
-
CTreeView , 使 你 能 够 在 树 控 件 中 使 用 文 档 /视 图 结 构 的
视 图 。
CView 类 还 有 一 种 派 生 类 , 名 为 CPreviewView , 它 被 框 架 用 于 实 现 打 印 预 览 。这 个 类 提 供 了 对 打 印 预 览 窗 口 特 性 的 支 持 , 例 如 工 具 条 、 单 页 或 双 页 预 览 以 及放 大 ( 被 用 来 放 大 预 览 的 图 像 ) 等 。 你 没 有 必 要 调 用 或 重 载 CPreviewView 的任 何 成 员 函 数 , 除 非 你 想 实 现 自 己 的 打 印 预 览 界 面 ( 例 如 , 如 果 你 希 望 支 持 在预 览 模 式 下 的 编 辑 ) 。 有 关 使 用 CView 的 更 多 信 息 参 见 “ Visual C++ 程 序 员 指南 ” 中 的 “ 文 档 / 视 图 结 构 主 题 ” 和 “ 打 印 ” 。 另 外 , 有 关 自 定 义 打 印 预 览 的 更多 细 节 可 以 参 见 “ Visual C++ 文 档 ” 中 的 “ 技 术 注 释 30 ” 。
#include <afxwin.h>
请 参 阅 CWnd, CFrameWnd, CSplitterWnd, CDC, CDocTemplate, CDocument
CView 类 成 员
Operations
DoPreparePrinting 显 示 Print 对 话 框 , 创 建 打 印 机 设 备 环 境 ; 如 果 重 载了 OnPreparePrinting 成 员 函 数 , 则 调 用 之
GetDocument 返 回 与 视 图 相 连 接 的 文 档
OL E Overridable s OnDragEnter 当 某 项 第 一 次 被 拖 入 视 图 的 拖 放 区 域 时 调 用 这 个 函 数OnDragLeave 当 某 个 被 拖 的 项 离 开 视 图 的 拖 放 区 域 时 调 用 这 个 函 数OnDragOver 当 某 项 被 拖 过 视 图 的 拖 放 区 域 时 调 用 这 个 函 数
OnDrop 当 某 项 被 放 入 视 图 的 拖 放 区 域 时 调 用 这 个 函 数 , 这 是缺 省 的 处 理 函 数
OnDropEx 当 某 项 被 放 入 视 图 的 拖 放 区 域 时 调 用 这 个 函 数 , 这 是主 要 的 处 理 函 数
OnDragScroll 调 用 这 个 函 数 以 确 定 光 标 是 否 被 拖 入 窗 口 的 滚 动 区 域OnInitialUpdate 在 一 个 视 图 第 一 次 与 文 档 连 接 的 时 候 调 用 这 个 函 数OnScrollBy 当 一 个 包 含 活 动 的 现 场 可 编 辑 OLE 项 的 视 图 被 滚 动
时 调 用 这 个 函 数
OnScroll 当 OLE 项 被 拖 离 视 图 的 边 界 时 调 用 这 个 函 数
Overridables
IsSelected 测 试 一 个 文 档 项 是 否 被 选 中 。 用 于 OLE 支 持
OnActivateView 当 一 个 视 被 激 活 时 调 用
OnActivateFrame 当 包 含 了 视 的 框 架 窗 口 被 激 活 或 失 去 活 动 状 态 时 调 用这 个 函 数
OnBeginPrinting 开 始 打 印 作 业 时 调 用 这 个 函 数 ; 重 载 这 个 函 数 以 分 配图 形 设 备 接 口 ( GD I) 资 源
OnDraw 调 用 这 个 函 数 画 出 文 档 的 图 像 , 用 于 屏 幕 显 示 , 打 印或 打 印 预 览 。 需 要 提 供 其 实 现
OnEndPrinting 当 打 印 作 业 结 束 时 调 用 这 个 函 数 。 重 载 这 个 函 数 以 释放 GDI 资 源 OnEnd PinrtPreview 在 退 出 预 览 模 式 的 时候 调 用 这 个 函 数
OnEndPrint Preview
当 激 活 预 览 模 式 时 调 用
OnPrepareDC 在 为 屏 幕 显 示 调 用 OnDraw 成 员 函 数 或 为 打 印 和 打 印
预 览 调 用 OnPrint 成 员 函 数 之 前 调 用
OnPrepare Printing
在 文 档 被 打 印 或 预 览 之 前 调 用 这 个 函 数 ; 重 载 这 个 函数 以 初 始 化 Print 对 话 框
OnPrint 调 用 这 个 函 数 以 打 印 或 预 览 文 档 的 一 页
OnUpdate 调 用 这 个 函 数 以 通 知 一 个 视 图 , 文 档 已 经 被 修 改
Constructors
Cview 构 造 一 个 CView 对 象
成 员 函 数
CV iew::CView
CView( );
说 明
构 造 一 个 CView 对 象 。 当 生 成 一 个 新 的 框 架 窗 口 或 者 要 分 隔 一 个 窗 口 时 , 框 架将 调 用 这 个 构 造 函 数 。 重 载 OnInitialUpdate 成 员 函 数 以 在 与 文 档 连 接 之 后 初 始化 该 视 图 。
请 参 阅 CView::OnInitialUpdate
CV iew::DoPreparePrinting
BOOL DoPreparePrinting( CPrintInfo* pInfo );
返 回 值
如 果 可 以 开 始 打 印 或 打 印 预 览 , 则 返 回 非 零 值 ; 否 则 返 回 0 。
参 数
pInfo
指 向 一 个 CPrintInfo 结 构 , 它 描 述 了 当 前 的 打 印 作 业 。
说 明
在 你 重 载 的 OnPreparePrinting 函 数 中 调 用 这 个 函 数 以 激 活 Print对 话 框 并 创 建 一个 打 印 机 设 备 环 境 。
这 个 函 数 的 效 果 依 赖 于 它 是 为 打 印 还 是 打 印 预 览 调 用 的 ( 由 pInfo 参 数 中 的m_bPreview 成 员 指 定 ) 。 如 果 某 个 文 件 将 要 被 打 印 , 这 个 函 数 将 使 用 pInfo 所指 向 的 CPrintInfo 结 构 中 的 数 据 来 激 活 Print 对 话 框 ; 当 用 户 关 闭 这 个 对 话 框 的时 候 , 这 个 函 数 根 据 用 户 在 对 话 框 中 指 定 的 设 置 创 建 一 个 打 印 机 设 备 环 境 , 并将 这 个 设 备 环 境 通 过 pInfo 参 数 返 回 。 这 个 设 备 环 境 被 用 于 打 印 文 档 。
如 果 文 件 是 要 被 预 览 , 这 个 函 数 使 用 当 前 的 打 印 机 设 置 创 建 一 个 打 印 机 设 备 环境 ; 这 个 设 备 环 境 在 预 览 过 程 中 被 用 来 仿 真 打 印 机 。
请 参 阅 CPrintInfo, CView::OnPreparePrinting
CV iew::GetDocument
CDocument* GetDocument( ) const;
返 回 值
指 向 与 视 图 相 连 接 的 文 档 的 指 针 。 如 果 这 个 视 图 没 有 与 文 档 相 连 接 , 则 返 回
NULL 。
说 明
调 用 这 个 函 数 以 获 得 视 图 的 文 档 指 针 。 这 使 你 能 够 调 用 文 档 的 成 员 函 数 。
请 参 阅 CDocument
CV iew::IsSelected
virtual BOOL IsSelected(const CObject* pDocItem ) const;
返 回 值
如 果 指 定 的 文 档 项 目 被 选 中 , 则 返 回 非 零 值 ; 否 则 返 回 0 。
参 数
pDocItem
指 向 要 测 试 的 文 档 项 目 的 指 针 。
说 明
由 框 架 调 用 , 检 查 指 定 的 文 档 项 目 是 否 被 选 中 。 这 个 函 数 的 缺 省 实 现 返 回FALSE 。 如 果 你 使 用 CDocItem 对 象 实 现 选 择 , 则 重 载 这 个 函 数 。 如 果 你 的 视 图中 包 含 OLE 项 , 则 必 须 重 载 这 个 函 数 。
请 参 阅 CDocItem, COleClientItem
CV iew::OnActivateFrame
virtual void OnActiveFrame( UINT nState , CFrameWnd* pFrameWnd );
参 数
nstate
指 定 框 架 窗 口 是 被 激 活 还 是 反 之 。 它 可 以 是 下 列 值 之 一 :
-
WA_INACTIVE 框 架 窗 口 将 结 束 激 活 状 态 。
-
WA_ACTIVE 框 架 窗 口 将 通 过 不 同 于 鼠 标 点 击 的 方 式 而 激
活 ( 例 如 ,
通 过 键 盘 接 口 来 选 择 窗 口 ) 。
- WA_CLICKACTIVE 框 架 窗 口 将 通 过 鼠 标 点 击 而 激 活 。
pFrameWnd
指 向 要 激 活 的 框 架 窗 口 的 指 针 。
说 明
当 包 含 视 图 的 框 架 窗 口 要 被 激 活 或 结 束 激 活 状 态 时 , 框 架 就 调 用 这 个 函 数 。 如果 你 希 望 在 与 视 图 相 关 的 框 架 窗 口 被 激 活 或 结 束 激 活 状 态 的 时 候 进 行 特 殊 处理 , 那 么 应 当 重 载 这 个 成 员 函 数 。 例 如 , 当 CFormView 保 存 或 恢 复 具 有 焦 点 的控 件 的 时 候 , 它 就 重 载 了 这 个 函 数 。
请 参 阅 CWnd::OnActivate, CFormView
CV iew::OnActivateView
virtual void OnActivateView( BOOL bActivate , CView* pActivateView , CView*
pDeactiveView );
参 数
bActivate
指 明 该 视 图 是 要 被 激 活 还 是 要 结 束 激 活 状 态 。
pActivateView
指 向 要 激 活 的 视 图 的 指 针 。
pDeactiveView
指 向 要 结 束 激 活 状 态 的 视 图 对 象 的 指 针 。
说 明
当 视 图 被 激 活 或 结 束 激 活 状 态 的 时 候 , 框 架 调 用 这 个 函 数 。 这 个 函 数 的 缺 省 实现 将 焦 点 设 置 到 要 激 活 的 视 图 中 。 如 果 你 希 望 在 视 图 被 激 活 或 结 束 激 活 状 态 的时 候 进 行 特 殊 处 理 , 那 么 应 当 重 载 这 个 函 数 。 例 如 , 如 果 你 希 望 提 供 特 别 的 视觉 效 果 , 使 活 动 的 视 图 与 非 活 动 的 视 图 能 有 区 别 , 你 应 当 检 查 bActivate 的 值 , 并 根 据 结 果 相 应 地 更 新 视 图 的 外 观 。
如 果 应 用 程 序 的 主 框 架 窗 口 被 激 活 , 而 它 的 活 动 视 图 没 有 发 生 变 化 , 那 么pActivateView 和 pDeactiveView 参 数 指 向 同 一 个 视 图 — — 例 如 , 焦 点 是 从 另 一个 应 用 程 序 传 送 到 这 个 应 用 程 序 , 而 不 是 在 应 用 程 序 内 部 从 一 个 视 图 传 送 到 另一 个 视 图 或 是 在 MDI 的 子 窗 口 之 间 传 递 。
当 对 一 个 视 图 调 用 CFrameWnd::SetActiveView , 而 这 个 视 图 与CFrameWnd::GetActive-View 返 回 的 视 图 不 一 致 的 时 候 , 这 些 参 数 也 是 不 同 的 。这 通 常 在 分 隔 窗 口 中 发 生 。
请 参 阅 CWnd::OnActivate, CFrameWnd::SetActiveView, CFrameWnd::GetActiveView
CV iew::OnBeginPrinting
virtual void OnBeginPrinting( CDC* pDC , CPrintInfo* pInfo );
参 数
pDC
指 向 打 印 机 设 备 环 境 。
pInfo
指 向 一 个 CPrintInfo 结 构 , 该 结 构 描 述 了 当 前 的 打 印 作 业 。
说 明
框 架 在 开 始 打 印 或 打 印 预 览 作 业 之 前 , 而 在 OnPreparePrinting 被 调 用 之 后 调 用这 个 函 数 。 这 个 函 数 的 缺 省 实 现 不 做 任 何 操 作 。 重 载 这 个 函 数 以 分 配 打 印 所 需的 GD I资 源 , 如 画 笔 或 字 体 。 在 OnPrint成 员 函 数 内 部 将 这 些 GD I 资 源 选 入 设 备环 境 。 如 果 你 使 用 同 一 个 视 图 对 象 来 执 行 打 印 和 打 印 预 览 , 那 么 对 每 种 显 示 所需 的 GD I资 源 使 用 不 同 的 变 量 ; 这 样 使 你 能 够 在 打 印 的 时 候 更 新 屏 幕 。
你 还 可 以 使 用 这 个 函 数 来 实 现 依 赖 于 打 印 机 设 备 环 境 的 属 性 的 初 始 化 工 作 。 例如 , 打 印 文 档 所 需 的 页 数 依 赖 于 用 户 在 Print 对 话 框 中 指 定 的 设 置 ( 例 如 页 长 度等 ) 。 在 这 种 情 况 下 , 你 不 能 在 OnPreparePrinting 成 员 函 数 中 指 定 文 档 的 长 度 , 而 在 通 常 情 况 下 你 可 以 这 么 做 ; 你 必 须 等 待 , 直 到 已 经 根 据 对 话 框 设 置 创 建 了打 印 机 设 备 环 境 。OnBeginPrinting 是 使 你 能 够 访 问 代 表 了 打 印 机 设 备 环 境 的 C D C
对 象 的 第 一 个 重 载 函 数 , 因 此 你 可 以 在 这 个 函 数 内 部 设 置 文 档 的 长 度 。 注 意 如果 这 时 没 有 直 到 文 档 的 长 度 , 在 预 览 的 过 程 中 将 不 会 显 示 滚 动 条 。
请 参 阅 CView::OnEndPrinting, CView::OnPreparePrinting, CView::OnPrint
CV iew::OnDragEnter
virtual DROPEFFECT OnDragEnter( COleDataObject* pDataObject , DWORD
dwKeyState , CPoint point );
返 回 值
DROPEFFECT 枚 举 类 型 中 的 一 个 值 , 指 明 了 如 果 用 户 在 这 个 位 置 放 下 对 象 时 将会 发 生 的 放 下 动 作 类 型 。 放 下 动 作 的 类 型 通 常 与 dwKeyState 指 明 的 当 前 按 键 状态 有 关 。 标 准 的 从 按 键 状 态 到 DROPEFFECT 值 的 映 射 如 下 :
-
DROPEFFECT_NONE 数 据 对 象 不 能 在 这 个 窗 口 中 放 下 。
-
DROPEFFECT_LINK 对 应 MK_CONTROL|MK_SHIFT , 在 对 象 及 其 服
务器 之 间 建 立 连 接 。
-
DROPEFFECT_COPY 对 应 MK_CONTROL , 创 建 放 下 的 对 象 的 一 个
拷贝 。
-
DROPEFFECT_MOVE 对 应 MK_ALT , 创 建 放 下 的 对 象 的 一 个 拷
贝 并 删除 原 来 的 对 象 。 当 视 图 能 够 接 收 这 个 数 据 对 象 时 , 通 常 这 是 缺 省 的 下 放 效果 。
有 关 的 更 多 信 息 参 见 MFC 高 级 概 念 示 例 OCLIENT 。
参 数
pDataObject
指 向 将 要 被 拖 入 视 图 的 下 放 区 域 的 COleDataObject对 象 的 指 针 。
dwKeyState
包 含 了 特 殊 键 的 状 态 。 这 是 下 列 值 的 组 合 : MK_CONTROL, MF_SHIFT, MK_ALT, MK_LBUTTON, MK_MBUTTON 和 MK_RBUTTON 。
point
相 对 于 视 图 的 客 户 区 域 的 当 前 鼠 标 位 置 。
说 明
当 鼠 标 第 一 次 进 入 下 放 目 标 窗 口 的 非 滚 动 区 域 时 , 框 架 就 调 用 这 个 函 数 。 缺 省的 实 现 不 做 任 何 操 作 , 并 返 回 DROPEFFECT_NON E 。
将 来 可 能 产 生 的 对 OnDragOver 成 员 函 数 的 调 用 重 载 这 个 函 数 。 任 何 对 数 据 对象 要 求 的 数 据 都 在 此 时 获 得 , 以 备 随 后 OnDragOver 成 员 函 数 的 使 用 。 此 时 视图 也 应 当 被 更 新 , 以 给 用 户 视 觉 反 馈 。 有 关 的 更 多 信 息 参 见 “ Visual C++ 程 序员 指 南 ” 中 的 文 章 “ 拖 放 : 实 现 下 放 目 标 ” 。
请 参 阅 CView::OnDragOver, CView::OnDrop, CView::OnDropEx, CView::OnDragLeave, COleDropTarget::OnDragEnter
CV iew::OnDragLeave
virtual void OnDragLeave( );
说 明
当 鼠 标 移 出 窗 口 的 有 效 下 放 位 置 时 , 框 架 调 用 这 个 函 数 。
如 果 当 前 的 视 图 需 要 清 除 在 OnDragEnter 或 OnDragOver 函 数 中 产 生 的 动 作 , 例 如 清 除 对 象 被 拖 动 或 下 放 时 用 户 的 反 馈 , 则 应 当 重 载 这 个 函 数 。
请 参 阅 CView::OnDragEnter, CView::OnDragOver, CView::OnScroll, COleDropTarget::O n- DragLeave
CV iew::OnDragOver
virtual DROPEFFECT OnDragOver( COleDataObject* pDataObject , DWORD
dwKeyState , CPoint point );
返 回 值
DROPEFFECT 枚 举 类 型 中 的 一 个 值 , 它 指 明 了 当 用 户 在 当 前 位 置 下 放 对 象 时 会发 生 的 下 放 动 作 类 型 。 下 放 动 作 的 类 型 依 赖 于 dwKeyState 指 明 的 当 前 按 键 状 态 。从 按 键 状 态 到 DROPEFFECT 枚 举 值 的 标 准 映 射 为 :
-
DROPEFFECT_NONE 数 据 对 象 不 能 在 这 个 窗 口 中 放 下 。
-
DROPEFFECT_LINK 对 应 MK_CONTROL|MK_SHIFT , 在 对 象 及 其 服
务器 之 间 建 立 连 接 。
-
DROPEFFECT_COPY 对 应 MK_CONTROL , 创 建 下 放 的 对 象 的 一 个
拷贝 。
-
DROPEFFECT_MOVE 对 应 MK_ALT , 创 建 下 放 的 对 象 的 一 个 拷
贝 并 删除 原 来 的 对 象 。 当 视 图 能 够 接 收 这 个 数 据 对 象 时 , 通 常 这 是 缺 省 的 下 放 效果 。
有 关 的 更 多 信 息 参 见 MFC 高 级 概 念 示 例 OCLIENT 。
参 数
pDataObject
指 向 要 被 拖 过 下 放 目 标 的 COleDataObject对 象 的 指 针 。
dwKeyState
包 含 了 特 殊 键 的 当 前 状 态 。 它 是 下 列 值 的 组 合 : MK_CONTROL, MK_SHIFT, MK_ALT, MK_LBUTTON, MK_MBUTTON 和MK_RBUTTON 。
point
相 对 于 视 图 的 客 户 区 域 的 当 前 鼠 标 位 置 。
说 明
当 鼠 标 从 下 放 目 标 窗 口 上 方 经 过 时 , 框 架 窗 口 调 用 这 个 函 数 。 缺 省 的 实 行 不 做任 何 操 作 , 并 返 回 DROPEFFECT_NONE 。
重 载 这 个 函 数 以 在 拖 放 操 作 的 过 程 中 向 用 户 提 供 视 觉 反 馈 。 由 于 这 个 函 数 是 连续 调 用 的 , 因 此 这 个 函 数 内 部 的 代 码 必 须 尽 可 能 地 优 化 。 有 关 的 更 多 信 息 参 见“ V isual C++ 程 序 员 指 南 ” 中 的 文 章 “ 拖 放 : 实 现 下 放 目 标 ” 。
请 参 阅 CView::OnDragEnter, CView::OnDrop, CView::OnDropEx, CView::OnDragLeave, COleDropTarget::OnDragOver
CV iew::OnDragScroll
vitual DROPEFFECT OnDragScroll( DWORD dwKeyState , CPoint poin t);
返 回 值
DROPEFFECT 枚 举 类 型 中 的 一 个 值 , 它 指 明 了 当 用 户 在 当 前 位 置 下 放 对 象 时 会发 生 的 下 放 动 作 类 型 。 下 放 动 作 的 类 型 依 赖 于 dwKeyState 指 明 的 当 前 按 键 状 态 。从 按 键 状 态 到 DROPEFFECT 枚 举 值 的 标 准 映 射 为 :
-
DROPEFFECT_NONE 数 据 对 象 不 能 在 这 个 窗 口 中 放 下 。
-
DROPEFFECT_LINK 对 应 MK_CONTROL |MK_SHIFT , 在 对 象 及 其 服
务器 之 间 建 立 连 接 。
-
DROPEFFECT_COPY 对 应 MK_CONTROL , 创 建 下 放 的 对 象 的 一 个
拷贝 。
-
DROPEFFECT_MOVE 对 应 MK_ALT , 创 建 下 放 的 对 象 的 一 个 拷
贝 并 删除 原 来 的 对 象 。
-
DROPEFFECT_SCROLL 指 明 在 目 标 视 图 中 将 要 或 正 在 发 生 一
个 下 放 滚 动操 作 。
有 关 的 更 多 信 息 参 见 MFC 高 级 概 念 示 例 OCLIENT 。
参 数
dwKeyState
包 含 了 特 殊 键 的 当 前 状 态 。 它 是 下 列 值 的 组 合 : MK_CONTROL, MK_SHIFT, MK_ALT, MK_LBUTTON, MK_MBUTTON 和MK_RBUTTON 。
point
相 对 于 视 图 的 客 户 区 域 的 当 前 鼠 标 位 置 。
说 明
框 架 在 调 用 OnDragOver 和 OnDragEnter 之 前 调 用 这 个 函 数 以 确 定 该 点 是 否 位 于滚 动 区 域 。 如 果 你 想 要 为 这 个 时 间 提 供 特 别 的 动 作 , 则 可 以 重 载 这 个 函 数 。 当鼠 标 被 移 进 窗 口 边 界 内 的 滚 动 区 域 时 , 该 函 数 的 缺 省 实 现 自 动 滚 动 窗 口 。 有 关
的 更 多 信 息 参 见 “ Visual C++ 程 序 员 指 南 ” 中 的 文 章 “ 拖 放 : 实 现 下 放 目 标 ” 。
请 参 阅 CView::OnDragEnter, CView::OnDragOver, CView::OnDrop, CView::OnDragLeave,COleDropTarget::OnDragScroll
CV iew::OnDraw
virtual void OnDraw( CDC* pDC =0 );
参 数
pDC
指 向 设 备 环 境 的 指 针 , 该 环 境 被 用 于 画 出 文 档 的 图 像 。
说 明
框 架 调 用 这 个 函 数 以 画 出 文 档 的 图 像 。 框 架 调 用 这 个 函 数 来 实 现 屏 幕 显 示 , 打印 以 及 打 印 预 览 , 在 各 种 情 况 下 , 它 传 递 不 同 的 参 数 。 没 有 缺 省 的 实 现 。
为 了 显 示 你 的 文 档 的 视 图 , 必 须 重 载 这 个 函 数 。 你 可 以 通 过 pDC 指 向 的 CDC 对 象 来 调 用 图 形 设 备 接 口 ( GD I) 。 你 可 以 在 显 示 之 前 将 GDI 资 源 , 如 画 笔 和字 体 等 选 入 设 备 环 境 , 在 显 示 完 成 之 后 , 再 把 它 们 选 出 去 。 通 常 你 的 绘 图 代 码是 与 设 备 无 关 的 , 这 意 味 着 , 它 不 需 要 有 关 显 示 图 形 的 设 备 类 型 的 信 息 。
如 果 要 优 化 绘 图 操 作 , 调 用 设 备 环 境 的 RectVisible 成 员 函 数 以 确 定 一 个 给 定 的
矩 形 是 否 需 要 重 画 。 如 果 你 需 要 区 别 普 通 的 屏 幕 显 示 和 打 印 , 那 么 应 调 用 设 备环 境 的 IsPrinting 函 数 。
请 参 阅 CDC::IsPrinting, CDC::RectVisible, CView::OnPrint, CWnd::OnCreate, CWnd::OnDestroy, CWnd::PostNcDestroy
CV iew::OnDrop
virtual BOOL OnDrop( COleDataObject* pDataObject , DROPEFFECT dropEffect , Cpoint point );
返 回 值
如 果 成 功 地 下 放 , 则 返 回 非 零 值 , 否 则 返 回 0 。
参 数
pDataObject
指 向 将 要 被 放 入 下 放 目 标 的 COleDataObject对 象 。
dropEffect
用 户 要 求 的 下 放 效 果 。
-
DROPEFFECT_COPY 创 建 被 下 放 的 数 据 对 象 的 一 个 拷 贝 。
-
DROPEFFECT_MOVE 将 数 据 对 象 移 动 到 当 前 鼠 标 位 置 。
-
DROPEFFECT_LINK 在 数 据 对 象 和 它 的 服 务 器 之 间 创 建 连 接
。
point
相 对 于 视 图 的 客 户 区 域 的 当 前 鼠 标 位 置 。
说 明
当 用 户 在 有 效 的 下 放 目 标 上 方 放 开 一 个 数 据 对 象 时 , 框 架 调 用 这 个 函 数 。 缺 省的 实 现 不 做 任 何 操 作 , 并 且 返 回 FALSE 。
重 载 这 个 函 数 以 实 现 视 图 的 客 户 区 内 的 OLE 下 放 效 果 。 可 以 通 过 pDataObject
来 检 查 数 据 对 象 的 剪 贴 板 数 据 格 式 和 指 定 点 的 下 放 数 据 。
注 意 如 果 在 这 个 视 类 中 存 在 OnDropEx 的 重 载 函 数 , 则 框 架 不 会 调 用 这 个函 数 。
请 参 阅 CView::OnDragEnter, CView::OnDragOver, CView::OnDropEx, CView::OnDragLeave, COleDropTarget::OnDrop
CV iew::OnDropEx
virtual DROPEFFECT OnDropEx( COleDataObject* pDataObject , DROPEFFECT
dropDefault , DROPEFFECT dropLis t, Cpoint point );
返 回 值
在 point 所 指 定 的 位 置 进 行 的 下 放 动 作 的 效 果 。 它 必 须 是 dropEffectList所 指 定 的值 之 一 。 在 说 明 部 分 讨 论 了 下 放 效 果 。
参 数
pDataObject
指 向 将 要 放 入 下 放 目 标 的 COleDataObject对 象 的 指 针 。
dropDefault
用 户 根 据 当 前 按 键 状 态 选 择 的 下 放 操 作 的 效 果 。 它 可 能 是
DROPEFFECT_NONE 。 在 说 明 部 分 讨 论 了 下 放 效 果 。
dropList
下 放 源 所 支 持 的 下 放 效 果 的 列 表 。 下 放 效 果 值 可 以 通 过 位 或 操 作 符 ( |) 组 合 起 来 。 在 说 明 部 分 讨 论 了 下 放 效 果 。
point
相 对 于 视 图 的 客 户 区 的 当 前 鼠 标 位 置 。
说 明
当 用 户 在 有 效 的 下 放 目 标 上 方 放 开 一 个 数 据 对 象 时 , 框 架 调 用 这 个 函 数 。 缺 省的 实 现 不 做 任 何 操 作 , 并 且 返 回 一 个 空 值 ( -1 ) 以 指 明 框 架 必 须 调 用 OnDrop 处
理 函 数 。
如 果 要 实 现 鼠 标 右 键 的 拖 放 效 果 , 则 应 重 载 这 个 函 数 。 通 常 在 释 放 右 键 的 时 候 , 右 键 拖 放 操 作 会 显 示 一 个 选 择 菜 单 。
你 重 载 的 OnDropEx 必 须 查 询 鼠 标 右 键 的 状 态 。 你 可 以 调 用 GetKeyState 或 者从 OnDragEnter 处 理 函 数 中 保 存 鼠 标 右 键 的 状 态 。
-
如 果 鼠 标 右 键 被 按 下 , 你 的 重 载 函 数 必 须 显 示 一 个 弹
出 菜 单 , 提 供 下 放 源支 持 的 下 放 效 果 。
- 检 查 dropLis t以 确 定 下 放 源 所 支 持 的 下 放 效 果 。 在
弹 出 菜 单 中 仅 使 这 些 动作 有 效 。
- 检 查 dropLis t以 确 定 下 放 源 所 支 持 的 下 放 效 果 。 在
-
使 用 SetMenuDefaultItem 以 根 据 dropDefault来 设 置 缺 省 的 动 作
。
-
最 后 , 执 行 用 户 通 过 弹 出 菜 单 所 选 择 的 动 作 。
-
如 果 鼠 标 右 键 没 有 按 下 , 你 的 重 载 函 数 应 当 将 它 当 作
标 准 的 下 放 请 求 来 处理 。 使 用 dropDefault 中 指 定 的 下 放 效 果 。 另 外 , 你 的 重 载 函 数 业 可 以 返 回空 值 ( -1 ) 以 指 明 将 由 OnDrop 来 处 理 这 个 下 放 操 作 。
使 用 pDataObject 来 检 查 COleDataObject 的 剪 贴 板 数 据 格 式 和 指 定 点 的 下 放 数据 。
下 放 效 果 描 述 了 与 下 放 操 作 相 关 的 动 作 。 参 看 下 面 的 下 放 效 果 列 表 :
-
DROPEFFECT_NONE 不 允 许 下 放 操 作 。
-
DROPEFFECT_COPY 将 执 行 拷 贝 动 作 。
-
DROPEFFECT_MOVE 将 执 行 移 动 动 作 。
-
DROPEFFECT_LINK 将 建 立 被 下 放 数 据 和 原 始 数 据 的 连 接 。
-
DROPEFFECT_SCROLL 指 明 在 下 放 目 标 中 将 要 或 正 在 发 生 下
放 滚 动 操作 。
有 关 设 置 缺 省 菜 单 命 令 的 更 多 信 息 参 见 W in32 文 档 中 的 SetMenuDefaultItem 以及 本 书 中 的 CMenu::GetSafeHmenu 。
请 参 阅 CView::OnDragEnter, CView::OnDragOver, CView::OnDrop, CView::OnDragLeave, COleDropTarget::OnDropEx
CV iew::OnEndPrinting
virtual void OnEndPrinting( CDC* pDC , CPrintInfo* pInfo );
参 数
pDC
指 向 打 印 机 设 备 环 境 的 指 针 。
pInfo
指 向 一 个 CPrintInfo 结 构 , 描 述 了 当 前 的 打 印 作 业 。
说 明
框 架 在 打 印 或 预 览 文 档 之 后 调 用 这 个 函 数 。 这 个 函 数 的 缺 省 实 现 不 做 任 何 操
作 。 重 载 这 个 函 数 以 释 放 你 在 OnBeginPrinting 成 员 函 数 中 分 配 的 GD I 资 源 。
请 参 阅 CView::OnBeginPrinting
CV iew::OnEndPrintPreview
virtual void OnEndPrintPreview( CDC* pDC , CPrintInfo* pInfo , POINT poin t, CPreviewView* pView );
参 数
pDC
指 向 打 印 机 设 备 环 境 的 指 针 。
pInfo
指 向 一 个 CPrintInfo 结 构 , 描 述 了 当 前 的 打 印 作 业 。
point
指 向 在 预 览 模 式 下 最 后 显 示 的 页 面 中 的 位 置 。
pView
指 向 用 于 预 览 的 视 图 对 象 的 指 针 。
说 明
当 用 户 退 出 打 印 预 览 模 式 时 , 框 架 调 用 这 个 函 数 。 这 个 函 数 的 缺 省 实 现 调 用OnEndPrinting 成 员 函 数 并 将 主 框 架 窗 口 恢 复 到 打 印 预 览 开 始 之 前 的 状 态 。 如 果在 预 览 模 式 结 束 的 时 候 需 要 进 行 一 些 特 殊 的 处 理 , 则 应 重 载 这 个 函 数 。 例 如 , 如 果 你 想 要 在 从 预 览 模 式 切 换 到 普 通 显 示 模 式 的 时 候 保 持 用 户 在 文 档 中 的 位置 , 你 可 以 滚 动 到 pInfo 参 数 指 向 的 CPrintInfo 结 构 中 m_nCurPage 所 指 向 的 页 面 , poin t参 数 所 描 述 的 位 置 。
在 你 的 重 载 函 数 中 总 是 要 调 用 基 类 的 OnEndPrintPreview 函 数 , 通 常 是 在 函 数 的
末 尾 。
请 参 阅 CPrintInfo, CView::OnEndPrinting
CV iew::OnInitialUpdate
virtual void OnInitialUpdate( );
说 明
当 视 图 第 一 次 被 连 接 到 文 档 , 但 是 还 没 有 被 显 示 的 时 候 , 框 架 就 调 用 这 个 函 数 。这 个 函 数 的 缺 省 实 现 调 用 OnUpdate 成 员 函 数 , 不 给 任 何 提 示 信 息 ( 这 意 味 着 将lH int设 为 0 , 将 pHint 参 数 设 为 NULL ) 。 如 果 你 想 进 行 一 些 需 要 文 档 信 息 的 一次 性 初 始 化 工 作 , 那 么 应 当 重 载 这 个 函 数 。 例 如 , 如 果 你 的 应 用 程 序 具 有 固 定
大 小 的 文 档 , 你 可 以 利 用 这 个 成 员 函 数 来 根 据 文 档 的 大 小 初 始 化 视 的 滚 动 范围 。 如 果 你 的 应 用 程 序 支 持 可 变 大 小 的 文 档 , 则 每 当 文 档 发 生 变 化 时 , 就 使 用OnUpdate 函 数 来 更 新 滚 动 范 围 。
请 参 阅 CView::OnUpdate
CV iew::OnPrepareDC
virtual void OnPrepareDC( CDC* pDC , CPrintInfo* pInfo = NULL );
参 数
pDC
指 向 设 备 环 境 的 指 针 , 用 于 画 出 文 档 的 图 像 。
pInfo
指 向 CPrintInfo 结 构 的 指 针 , 如 果 OnPrepareDC 是 为 打 印 或 打 印 预 览 调 用的 , 则 该 结 构 描 述 了 当 前 打 印 任 务 , m_nCurPage 成 员 指 定 了 要 打 印 的 页数 。 如 果 OnPrepareDC 是 为 屏 幕 显 示 而 调 用 的 , 则 这 个 参 数 为 NULL 。
说 明
在 为 屏 幕 显 示 而 调 用 OnDraw 成 员 函 数 或 者 为 打 印 或 打 印 预 览 每 一 页 而 调 用
OnPrint成 员 函 数 之 前 , 框 架 调 用 这 个 函 数 。 如 果 这 个 函 数 是 为 屏 幕 显 示 而 调 用
的 , 则 这 个 函 数 的 缺 省 实 现 不 做 任 何 操 作 。 但 是 , 这 个 函 数 在 派 生 类 中 被 重 载 , 例 如 在 CScrollView 中 , 以 调 整 设 备 环 境 的 属 性 , 因 此 , 在 你 的 重 载 代 码 的 开 始部 分 , 总 应 该 调 用 基 类 的 实 现 。
如 果 这 个 函 数 是 为 打 印 而 调 用 的 , 缺 省 的 实 现 检 查 保 存 在 pInfo 参 数 中 的 页 面信 息 。 如 果 没 有 指 定 文 档 的 长 度 , OnPrepareDC 假 定 文 档 只 有 一 页 , 并 且 在 打印 完 一 页 以 后 停 止 打 印 循 环 。 这 个 函 数 通 过 将 结 构 的 m_bContinuePrinting 成 员设 为 FALSE 来 结 束 打 印 循 环 。
如 果 具 有 以 下 的 原 因 , 则 因 重 载 OnPrepareDC :
-
要 为 指 定 的 页 面 调 整 设 备 环 境 的 属 性 。 例 如 , 如 果 你
想 要 设 置 设 备 环 境 的映 射 模 式 或 者 其 它 特 征 , 则 应 在 这 个 函 数 中 完 成 这 些 操 作 。
-
要 实 现 打 印 时 的 分 页 。 通 常 你 应 当 在 打 印 开 始 时 利 用
OnPreparePrinting 成 员函 数 来 指 定 文 档 的 长 度 。 但 是 , 如 果 你 并 不 准 确 地 知 道 文 档 的 长 度 ( 例 如 , 当 打 印 数 据 库 中 未 知 数 量 的 记 录 时 ) , 则 应 重 载 OnPrepareDC 函 数 , 以 在打 印 时 检 测 是 否 到 了 文 档 的 末 尾 。 如 果 已 经 没 有 文 档 需 要 打 印 了 , 将CPrintInfo 结 构 的 m_bContinuePrinting 成 员 设 为 FALSE 。
-
要 按 页 发 送 打 印 机 的 转 义 序 列 码 。 要 在 OnPrepareDC 中 发
送 转 义 序 列 码 , 则 应 调 用 pDC 成 员 的 Escape成 员 函 数 。
请 参 阅 CDC::Escape, CPrintInfo, CView::OnBeginPrinting, CView::OnDraw, CView::OnPre - parePrinting, CView::OnPrint
CV iew::OnPreparePrinting
virtual BOOL OnPreparePrinting( CPrintInfo* pInfo );
返 回 值
如 果 要 开 始 打 印 , 则 返 回 非 零 值 ; 如 果 取 消 了 打 印 任 务 , 则 返 回 0 。
参 数
pInfo
指 向 一 个 CPrintInfo 结 构 , 该 结 构 描 述 了 当 前 打 印 任 务 。
说 明
框 架 在 文 档 被 打 印 或 打 印 预 览 之 前 调 用 这 个 函 数 。 缺 省 的 实 现 不 做 任 何 操 作 。你 必 须 重 载 这 个 函 数 才 能 够 打 印 或 打 印 预 览 。 调 用 DoPreparePrinting 成 员 函 数 , 将 pInfo 参 数 传 递 给 它 , 然 后 返 回 它 的 返 回 值 。
DoPreparePrinting 显 示 Print 对 话 框 并 创 建 一 个 打 印 机 设 备 环 境 。 如 果 你 想 要 用不 同 于 缺 省 值 的 值 初 始 化 Print 对 话 框 , 则 将 这 些 值 赋 给 pInfo 。 例 如 , 如 果 你知 道 文 档 的 长 度 , 在 调 用 DoPreparePrinting 函 数 之 前 将 这 个 值 传 递 给 pInfo 的SetMaxPage 成 员 函 数 。 这 个 值 将 显 示 在 Print 对 话 框 中 范 围 部 分 的 To: 框 中 。
对 于 打 印 预 览 作 业 , DoPreparePrinting 并 不 显 示 Print 对 话 框 。 如 果 你 希 望 在 打
印 作 业 中 跳 过 Print 对 话 框 , 检 查 pInfo 中 的 m_bPreview 成 员 为 FALSE , 在 将它 传 递 给 DoPrepare- Printing 之 前 把 它 设 为 TRU E , 然 后 在 把 它 恢 复 为 FALSE 。
如 果 你 想 要 进 行 的 初 始 化 工 作 需 要 访 问 代 表 打 印 机 设 备 环 境 的 C D C 对 象 ( 例如 , 如 果 你 在 设 定 文 档 长 度 之 前 需 要 知 道 页 面 的 大 小 ) , 则 应 重 载OnBeginPrinting 成 员 函 数 。
如 果 你 想 要 设 置 pInfo 参 数 的 m_nNumPreviewPages 或 m_strPageDesc 成 员 的值 , 则 应 在 调 用 DoPreparePrinting 之 后 进 行 这 些 操 作 。 DoPreparePrinting 成 员函 数 会 把 m_nNum- PreviewPages 设 为 在 应 用 程 序 的 .INI 文 件 中 找 到 的 值 , 并 将m_strPageDesc 设 为 它 的 缺 省 值 。
示 例
如 果 你 在 创 建 起 始 文 件 的 时 候 选 择 了 打 印 选 项 , 则 AppWizard 会 提 供 重 载 的OnPrepare- Printing 函 数 , 下 面 就 是 例 子 。 除 非 你 想 要 初 始 化 Prin t对 话 框 , 否 则这 个 重 载 函 数 的 功 能 已 经 足 够 了 :
BOOL CMyView::OnPreparePrinting( CPrintInfo *pInfo )
{
return DoPreparePrinting( pInfo );
}
请 参 阅 CPrintInfo, CView::DoPreparePrinting, CView::OnBeginPrinting, CView::OnPrepareDC, CView::OnPrint
CV iew::OnPrint
virtual void OnPrint( CDC* pD C , CPrintInfo* pInfo );
参 数
pDC
指 向 打 印 机 设 备 环 境 的 指 针 。
pInfo
指 向 CPrintInfo 结 构 的 指 针 , 该 结 构 描 述 了 当 前 打 印 作 业 。
说 明
框 架 调 用 这 个 函 数 以 打 印 或 预 览 文 档 的 一 页 。 对 于 要 被 打 印 的 每 一 页 , 框 架 在调 用 OnPrepareDC 成 员 函 数 之 后 立 即 调 用 这 个 函 数 。 要 被 打 印 的 页 是 在 pInfo 指向 的 CPrintInfo 结 构 的 m_nCurPage 成 员 中 指 定 的 。 缺 省 的 实 现 调 用 OnDraw 函 数并 将 打 印 机 设 备 环 境 传 递 给 它 。
如 果 具 有 以 下 原 因 , 则 应 重 载 这 个 函 数 :
-
要 允 许 打 印 多 页 文 档 。 仅 画 出 与 当 前 要 打 印 的 页 相 对
应 的 文 档 内 容 。 如 果你 要 OnDraw 函 数 来 绘 图 , 你 可 以 调 整 视 图 口 的 原 点 , 这 样 只 有 文 档 的 适当 的 部 分 才 会 被 打 印 。
-
要 使 打 印 出 来 的 图 像 与 屏 幕 显 示 的 图 像 不 同 ( 如 果 你
的 应 用 程 序 不 是 所 见
即 所 得 的 ) 。 不 应 将 打 印 机 设 备 环 境 传 递 给 OnDraw 函 数 , 而 是 使 用 设 备 环境 , 用 没 有 在 屏 幕 上 显 示 的 属 性 来 画 出 图 像 。
如 果 你 在 打 印 时 需 要 一 些 GDI 资 源 , 而 在 屏 幕 显 示 中 没 有 使 用 它 们 , 则 应 在 绘图 之 前 将 它 们 选 入 设 备 环 境 , 随 后 把 它 们 选 出 。 这 些 GDI 资 源 必 须 在OnBeginPrinting 函 数 中 分 配 , 而 在 OnEndPrinting 函 数 中 释 放 。
- 要 实 现 页 眉 和 页 脚 。 只 要 你 限 制 OnDraw 可 以 打 印 的 区
域 , 你 还 可 以 使 用
OnDraw 函 数 来 绘 图 。
注 意 pInfo 参 数 的 m_rectDraw 成 员 以 逻 辑 单 位 描 述 了 页 面 中 可 以 打 印 的 区 域 。在 你 重 载 的 OnPrin t中 不 要 调 用 OnPrepareDC , 框 架 在 调 用 OnPrin t之 前 自 动 调 用了 OnPrepareDC 。
示 例
下 面 是 重 载 的 OnPrin t函 数 的 基 本 结 构 :
void CMyView::OnPrint( CDC *pDC, CPrintInfo *pInfo )
{
// Print headers and/or footers, if desired.
// Find portion of document corresponding to pInfo->m_nCurPage. OnDraw( pDC );
}
请 参 阅 CView::OnBeginPrinting, CView::OnEndPrinting, CView::OnPrepareDC,
CView::On D raw
CV iew::OnScroll
virtual BOOL CView::OnScroll( UINT nScrollCode , UINT nPos , BOOL bDoScroll
= TRUE );
返 回 值
如 果 bDoScroll 为 TRU E , 并 且 视 图 确 实 被 滚 动 了 , 则 返 回 非 零 值 ; 否 则 返 回 0 。如 果 bDoScroll 为 FALSE , 则 返 回 当 bDoScroll 为 TRUE 时 应 当 返 回 的 值 , 即使 你 没 有 作 实 际 的 滚 动 。
参 数
nScrollCode
滚 动 条 代 码 , 指 明 用 户 的 滚 动 请 求 。 这 个 参 数 由 两 个 部 分 组 成 : 低 字 节确 定 了 水 平 滚 动 的 类 型 , 高 字 节 确 定 了 垂 直 滚 动 的 类 型 :
-
SB_BOTTOM 滚 动 到 底 部
-
SB_LINEDOWN 往 下 滚 动 一 行
-
SB_LINEUP 往 上 滚 动 一 行
-
SB_PAGEDOWN 往 下 滚 动 一 页
nPos
-
SB_PAGEUP 往 上 滚 动 一 页
-
SB_THUMBTRACK 将 滚 动 块 拖 至 指 定 位 置 。 当 前 的 位 置 由
nPos
指定
- SB_TOP 滚 动 到 顶 部
如 果 滚 动 条 代 码 为 SB_THUMBTRACK , 则 包 含 了 当 前 的 滚 动 块 位 置 ; 否 则 没 有 被 使 用 。 根 据 初 始 的 滚 动 范 围 值 , nPos 有 可 能 为 负 值 , 并 且 在必 要 时 应 当 被 强 制 转 换 为 整 数 。
bDoScroll
确 定 你 是 否 需 要 实 际 完 成 指 定 的 滚 动 动 作 。 如 果 该 值 为 TRUE , 则 必 须 执行 滚 动 操 作 ; 如 果 为 FALSE , 则 不 应 执 行 滚 动 操 作 。
说 明
框 架 调 用 这 个 函 数 以 确 定 是 否 能 够 滚 动 。
有 一 种 情 况 是 , 如 果 视 图 接 受 到 一 个 滚 动 条 消 息 , 则 框 架 调 用 这 个 函 数 并 将bDoScroll 设 为 TRU E 。 在 这 种 情 况 下 , 你 必 须 执 行 实 际 的 滚 动 。 其 它 的 情 况 是 , 当 某 个 OLE 项 被 拖 入 下 放 对 象 的 自 动 滚 动 区 域 , 在 发 生 实 际 的 滚 动 之 前 , 框架 调 用 这 个 函 数 并 将 bDoScroll 设 为 FALSE 。 在 这 种 情 况 下 , 你 不 应 当 执 行 实际 的 滚 动 。
请 参 阅 CView::OnScrollBy, COleClientItem
BOOL CView::OnScrollBy( CSize sizeScroll , BOOL bDoScroll = TRUE );
返 回 值
如 果 该 视 图 能 被 滚 动 , 则 返 回 非 零 值 ; 否 则 返 回 0 。
参 数
sizeScroll
水 平 及 垂 直 滚 动 的 像 素 的 数 目 。
bDoScroll
确 定 视 图 的 滚 动 是 否 发 生 。 如 果 该 值 为 TRUE , 则 发 生 了 滚 动 ; 如 果 为
FALSE , 则 没 有 发 生 滚 动 。
说 明
当 用 户 将 OLE 项 拖 到 当 前 视 图 的 边 界 之 外 , 或 者 操 作 水 平 、 垂 直 滚 动 条 , 观 察超 出 文 档 已 显 示 的 部 分 的 内 容 时 , 框 架 就 会 调 用 这 个 函 数 。 缺 省 的 实 现 不 做 任何 操 作 。 在 派 生 类 中 , 这 个 函 数 检 查 该 视 图 在 用 户 请 求 的 方 向 上 是 否 可 以 滚 动 , 然 后 在 必 要 时 更 新 新 的 区 域 。 为 了 执 行 实 际 的 滚 动 请 求 , CWnd::OnHScroll 和CWnd::OnVScroll 自 动 调 用 这 个 函 数 。
virtual void OnUpdate( CView* pSender , LPARAM lHint , CObject* pHint );
参 数
pSender
指 向 修 改 了 文 档 的 视 图 , 如 果 需 要 更 新 所 有 的 视 图 , 则 为 NULL 。
lH int
包 含 了 与 修 改 有 关 的 信 息 。
pHint
指 向 保 存 了 与 修 改 有 关 的 信 息 的 对 象 。
说 明
框 架 在 视 图 的 文 档 被 修 改 后 调 用 这 个 函 数 ; 这 个 函 数 被CDocument::UpdateAllView s调 用 的 , 使 视 图 能 够 更 新 它 的 显 示 以 反 映 那 些 变化 。 它 也 被 OnInitialUpdate 的 缺 省 实 现 所 调 用 。 缺 省 的 实 现 使 整 个 客 户 区 域 无效 , 使 得 下 一 次 接 收 到 WM_PAIN T 消 息 时 重 画 这 些 区 域 。 如 果 你 只 想 更 新 与 文档 的 修 改 部 分 对 应 的 区 域 , 则 应 重 载 这 个 函 数 。 为 此 你 必 须 利 用 提 示 参 数 传 递有 关 修 改 的 信 息 。
如 果 要 使 用 lHin t, 则 应 定 义 特 殊 的 提 示 值 , 通 常 是 位 掩 码 或 枚 举 值 , 并 且 使 文
档 传 递 其 中 的 一 个 值 。 要 使 用 pHin t, 则 应 从 CObject 集 成 一 个 提 示 类 , 并 使 文档 传 递 提 示 对 象 的 指 针 。 当 你 重 载 OnUpdate 函 数 的 时 候 , 应 使 用CObject::IsKindOf 成 员 函 数 来 确 定 提 示 对 象 的 运 行 时 类 型 。
通 常 你 不 用 在 OnUpdate 中 直 接 执 行 任 何 绘 图 操 作 。 相 反 , 确 定 以 设 备 坐 标 表示 的 矩 形 , 描 述 要 更 新 的 区 域 , 将 这 个 矩 形 传 递 给 CWnd::InvalidateRect。 这 会使 下 一 次 接 收 到 WM_PAINT 消 息 时 产 生 绘 图 操 作 。
如 果 lH int 为 0 , pHint 为 NULL , 文 档 将 发 送 一 个 一 般 的 更 新 通 知 。 如 果 一 个视 图 接 收 到 了 一 般 的 更 新 通 知 , 或 者 它 没 有 解 码 出 提 示 , 它 将 会 使 整 个 客 户 区无 效 。
请 参 阅 CDocument::UpdateAllViews, CView::OnInitialUpdate, CWnd::Invalidate, CWnd::InvalidateRect