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以 确 定 下 放 源 所 支 持 的 下 放 效 果 。 在

      弹 出 菜 单 中 仅 使 这 些 动作 有 效 。

  • 使 用 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