1 . 在Visual Studio 中 打 开Scribble 工 程, 首 先 在 预 编 译 头 文 件Stdafx.h 中 添 加ActiveX 文 档 支 持 所 需 要 的 头 文 件:
#include < afxdocob.h >
---- 2 . 打 开 文 件Scribitm.h 和Scribitm.cpp, 把CScribbleItem 类 的 基 类 换 为CDocObjectServerItem, 对 这 两 文 件 进 行 全 程 替 换, 把COleServerItem 换 为CDocObjectServerItem 即 可。
---- 3 . 打 开 文 件IpFrame.h 和IpFrame.cpp, 把CInPlaceFrame 类 的 基 类 换 为COleDocIPFrameWnd, 对 这 两 文 件 进 行 全 程 替 换, 把COleIPFrameWnd 换 为COleDocIPFrameWnd 即 可。
---- 4 . 打 开 文 件Scribble.cpp, 在BOOL CScribbleApp::InitInstance() 函 数 中, 把 下 面 两 行:
EnableShellOpen();
RegisterShellFileTypes(TRUE);
---- 插 入 在 以 下 语 句:
m_pMainWnd- >DragAcceptFiles();
---- 之 后, 并 且 把 下 面 语 句:
m_server.UpdateRegistry(OAT_INPLACE_SERVER);
改 为:
m_server.UpdateRegistry(OAT_DOC_OBJECT_SERVER);
---- 5 . 在ScribDoc.h 文 件 的CScribbleDoc 类 中 加 入 以 下 成 员 函 数:
protected:
virtual CDocObjectServer* GetDocObjectServer
(LPOLEDOCUMENTSITE pDocSite)
{ return new CDocObjectServer(this, pDocSite); }
---- 经 过 上 述 步 骤 改 造 之 后, 重 新 编 译 连 接 得 到 的 程 序 支 持ActiveX 文 档 特 性, 我 们 可 以 运 行Scribble.exe 程 序, 保 存 一 个SCB 文 件(Scribb1.scb 文 件), 并 退 出Scribble.exe 程 序( 为 了 使 浏 览 器 能 识 别SCB 文 件, 必 须 先 单 独 运 行 一 次, 以 便 注 册 必 要 的 信 息); 然 后 在Internet Explorer 中 打 开Scribb1.scb, 则 可 以 得 到 图1 所 示 的 结 果。 如 果 把Scribble1.scb 放 到Web 服 务 器 上, 则 可 以 通 过HTTP 协 议 在 浏 览 器 中 打 开 远 程 的SCB 文 件。
图1 运行在浏览器中的Scribble程序
五、ActiveX 文 档 包 容 器 程 序 的 实 现
---- 我 们 再 来 看 看ActiveX 文 档 包 容 器( 客 户) 程 序 的 实 现 过 程。ActiveX 文 档 包 容 器 程 序 必 须 实 现4 个 接 口:IOleDocumentSite、IOleClientSite、IOleInPlaceSite 和IOleInPlaceFrame, 其 用 途 分 别 如 下:
---- 1 .IOleDocumentSite, 它 是ActiveX 文 档 包 容 器 专 用 的 接 口, 可 使ActiveX 文 档 对 象 直 接 被 包 容 器 程 序 激 活, 而 不 必 按 照 通 常 的 实 地(In-Place) 激 活 对 象 的 方 式 被 激 活。ActiveX 文 档 对 象 调 用IOleDocumentSite::ActiveMe 成 员 函 数 激 活 自 身, 而 不 再 调 用IOleObject::DoVerb 函 数。
---- 2 .IOleClientSite, 这 是OLE 复 合 文 档 技 术 使 用 的 接 口, 也 用 于ActiveX 文 档 技 术。ActiveX 文 档 包 容 器 程 序 实 现 该 接 口,ActiveX 文 档 对 象 通 过 该 接 口 获 取 它 的 显 示 状 态、 显 示 区 域 的 大 小 以 及 包 容 器 提 供 的 其 他 一 些 资 源 信 息。
---- 3 .IOleInPlaceSite, 这 是OLE 复 合 文 档 技 术 使 用 的 接 口, 也 用 于ActiveX 文 档 技 术。ActiveX 文 档 包 容 器 程 序 实 现 该 接 口,ActiveX 文 档 对 象 通 过 该 接 口 控 制 激 活 操 作, 在 进 行 界 面 整 合 操 作 前 给 包 容 器 发 出 通 知。
---- 4 .IOleInPlaceFrame, 它 控 制 包 容 器 应 用 程 序 的 主 框 架 窗 口, 包 括 插 入 菜 单 项 形 成 复 合 菜 单、 控 制 框 架 的 模 式 等。 服 务 程 序 通 过IOleInPlaceFrame 接 口 实 现 菜 单 的 合 并 以 及 一 些 界 面 状 态 的 控 制。
---- Microsoft Visual C++ 6.0 包 含 的MFC 库(6.0 版) 提 供 了 完 全 的ActiveX 文 档 包 容 器 和 服 务 程 序 的 支 持, 通 过AppWizard 可 快 速 生 成ActiveX 文 档 包 容 器 程 序 的 框 架 代 码, 框 架 程 序 包 含 了 所 有 这 些 接 口 的 实 现。MFC 库 实 现ActiveX 文 档 包 容 器 程 序 的 结 构 如 下:
---- 1 . 在CWinApp 的 派 生 类 即 应 用 类 中, 为 支 持OLE 进 行 初 始 化, 在InitInstance 成 员 函 数 中 调 用AfxOleInit(), 对OLE 系 统DLL 进 行 初 始 化。
---- 2 . 虽 然ActiveX 文 档 在 界 面 特 性 上 与 嵌 入 对 象 不 太 一 致, 但MFC 中 实 现 的ActiveX 文 档 对 象 完 全 从 嵌 入 对 象 继 承 过 来, 所 以 用 以 管 理ActiveX 文 档 对 象 的COleDocObjectItem 类 从COleClientItem( 管 理 嵌 入 对 象) 派 生。COleDocObjectItem 类 实 现 了 新 的 接 口IOleDocumentSite, 并 从COleClientItem 继 承 了 接 口 IOleClientSite 和IOleInPlaceSite 的 实 现, 接 口IOleInPlaceFrame 在COleDocObjectItem 的 内 嵌 成 员m_pInPlaceFrame 中 实 现。 因 此,ActiveX 文 档 所 要 求 的 几 个 接 口 均 在COleDocObjectItem 类 中 实 现 了, 而 其 他 的 类, 包 括CWinApp、CDocument 和CFrameWnd 的 派 生 类 不 必 为 支 持ActiveX 文 档 而 增 加 新 的 代 码。
---- 3 . 如 同 处 理 嵌 入 对 象 一 样, 在CView 派 生 类 也 需 要 增 加 一 些 管 理 操 作, 比 如, 创 建ActiveX 文 档、 激 活 对 象、 窗 口 大 小 调 整 等。 创 建 对 象 可 以 直 接 调 用COleClientItem::CreateFromFile、COleClientItem::CreateLinkFromFile 或 者COleClientItem::CreateNewItem 函 数。 在AppWizard 生 成 的 代 码 中, 通 过COleInsertDialog::CreateItem 函 数 创 建 文 档 对 象, 读 者 可 以 根 据 需 要 改 写 这 段 代 码。
---- 利 用Visual C++ 的AppWizard 生 成 包 容 器 工 程 时, 注 意 在Step 3 对 话 框 中, 选 中Active Document Container 选 项, 如 图2 所 示。 完 成 了AppWizard 的 所 有 步 骤 后, 我 们 就 得 到 了 一 个ActiveX 文 档 包 容 器 程 序 的 框 架, 它 可 以 通 过 对 话 框 插 入 任 何ActiveX 文 档, 运 行 结 果 如 图3 所 示, 我 们 可 以 在 框 架 代 码 的 基 础 上 进 行 改 写 或 者 增 加 新 的 代 码, 这 里 不 再 一 一 说 明。
图2 创建ActiveX文档包容器程序时AppWizard选项示意图
图3 VC新建的ActiveX文档包容器程序运行示意图
六、 结 束 语
---- 本 文 介 绍 了ActiveX 文 档 的 特 性 和 结 构, 并 简 单 描 述 了MFC 库 所 提 供 的 支 持, 通 过 例 子 说 明 了 实 现ActiveX 文 档 特 性 并 不 复 杂。 这 种 特 性 可 以 使 一 个 应 用 与Internet/Intranet 联 系 起 来, 也 从 另 一 方 面 为 浏 览 器 提 供 了 扩 展 功 能, 在Internet 网 络 不 断 发 展 的 今 天,ActiveX 文 档 特 性 为 我 们 的 应 用 走 进Internet/Intranet 提 供 了 捷 径。( 全 文 完)