第 10 章 创 建 A c tiv e X 控 件
某 些 人 不 愿 意 学 习 新 东 西 特 别 是 学 习 看 起 来 很 难 很 复 杂 时 更 是 这 样 对许 多 人 说 来 OC X 就 是 这 一 类 的 和 在 DO S 环 境 下 写 设 备 驱 动 程 序 一 样 写OL E 控 件 也 属 于 这 一 类 现 在 M ic ros oft 出 于 某 种 考 虑 已 把 OC X 的 新 版 本 的名 称 改 为 A c tiv e X 许 多 人 会 为 不 想 试 一 试 这 种 技 术 而 找 到 更 多 的 借 口
注 ActiveX 控 件 使 用 了 O C X 扩 展 名 就 象 他 们 设 计 用 来 代 替 的 O L E 控 件 一样
因 为 你 已 经 在 阅 读 这 一 章 了 所 以 我 不 能 不 假 定 你 至 少 已 对 A c tiv e X 控 件背 后 的 技 术 产 生 了 较 浓 的 兴 趣 在 本 章 中 我 们 不 会 做 出 任 何 迷 惑 你 们 这 些 小 伙伴 的 事 事 实 上 我 创 建 的 两 个 程 序 设 计 例 子 非 常 有 用 都 非 常 普 通 我 们来 看 看 如 何 创 建 一 个 新 型 按 钮 on /off 开 关
选 择 这 个 例 子 的 理 由 很 容 易 理 解 大 多 数 人 发 现 与 一 些 熟 悉 的 事 物 打 交道 可 以 缓 解 学 习 新 东 西 的 压 力 另 外 这 个 特 定 的 编 码 例 子 实 现 起 来 极 简 单只 需 用 少 量 时 间 就 能 弄 明 白 它 是 如 何 工 作 的
注 释 本 章 中 的 例 子 是 用 Microsoft Visual C++6.0 开 发 的 使 用 Microsoft Visual C++ 5.x 版 或 4.x 版 都 不 会 有 太 多 麻 烦 用 Borland C+ +或 比Microsoft C++4.x 还 老 的 版 本 编 译 写 出 的 代 码 不 经 修 改 是 不 能 工
作 的 创 建 能 在 每 个 产 品 下 都 能 工 作 的 万 能 例 子 已 经 证 明 是 行 不 通的 无 论 你 决 定 使 用 哪 一 种 程 序 设 计 语 言 产 品 本 章 的 例 子 都 向 你 提供 了 关 于 开 发 O C X 的 有 价 值 的 提 示 或 技 巧 点 拨
— 旦 写 出 了 例 子 的 第 一 个 版 本 应 该 学 几 种 方 法 去 测 试 这 个 新 的 A c tiv e X 控件 看 其 是 否 完 全 安 全 安 全 一 词 在 这 里 意 味 着 在 一 个 产 品 环 境 中 能 使 用这 个 控 件 而 不 是 对 其 安 全 漏 洞 进 行 核 查 尽 管 你 肯 定 想 这 样 干 有 些 人 想一 下 子 就 把 控 件 放 入 最 近 的 HT M L 页 或 产 品 应 用 程 序 中 这 实 际 上 不 是 干 事 情的 最 好 办 法 通 常 在 内 部 环 境 中 ( in- hous e ) 测 试 三 次 投 入 实 际 实 现 中 时 再 测 试一 次 因 为 W ind ow s S c r ip ting H o s t W S H 窗 口 脚 本 主 机 提 供 了 使 用 A c tiv e X 控 件 的 另 外 机 会 所 以 也 要 在 这 个 环 境 中 对 它 们 进 行 测 试 如 果 A c tiv e X 控件 在 In te rn e t 上 不 成 功 你 会 发 现 可 以 限 制 它 们 用 于 公 司 内 部 网 W S H 附 件 或作 为 一 个 应 用 程 序 组 件
注 一 个 ActiveX 控 件 的 完 全 测 试 意 味 着 对 它 能 否 在 应 用 程 序 本 地 HTML 和 远 程 HTML 环 境 中 工 作 还 要 测 试 它 在 W S H 环 境 下 能 否 工 作
本 章 还 要 花 费 时 间 去 讨 论 两 个 AP I 它 们 是 比 照 着 A c tiv e X 控 件 的 参 照 物OC X 开 始 定 义 A c tiv e X 的 可 以 发 现 绝 大 部 分 的 OC X 已 经 工 作 得 很 像 是A c tiv e X 控 件 了 阻 碍 你 使 用 它 们 的 唯 一 障 碍 是 供 货 商 用 什 么 方 式 许 可 使 用它 们 In te rn e t 的 公 共 特 性 使 得 使 用 你 可 能 拥 有 的 控 件 的 当 前 版 本 更 加 困 难 ─
— 大 多 数 供 货 商 允 许 把 它 们 包 括 到 你 创 建 的 应 用 程 序 中 但 不 能 做 为 W e b 页 的一 部 分 这 些 日 子 里 更 多 的 关 注 是 构 造 这 些 控 件 的 方 法 它 们 太 大 了 以 至于 不 能 在 合 理 的 时 间 内 把 它 们 下 载 必 须 记 住 用 户 不 会 仅 仅 是 为 了 看 到 一 个
花 哨 的 屏 幕 按 钮 而 乐 意 于 下 载 一 个 很 大 的 文 件
WEB 链 接 附 录 A 列 出 了 也 许 会 考 虑 添 加 到 工 具 箱 的 第 三 方 的 ActiveX 控件 在 那 里 除 了 可 以 找 到 供 货 商 外 还 可 以 看 一 下 由 NCompass 推 出的 CaptiveX 控 件 CaptiveX 包 括 6 个 控 件 使 你 可 以 使 用 广 告 牌( billboard) 和 轻 型 招 贴 画 (lightpane l) 之 类 的 方 式 显 示 信 息 在http: //www . ncompasslabs. com/ca ptivex/index. htm 可 以 获 得CaptiveX 控 件 的 完 全 演 示 版 与 许 多 演 示 站 点 不 一 样 如 果 安 装 了ScriptActi ve 插 件 可 以 从 这 个 演 示 站 点 下 载 就 可 以 使 用 Netscape Navigator 在 这 个 站 点 工 作
本 章 的 最 后 一 节 打 算 考 察 一 下 R eal A u d io 我 发 现 看 一 下 别 人 在 做 什 么至 少 与 本 章 中 我 们 钻 研 学 习 程 序 设 计 技 术 一 样 重 要 R eal A u d io 提 供 一 个 控 件允 许 你 在 In te rn e t 上 演 奏 音 乐 或 其 它 种 类 的 声 音 事 实 上 可 以 发 现 这 个 控 件 的使 用 遍 及 In te rn e t 原 因 是 它 满 足 了 你 要 知 道 的 两 条 规 则 第 一 这 个 控 件 很 小用 极 少 的 下 载 时 间 就 可 完 成 下 载 任 务 第 二 它 提 供 的 是 流 型 声 音 这 意 味 着用 户 可 以 得 到 即 时 反 馈 实 质 上 用 户 不 会 注 意 下 载 整 个 声 音 文 件 要 用 多 少 时间 因 为 R e a l A ud io 控 件 只 要 得 到 文 件 的 一 小 部 分 就 可 以 开 始 演 奏 音 乐 或 其它 声 音 信 息 了
1 0. 1 理 解 Ac ti ve X 控 件 的 一 些 背 景 知 识
在 真 正 开 始 创 建 A c tiv e X 控 件 之 前 需 考 虑 三 个 问 题 第 一 个 当 然 是 A c tiv e X 控 件 是 什 么 这 个 问 题 引 起 了 不 少 混 乱 所 以 对 它 下 个 定 义 是 很 重 要 的 请 记住 这 是 本 书 的 定 义 一 旦 你 开 始 成 为 迎 合 A c tiv e X 程 序 员 的 新 闻 组 的 常 客 时 就 会 发 现 各 种 其 它 答 案 第 二 件 事 是 我 们 要 讨 论 一 下 一 旦 你 创 建 了 一 个A c tiv e X 控 件 你 能 从 它 得 到 些 什 么 这 个 讨 论 中 还 要 看 用 户 期 待 些 什 么 最后 我 们 需 要 看 一 下 A c tiv e X 控 件 与 使 用 过 的 其 它 控 件 有 什 么 区 别 最 重 要 的是 OC X 和 A c tiv e X 控 件 有 什 么 区 别 下 面 每 一 节 帮 助 你 探 讨 刚 才 提 到 的 一 个 问题
什 么 是 ActiveX
这 里 讲 得 是 你 发 现 的 对 A c tiv e X 所 作 的 最 简 单 的 定 义 A c tiv e X 是 OC X 的高 级 形 式 也 许 把 它 看 作 OL E 的 较 简 单 形 式 更 合 适 但 是 这 个 简 单 定 义 不能 表 达 A c tiv e X 控 件 的 实 质 用 户 认 为 A c tiv e X 就 是 O LE 对 程 序 员 来 说
A c tiv e X 还 是 一 套 用 于 In te rn e t 的 实 能 技 术 它 提 供 了 过 去 没 有 的 一 种 信 息 交 换方 法
注 释 Microsoft 目 前 正 在 开 发 一 种 新 的 Internet 专 用 的 组 件 技 术 称 为COM+ 尽 管 许 多 内 部 网 使 用 了 ActiveX 而 且 ActiveX 依 然 将 用 作应 用 程 序 组 件 但 ActiveX 从 未 在 Internet 上 广 泛 被 采 用 过 ActiveX
在 Internet 上 失 败 的 理 由 有 三 条 组 件 大 小 安 全 考 虑 以 及 缺 乏 对非 Microsoft 浏 览 器 的 兼 容 性 请 谨 记 你 或 许 应 该 考 虑 把 ActiveX 控 件 作 为 公 司 内 部 使 用 的 解 决 方 案 而 不 是 做 为 Internet 的 实 现 技术
作 为 真 正 欣 赏 A c tiv e X 的 程 序 员 就 不 得 不 从 程 序 员 的 角 度 去 看 一 下 OL E 这 就 是 意 味 着 要 看 一 下 OC X 从 用 户 的 角 度 看 OC X 所 做 的 都 是 在 两 个 应 用程 序 或 操 作 系 统 与 一 个 应 用 程 序 之 间 交 换 数 据 OC X 比 数 据 交 换 的 内 涵 要丰 富 得 多 它 们 包 括 着 一 种 称 之 为 组 件 对 象 模 型 (C O M ) 的 概 念 CO M 是 定 义 对象 模 块 间 标 准 二 进 制 接 口 的 规 范 这 个 接 口 定 义 了 函 数 调 用 方 法 基 于 标 准 结构 的 数 据 传 送 技 术 以 及 几 个 标 准 的 函 数 调 用 使 用 CO M 意 味 着 你 写 应 用 程序 模 块 如 OC X 时 使 用 何 种 语 言 都 无 关 紧 要 因 为 模 块 接 口 在 二 进 制 层 次 上是 相 同 的
注 释 写 作 本 书 时 Microsoft 正 在 设 计 WebView 它 是 Internet Explorer 与 Windows 95 系 统 的 Explorer 之 间 的 一 种 集 成 技 术 这 一 新 技 术 使得 对 Web 站 点 的 访 问 就 像 对 Explorer 中 列 出 的 驱 动 器 或 其 它 资 源 的访 问 一 样 容 易 还 可 以 看 到 你 比 较 熟 悉 的 U R L 已 被 普 通 英 文 名 称 所代 替 你 可 以 在 Windows 98 中 看 到 这 一 技 术 的 实 际 运 用
CO M 怎 样 对 你 写 的 应 用 程 序 产 生 影 响 呢 ? 答 案 是 相 当 复 杂 的 原 因 在 于 使用 CO M 的 方 式 众 多 倒 不 是 因 为 技 术 本 身 是 多 么 复 杂 当 用 户 把 一 个 图 形 图像 对 象 放 入 你 的 应 用 程 序 控 制 的 容 器 中 时 你 对 这 个 对 象 知 道 些 什 么 呢 ? 实 际
上 你 只 知 道 是 谁 首 先 创 建 了 它 知 道 这 一 信 息 就 允 许 你 在 这 个 应 用 程 序 中 调 用许 多 服 务 这 些 服 务 包 括 显 示 这 个 图 形 或 允 许 用 户 编 辑 它 实 际 中 你 在 做 的是 共 享 应 用 程 序 的 代 码
程 序 员 也 能 从 使 用 CO M 中 受 益 当 把 一 个 OC X 安 装 到 你 的 程 序 设 计 环 境中 时 实 际 上 你 完 成 了 什 么 呢 ? 大 多 数 情 况 下 你 拥 有 了 一 个 粘 贴 于 窗 体 某 处 的一 个 新 控 件 你 不 必 真 正 地 知 道 控 件 的 内 部 工 作 原 理 唯 一 重 要 的 因 素 是 控件 能 为 你 的 应 用 程 序 做 些 什 么 以 及 如 何 与 它 打 交 道 你 可 以 使 用 标 准 接 口 来调 用 安 装 到 你 机 器 中 的 特 定 代 码 模 块 这 就 是 CO M
A c tiv e X 是 这 种 思 想 的 扩 充 仍 然 使 用 标 准 接 口 但 是 不 再 简 单 地 从 本 地机 器 环 境 或 L AN /W A N 网 的 常 设 连 接 上 调 用 代 码 而 是 从 In te rn e t 调 用 它 另外 这 一 新 的 代 码 能 采 用 a pp le ts 包 含 内 容 的 小 程 序 或 微 小 应 用 程 序 的 形 式
ActiveX 将 为 你 做 些 什 么
OC X 能 为 桌 面 系 统 做 些 什 么 A c tiv e X 就 能 为 In te rn e t 做 同 样 的 事 但 是你 将 在 以 前 从 没 想 到 的 地 方 发 现 A c tiv e X 控 件 例 如 N e t M an a g e ,In c 公 司 计 划创 建 一 个 新 的 电 子 邮 件 客 户 机 称 之 为 Z - M a i l P ro 这 一 软 件 包 支 持 A c tiv e X 技术 的 方 式 是 允 许 用 户 直 接 地 在 消 息 查 看 窗 口 中 交 换 创 建 以 及 查 看 HT M L 文档 这 就 意 味 着 用 户 拥 有 了 创 建 动 态 W e b 页 的 能 力 这 种 能 力 正 是 你 今 天 不得 不 实 际 完 成 的 任 务
远 程 连 接 也 会 从 A c tiv e X 的 使 用 中 受 益 例 如 P rog ine t C o rpora tion 目 前 正在 开 发 把 主 机 (M a in fra m e ) 数 据 带 到 桌 面 系 统 去 的 A c tv e X 技 术 它 的 Fu s io n
FT M S 文 件 传 输 管 理 系 统 可 以 使 用 支 持 OL E 容 器 的 任 何 开 发 语 言 比 如
D e lphi |
V is u a l |
C + + 以 及 Po w e r B u ild e r |
从 本 质 上 看 你 将 把 一 个 A c t iv e X 控 件 |
---|---|---|---|
放 入 一 |
个 窗 体 |
定 义 到 哪 里 去 找 数 据 |
然 后 依 靠 控 件 进 行 连 接 In te rn e t 上 的 远 |
程 访 问 不 再 要 求 用 户 去 钻 过 马 戏 团 中 的 大 铁 圈 了 即 不 用 在 连 接 中 跳 来 跳 去了 主 机 上 一 个 特 殊 的 传 输 服 务 器 通 过 自 动 化 地 处 理 所 有 传 输 请 求 而 完 成 打包 操 作 员 在 客 户 能 访 问 公 司 站 点 之 前 再 也 不 用 人 工 地 为 站 点 下 载 一 个 必 需 的文 件 了
甚 至 于 M ic ros oft E x c h a nge 也 会 从 A c tiv e X 受 益 W a ng L a bora torie s , In c . 和其 它 公 司 正 在 创 建 将 E x ch an g e 和 A c t iv e X 混 合 在 一 起 的 新 的 附 件 W a n g 的 产品 是 客 户 机 / 服 务 器 图 像 附 件 它 允 许 用 户 扫 描 查 看 注 释 操 作 或 打 印 图 形图 像 而 不 用 考 虑 这 些 图 像 位 于 何 处 正 是 这 个 产 品 还 包 括 了 一 个 层 次 存 贮管 理 的 A c tiv e X 控 件 将 这 两 种 技 术 组 合 在 一 起 使 得 在 大 公 司 中 使 用 和 访 问图 形 变 得 容 易 了 它 们 还 使 得 寻 找 一 个 所 需 的 图 形 变 得 容 易 了 这 最 终 导 致 公司 节 约 了 存 贮 空 间
M ic ros oft 自 己 也 发 布 了 许 许 多 多 的 A c tiv e X 控 件 其 中 有 些 可 以 从 M ic ros oft 的 In te rn e t 站 点 ( h ttp : // www. m ic ro s o f t. c o m ) 免 费 下 载 这 些 新 的 控 件 有 用 于P o w e r P o int 的 A n im a tio n P la y e r 以 及 用 于 A cce s s 和 S c he du le + 的 In te rn e t A ssista n t In te rn e t 助 手 A c c e s s 的 In te rn e t 助 手 能 为 要 上 载 的 数 据 库 表 格 拍出 快 照 作 为 静 态 图 像 每 当 用 户 访 问 该 页 时 快 照 都 会 自 动 更 新 S c he du le + 的In te rn e t 助 手 允 许 把 日 程 表 信 息 加 载 到 W e b 页 因 为 每 当 用 户 访 问 站 点 时 都 会自 动 更 新 这 些 数 据 所 以 再 也 不 用 担 心 在 家 上 班 的 雇 员 会 缺 席 会 议 了 最 后
P o w e r P o int 的 动 画 放 映 机 则 允 许 你 在 任 何 兼 容 A c tiv e X 的 浏 览 器 中 演 示
P o w e t P o int 的 演 示 文 稿
最 后 如 果 认 为 A c tiv e X 无 助 于 安 全 性 那 还 要 再 推 敲 一 下 这 些 日 子 里许 多 的 新 的 防 火 墙 和 证 书 策 略 正 在 轮 番 出 现 其 中 一 个 是 N e t2000 N e t2000 是由 许 多 AP I 构 成 的 允 许 开 发 人 员 把 N e t W a re 内 核 服 务 包 括 目 录 安 全 和特 许 证 书 放 入 自 己 的 应 用 程 序 中 你 可 以 在 内 部 网 中 通 过 A c tiv e X 控 件 来 选择 这 个 AP I 这 种 做 法 对 用 户 和 开 发 人 员 有 什 么 帮 助 呢 ? 这 意 味 着 在 适 当 的程 序 设 计 结 构 下 网 络 管 理 员 能 够 追 踪 整 个 网 络 中 的 特 许 使 用 这 种 追 踪 甚 至于 跨 越 In te rn e t 连 接 当 更 多 的 人 开 始 在 家 中 而 不 是 在 办 公 室 中 进 行 计 算 工 作时 这 就 变 成 了 一 个 非 常 重 要 的 课 题
ActiveX 与 OCX 控 件
就 绝 大 多 数 情 况 来 说 A c tiv e X 控 件 和 OC X 控 件 是 完 全 可 以 互 换 的 可 以看 到 与 In te rn e t 风 马 牛 不 相 及 的 A c t iv e X 控 件 广 告 仔 细 一 看 就 会 发 现 在 不久 以 前 这 些 控 件 大 概 还 出 现 在 OC X 控 件 列 表 中 当 然 你 要 仔 细 观 察 这 些 控件 即 使 A c tiv e X 控 件 与 OC X 控 件 确 实 共 享 了 同 一 继 承 A c tiv e X 控 件 与 OC X 控 件 也 不 完 全 是 一 回 事 请 记 住 A c tiv e X 控 件 是 能 够 在 In te rn e t 上 工 作 的
In te rn e t 对 程 序 设 计 环 境 带 来 了 一 些 特 殊 的 挑 战 你 不 再 能 够 奢 求 高 速 装 入OC X 在 因 特 网 环 境 中 使 用 时 其 规 模 成 了 一 个 严 重 的 问 题 下 载 一 个 60K B 的OC X 就 对 用 户 的 耐 心 带 来 了 考 验 而 试 图 下 载 一 个 200K B 的 OC X 大 概 会 导致 用 户 中 断 下 载 而 A c tiv e X 控 件 是 OC X 的 小 型 版 本
注 OCX 和 ActiveX 控 件 的 一 个 主 要 差 别 是 ActiveX 控 件 通 常 要 小 一 些 轻一 些
A c tiv e X 控 件 也 在 受 到 各 种 机 器 专 用 需 求 的 牵 制 在 机 器 上 安 装 OC X 时 安装 程 序 能 对 机 器 进 行 检 测 并 作 出 所 需 的 许 可 对 A c tiv e X 控 件 却 不 能 这 样 要 求在 这 里 你 不 能 对 客 户 机 作 任 何 假 定 客 户 机 可 以 是 新 的 奔 腾 也 许 是 昨 日 的80 38 6 如 果 你 的 A c tiv e X 控 件 确 存 在 某 种 平 台 限 制 那 么 要 么 设 法 解 决 它要 么 肯 定 每 个 使 用 它 的 人 都 清 楚 这 一 限 制
你 还 需 要 应 付 OC X 程 序 员 从 未 想 到 的 情 况 比 如 如 果 浏 览 器 根 本 不 支 持A c tiv e X 时 会 发 生 什 么 ? 目 前 处 理 这 一 问 题 的 方 法 是 浏 览 器 对 那 些 不 知 作 如 何处 理 的 HT M L 标 记 只 是 简 单 地 忽 略 掉 在 这 种 情 况 下 很 容 易 应 付 一 个 与 A c tiv e X 不 兼 容 的 浏 览 器 ─ ─ 只 需 打 出 一 条 消 息 让 用 户知 道 他 们 的 浏 览器不 能 在 当前 页工作并指导 用户换一个浏览器就可 以了
基 于 MFC 与 基 于 ATL 的 控 件
V is u a l C + + 为 了 说 明 它 比 其 它 程 序 设 计 语 言 有 完 善 的 开 发 环 境 它 包 容 了 两种 创 建 A c tiv e X 控 件 的 方 法 M F C 和 AT L A c tiv e 模 板 库 但 是 这 一 灵 活性 也 带 来 了 其 它 开 发 人 员 没 遇 到 的 一 些 问 题 比 如 怎 样 确 定 创 建 哪 一 种 类 型的 控 件 ? 一 些 开 发 人 员 通 过 在 他 创 建 的 所 有 控 件 中 使 用 同 一 种 技 术 来 解 决 这 个问 题 但 这 样 做 本 身 就 表 明 你 还 没 有 真 正 地 钻 研 并 利 用 V is u a l C + + 的 全 部 潜力
注 用 Visual C++ 创 建 ActiveX 控 件 有 两 种 方 法 ATL 和 MFC
确 实 没 有 任 何 理 由 能 肯 定 地 说 在 给 定 的 情 况 下 创 建 控 件 使 用 哪 种 方 法
会 更 好 真 正 需 要 做 的 是 弄 清 楚 你 期 待 控 件 做 些 什 么 你 打 算 对 什 么 进 行 开发 从 而 获 得 所 需 功 能 以 及 你 的 专 业 知 识 水 平 显 然 有 些 情 况 下 创 建 控 件用 这 种 方 法 比 另 一 种 方 法 更 好 因 为 两 种 方 法 确 实 各 有 利 弊 当 把 一 个 AT L A c tiv e X 控 件 与 一 个 M F C A c tiv e X 控 件 作 对 比 时 需 要 考 虑 一 些 因 素 为 了 给你 一 些 对 这 个 问 题 的 基 本 看 法 请 读 完 下 面 列 出 的 各 条 注 意 事 项 从 这 里 会 发现 一 些 对 你 有 用 的 基 本 思 路 从 而 帮 助 你 选 择 一 种 最 好 的 方 案
开 发 速 度 使 用 M F C A c tiv e X C o n tro l W iz a rd M F C A c tiv e X 控 件 生 成 向 导是 创 建 控 件 的 最 快 方 法 这 个 向 导 将 大 部 分 接 口 细 节 管 理 起 来 使 你 最 终 得到 控 件 逻 辑 的 一 个 轮 廓 事 实 上 使 用 AT L 方 法 创 建 控 件 通 常 要 使 开 发 人员 用 两 倍 于 M F C 方 法 的 时 间 显 然 这 还 取 决 于 诸 如 控 件 复 杂 度 以 及程 序 设 计 经 验 之 类 的 因 素
维 护 M F C 和 AT L 共 有 的 特 色 是 使 得 用 它 们 产 生 的 代 码 比 那 些 从 头 开 始写 出 的 代 码 维 护 起 来 要 容 易 得 多 但 是 当 对 一 个 原 来 的 控 件 作 一 些 与维 护 有 关 的 变 化 比 如 找 出 小 毛 病 后 修 改 掉 它 时 就 要 考 虑 一 下 了 AT L 控 件 通 常 包 含 不 多 的 由 向 导 生 成 的 锅 炉 钢 板 型 即 难 懂 的 代 码 因为 对 自 己 写 出 的 代 码 会 更 加 熟 悉 因 而 改 变 起 来 就 更 快 更 容 易 另 一 方 面M ic ros oft 维 护 着 你 使 用 的 M F C 中 所 有 控 件 这 就 是 说 许 多 小 毛 病 的 改 正和 其 它 种 类 的 更 新 只 要 简 便 地 再 把 代 码 编 译 一 次 就 可 以 自 动 地 完 成在 这 种 情 况 下 作 何 种 选 择 确 实 难 以 回 答 因 为 没 有 办 法 能 确 切 地 确 定 在将 来 你 需 要 对 你 的 控 件 作 什 么 样 的 维 护 变 化
控 件 大 小 如 果 要 创 建 最 小 的 A c tiv e X 控 件 那 么 采 取 AT L 方 案 最 好 AT L
把 控 件 的 各 方 面 控 制 权 都 留 给 你 使 得 你 可 以 方 便 地 手 工 调 节 控 件 的 每 个
元 素 而 不 至 于 陷 于 M F C 专 用 代 码 的 泥 潭 基 于 M F C 的 控 件 不 仅 规 模 大而 且 在 用 户 使 用 这 一 控 件 之 前 还 必 须 下 载 M F C 库 这 个 库 也 有 相 当 多 的 代码
学 习 难 度 由 于 创 建 AT L 控 件 时 不 得 不 考 虑 更 多 的 事 情 比 如 接 口 所以 创 建 起 来 比 M F C 控 件 就 更 困 难 多 数 情 况 下 先 用 M F C A c tiv e X C o n tro l W iz a rd M F C A c tiv e X 控 件 生 成 向 导 创 建 几 个 控 件 从 中 学 习 创 建 控 件逻 辑 的 规 则 这 样 做 是 值 得 的
技 巧 如 果 你 用 惯 了 Visual C++ 5.0 的 ATL 那 么 就 尝 试 一 下 6 . 0 版 中 新的 ATL COM App Wizard ATL COM 应 用 程 序 生 成 向 导 新 的 ATL COM AppWizard ATL COM 应 用 程 序 生 成 向 导 帮 助 你 以 比 过 去 手 工 技 术快 得 多 的 速 度 创 建 控 件 但 是 使 用 MFC ActiveX Control Wiza rd MFC Activ eX 控 件 生 成 向 导 创 建 控 件 仍 然 要 比 使 用 ATL COM AppWizard ATL COM 应 用 程 序 生 成 向 导 快 得 多
-
兼
容 性 从 定 义 可 以 看 出 基 于 M F C 的 A c tiv e X 控 件 要 求 客 户 将 M F C 库安 装 到 他 们 的 机 器 上 但 是 有 好 多 种 版 本 的 M F C 库 在 使 用 而 它 们并 不 都 是 相 互 兼 容 的 如 果 用 户 下 载 了 你 的 控 件 及 其 相 关 的 库 但 不 能使 用 某 些 重 要 的 应 用 程 序 因 为 新 库 与 它 们 的 应 用 程 序 不 兼 容 这 时 该怎 么 办 呢 ? 因 为 M F C 库 存 贮 于 SY S T E M 目 录 下 客 户 机 仅 能 拥 有 一 个版 本 到 那 里 找 到 M F C 库 就 能 解 决 兼 容 性 问 题 了
-
使
用 的 难 易 程 度 M F C A c tiv e X C o n tro l W iz a rd M F C A c t iv e X 控 件 生成 向 导 对 你 写 控 件 代 码 的 能 力 不 作 多 少 要 求 所 以 它 把 它 所 拥 有 的 一
切 都 放 进 了 控 件 之 中 这 意 味 着 你 最 终 可 以 得 到 十 分 丰 富 的 接 口 但 其中 有 的 对 你 来 说 或 许 用 不 着 这 一 功 能 性 浪 费 导 致 了 控 件 规 模 的 膨 胀并 且 使 得 它 难 于 使 用
- 代
码 修 改 的 难 易 程 度 开 始 时 创 建 基 于 M F C 的 控 件 是 非 常 容 易 的因 为 向 导 把 许 多 代 码 都 添 加 好 了 所 以 应 用 程 序 开 发 进 程 很 快 你 只 需关 注 把 你 的 控 件 做 得 出 色 的 细 节 如 果 创 建 的 控 件 投 入 使 用 后 不 需 作 什么 修 改 选 择 M F C 显 然 是 上 策 但 是 如 果 决 定 要 更 新 控 件 时 该 怎 么办 ? 你 的 源 代 码 文 件 包 括 了 大 量 代 码 这 些 代 码 不 是 由 程 度 员 写 出 来的 需 要 用 额 外 的 时 间 去 研 究 理 解 它 们 因 此 如 果 计 划 经 常 会 对 代码 作 修 改 那 么 选 择 AT L 将 是 上 策 因 为 当 控 件 中 由 程 序 员 生 成 的代 码 出 了 什 么 事 时 程 序 员 处 理 起 来 就 容 易 多 了
1 0. 2 一 个 基 于 MF C 的 基 本 按 钮 编 程 示 例
在 我 的 机 器 上 我 想 不 出 有 哪 一 个 程 序 不 用 到 一 两 个 按 钮 事 实 上 按 钮是 为 数 不 多 的 可 以 说 是 每 个 应 用 程 序 都 要 用 到 的 W ind ow s 控 件 之 一 即 使 是在 一 个 简 单 对 话 框 中 显 示 信 息 的 应 用 程 序 中 通 常 也 要 在 用 完 对 话 框 后 关 闭 它时 使 用 OK 按 钮 只 要 说 按 钮 或 某 些 程 序 设 计 环 境 中 所 说 的 命 令 按 钮 是 使你 机 器 正 常 运 转 的 一 个 控 件 就 够 了 它 还 是 绝 对 能 为 你 提 供 全 部 所 需 特 色 而且 程 序 员 改 变 最 多 的 一 个 控 件
注 按 钮 是 每 个 应 用 程 序 都 使 用 的 一 个 控 件 也 是 对 定 制 控 件 的 潜 力 进 行
讨 论 时 最 好 的 入 口 点
程 序 员 对 一 个 控 件 的 用 途 作 了 这 么 多 的 强 调 但 这 并 没 有 用 去 我 多 少 时 间使 我 不 能 在 本 章 的 这 一 节 中 确 定 用 哪 一 种 控 件 向 你 说 明 如 何 去 对 它 进 行 修 改我 还 想 增 加 一 个 新 特 色 你 也 许 在 按 钮 中 并 没 有 发 现 这 一 特 色 而 这 个 特 色 最终 是 每 个 人 都 必 需 的 正 是 为 了 说 明 下 述 特 色 我 才 选 择 O n / O f f 按 钮 作 为 本章 中 控 件 的 基 础 ─ ─ 就 好 象 在 进 行 应 用 程 序 设 计 中 每 个 人 要 打 开 / 关 闭 某 个 东 西一 样 将 这 种 特 色 内 置 于 你 使 用 的 控 件 之 中 是 非 常 好 的 对 于 从 V is u a l C + + 中得 到 的 缺 省 控 件 来 说 我 还 增 加 了 其 它 几 个 特 色 尽 管 我 的 这 个 按 钮 也 许 不 能将 商 业 化 程 序 中 所 用 控 件 的 花 哨 特 色 全 部 囊 括 但 它 能 帮 你 开 始 创 建 你 自 己 的定 制 控 件
定 义 工 程
从 用 户 和 程 序 员 两 个 角 度 来 说 本 章 前 面 讨 论 过 开 发 A c tiv e X 控 件 的 一 些规 则 现 在 再 从 程 序 员 角 度 深 入 探 讨 一 下 在 开 始 讨 论 第 一 个 程 序 设 计 例 子 之前 我 们 快 速 地 看 一 下 定 义 一 个 具 体 的 A c tiv e X 控 件 必 须 记 住 哪 些 规 则 下列 的 建 议 可 以 加 深 你 对 创 建 A c tiv e X 控 件 必 须 遵 守 的 一 些 特 殊 约 束 的 理 解
技 巧 尽 管 使 用 能 生 成 OCX 的 编 译 器 就 能 创 建 ActiveX 控 件 但 你 会 发现 使 用 Microsoft Visual C++ 4.2 版 以 上 产 品 将 会 为 你 节 约 许 多时 间 你 在 本 章 还 会 看 到 要 使 OCX 像 ActiveX 控 件 那 样 正 确 地 工 作哪 怕 在 最 好 的 环 境 中 也 需 要 一 些 额 外 的 步 骤 使 用 旧 版 编 译 器 意 味
着 你 需 要 用 D O S 命 令 行 工 具 来 处 理 额 外 的 步 骤 Microsoft Visual C++ 编 译 器 的 4 . 2 及 5 . x 都 把 这 些 工 具 作 为 软 件 包 的 一 部 分 而 且 将 它 们的 使 用 自 动 化 了
- 保
持 代 码 小 型 化 经 验 告 诉 我 们 应 该 保 持 A c tiv e X 控 件 的 体 积 在 40K B 以下 通 常 用 户 不 想 下 载 庞 大 的 仅 能 用 于 对 页 面 图 形 作 动 画 处 理 的 控 件实 在 没 办 法 时 把 一 个 大 的 组 件 分 成 几 个 小 的 功 能 块 来 实 施
技 巧 还 可 以 像 第 8 章 讨 论 过 的 那 样 把 控 件 压 缩 进 C A B 文 件 也 能 够 减 少下 载 规 模
-
使
用 最 少 的 持 久 数 据 一 些 OC X 要 求 大 量 的 持 久 数 据 来 完 成 任 务 例 如你 可 能 会 把 一 个 电 子 表 格 控 件 粘 贴 到 窗 体 上 而 没 想 到 它 所 包 含 的 持 久 数据 的 数 量 A c tiv e X 控 件 没 有 这 般 奢 侈 因 为 你 不 能 对 客 户 机 有 太 多 的 假 设持 久 数 据 不 仅 增 加 装 入 时 间 和 内 存 需 求 而 且 扩 大 了 控 件 自 身 的 规 模
-
将
功 能 特 色 限 制 在 最 低 限 度 众 多 的 功 能 的 确 能 为 屏 幕 演 示 增 光 添 彩 为本 地 机 器 编 写 OC X 时 几 个 额 外 特 色 不 会 增 加 什 么 问 题 事 实 上 如 果 不包 括 它 们 就 会 使 多 数 程 序 员 感 到 吃 惊 但 传 输 时 间 的 确 是 In te rn e t 的 一 大 问题 向 控 件 中 每 增 加 一 个 不 是 真 正 必 需 的 图 形 或 其 它 特 殊 声 音 效 果 都 要增 加 装 入 时 间 并 且 降 低 控 件 的 价 值 A c tiv e X 控 件 甚 至 不 能 假 定 一 些 特殊 效 果 是 否 能 够 在 客 户 机 上 正 确 工 作 举 例 来 说 客 户 机 可 能 没 有 声 卡
-
功
能 单 一 是 关 键 建 库 的 原 始 动 机 之 一 是 用 容 易 访 问 的 形 式 存 贮 大 量预 编 译 过 的 函 数 调 用 作 为 OC X 的 前 辈 DL L 存 在 的 理 由 正 在 于 此 你 会
发 现 市 场 上 的 许 多 OC X 如 DL L 都 不 止 包 含 一 个 对 象 如 按 钮 事实 上 它 们 包 含 了 一 簇 对 象 这 一 策 略 对 于 桌 面 系 统 来 说 当 然 很 不 错 但 到了 In te rn e t 上 就 行 不 通 了 要 保 证 在 一 个 控 件 中 保 持 一 个 对 象 遵 循 这 样 的原 理 去 模 块 化 控 件 确 保 了 用 户 不 必 下 载 他 们 绝 对 需 要 功 能 以 外 的 东 西
注 释 本 章 中 还 将 对 对 象 进 行 相 当 多 的 讨 论 本 章 中 每 个 对 象 都 是 Windows 对 象 或 C O M 使 用 的 特 殊 形 式 一 些 C + + 程 序 员 可 能 认 为 Windows 对 象 就 是 C++ 对 象 因 为 C O M 使 用 一 种 特 殊 形 式 的 Windows 对 象这 些 程 序 员 就 认 为 使 用 手 边 的 C + + 对 象 写 O C X 不 会 出 问 题 越 过 真理 一 步 就 是 谬 误 尽 管 可 以 用 C + + 对 象 创 建 Windows 对 象 但 存 在 一些 限 制 本 章 篇 幅 不 足 以 全 面 讨 论 C++程 序 设 计 中 对 象 的 种 种 复 杂 性
─ ─ 这 个 题 目 一 些 作 者 要 用 一 章 或 两 章 的 篇 幅 来 作 综 述 性 讨 论 ─ ─ 但 是 了 解 一 下 对 于 用 C++写 OCX 时 能 做 些 什 么 以 及 应 做 些 什 么 有哪 些 限 制 都 是 很 重 要 的 最 好 按 照 本 章 例 子 中 的 方 法 去 写 O C X 这样 才 不 会 出 问 题
测 试 测 试 再 测 试 仅 仅 在 本 地 或 仅 仅 在 网 络 上 测 试 A c tiv e X 控 件 都 是 不够 的 应 该 使 用 不 同 的 连 接 在 多 种 情 况 下 进 行 测 试 本 章 最 后 会 看 到 三个 层 次 的 本 地 测 试 以 及 一 个 层 次 的 针 对 In te rn e t 的 测 试 可 能 你 想 再 加 进 几个 层 次 的 测 试 根 本 上 说 你 对 一 个 A c tiv e X 测 试 永 远 不 嫌 多 在 发 布控 件 之 前 测 试 它 是 重 要 的 但 在 出 问 题 后 一 定 要 去 查 出 缺 陷 所 以 要 使A c tiv e X 控 件 正 常 工 作 维 护 精 确 的 问 题 日 志 也 很 重 要 的
编 写 代 码
现 在 到 了 看 一 下 简 单 编 码 示 例 的 时 候 了 本 章 使 用 M ic ros oft V is u a l C + + 6 . 0
尽 管 你 能 够 使 用 4 .2 以 上 版 本 这 在 前 面 已 提 到 过 让 我 们 开 始 创 建 一 个 C+ + 新 工 程 但 是 与 你 创 建 过 的 其 它 工 程 不 一 样 现 在 要 用 M F C A c tiv e X C o n tro l W iz a rd M F C A c tiv e X 控 件 生 成 向 导 来 创 建 工 作 区 现 在 开 始 吧 使 用 F lie文 件 |N e w 新 建 命 令 系 统 显 示 N e w 新 建 对 话 框 选 择 P ro ject T a b
工 程 页 则 会 看 到 如 下 所 示 的 对 话 框
该 对 话 框 中 的 M F C A c tiv e X C o n tro l W iz a rd M F C A c tiv e X 控 件 生 成 向 导 就 是 开 始 创 建 本 工 程 的 那 个 选 项 这 个 向 导 提 供 了 一 个 OC X 框 架 通 过 建 立 这个 框 架 来 创 建 本 例 的 最 后 版 本
注 释 本 例 中 我 使 用 了 新 的 Microsoft Developer Studio 开 发 人 员 工 作室 看 到 的 所 有 的 屏 幕 图 像 都 是 Windows 95 下 的 如 选 择 使 用 老的 界 面 你 的 屏 幕 图 像 就 会 与 这 儿 的 图 像 不 一 样 即 便 你 也 在 使 用Developer Studio 接 口 因 为 这 一 产 品 提 供 的 配 置 选 项 可 以 修 改 因 此 仍 可 能 产 生 一 些 小 的 差 别
工 程 开 始 时 在 P ro je c t N a m e 工 程 名 域 中 键 入 工 程 名 本 例 用 OC XE x m p l 作 为 工 程 名 在 工 程 列 表 框 中 单 击 M F C A c tiv e X C o n tro l W iz a rd M F C A c tiv e X 控 件 生 成 向 导 然 后 单 击 OK M ic ros oft V is u a l C + + 自 动 选 择 了 W in 3 2 选 项它 还 创 建 了 一 个 工 程 目 录
接 下 来 你 看 到 的 是 M F C A c tiv eX C o n tro l W izard M F C A c tiv e X 控 件 生 成 向导 屏 幕 的 两 个 对 话 框 我 采 用 了 这 两 个 对 话 框 的 缺 省 设 置 但 对 第 二 个 对 话框 的 s ubc la s s 子 类 域 作 了 选 择 如 果 你 也 想 创 建 像 这 个 例 子 一 样 的 控 件 那么 在 这 个 域 中 选 择 B U TTO N 类 否 则 可 以 浏 览 可 用 类 的 列 表 框 以 确 定 用 什么 作 为 你 的 控 件 的 基 础 还 要 注 意 到 V is u a l C
-
- 允 许 创 建 自 己 的 基 类
在 第 二 个 向 导 屏 幕 上 单 击 F in is h 完 成 按 钮 后 则 会 看 到 如 下 的 N e w P ro je c t In fo rm a tio n 新 工 程 信 息 对 话 框
浏 览 一 下 所 提 供 的 功 能 列 表 确 认 工 程 中 包 含 了 你 所 需 要 的 一 切 内 容 核对 工 程 建 立 无 误 后 单 击 OK 则 启 动 了 工 程 V is u a l C + + 将 使 硬 盘 转 动 一 会 儿然 后 就 会 看 到 工 程 框 架
修 改 缺 省 的 About 对 话 框
现 在 已 有 了 一 个 框 架 我 们 把 它 填 充 好 我 总 是 先 处 理 简 单 的 事 情 谁 不是 这 样 呢 首 先 修 改 A bout 对 话 框 V is u a l C + + 自 动 为 你 创 建 这 个 对 话 框
你 需 要 做 的 事 就 是 定 制 它 访 问 A bout 框 很 容 易 使 用 V ie w 视 图 |R es o u rce S y m bo ls 资 源 符 号 命 令 则 显 示 出 如 下 图 所 示 的 R e s ourc e S y m bo ls 资 源 符 号 对 话 框
选 择 IDD _ AB O U T B OX - O C XE XM P L 项 单 击 V ie w U s e 按 钮 显 示 该 对 话 框图 10 .1 显 示 了 修 改 示 例 中 A bout 对 话 框 的 一 种 方 法 也 许 你 想 把 版 权 信 息 以 及公 司 信 息 也 包 含 到 A bout 对 话 框 中 请 留 意 M ic ros oft 为 对 话 框 提 供 了 多 种 工 具其 中 之 一 是 定 制 控 件 按 钮 你 能 够 把 另 一 个 OC X 贴 到 A bout 对 话 框 或 其 它 你 创建 的 对 话 框 中
技 巧 用 右 键 单 击 一 个 控 件 然 后 从 上 下 文 相 关 菜 单 中 选 择 Properties 属性 于 是 Properties 属 性 对 话 框 显 示 出 来 通 过 改 变 Properties 属 性 对 话 框 中 General 普 通 的 属 性 页 上 的 Caption 标 题 属 性 可 以 改 变 静 态 文 本 控 件 的 文 本 用 右 键 单 击 Visual C++ 的 大部 分 对 象 都 会 显 示 一 个 上 下 文 相 关 菜 单 ─ ─ 大 部 分 这 样 的 菜 单 中 都包 含 Properties 属 性 选 项 用 右 键 单 击 Visual C++中 某 个 对 象的 目 的 就 在 于 让 你 看 到 能 够 对 这 个 特 定 对 象 做 些 什 么 请 记 住 对象 不 仅 仅 指 控 件 它 也 可 以 是 代 码 行 工 具 栏 甚 至 可 以 是 各 种 窗 口
V is u a l C + + 的 最 新 版 本 可 能 要 求 你 对 A bout 对 话 框 做 一 些 过 去 不 必 做 的 事你 可 能 需 要 为 A bout 对 话 框 创 建 一 个 类 ─ ─ V is u a l C + + 的 老 版 本 只 是 假 定 你 会创 建 新 类 双 击 A bout 对 话 框 则 看 到 A dd ing a C la s s 添 加 类 对 话 框 如 下图 所 示 若 没 看 到 该 对 话 框 则 说 明 已 有 一 个 类 赋 给 了 A bout 对 话 框 你 不 必再 往 下 继 续 做 了
图 10 .1 该对 话框 编辑 器看起 来和 V isu a l B a sic 的一 样 区别 在于你必 须在 主编 辑器屏 幕中 单独 访问它
选 择 C reat a N e w C las s 创 建 新 类 选 项 单 击 OK V is u a l C + + 则 显 示 如下 的 N e w C la s s 新 类 对 话 框
我 们 这 儿 用 C A bou tB o x 作 为 类 名 把 它 键 入 到 N a me 名 称 域 这 时 这个 例 子 所 需 的 一 切 都 准 备 好 了 单 击 OK 则 创 建 所 需 的 类 这 时 就 会 看 到在 M F C C la s s W iz a rd 类 向 导 对 话 框 中 出 现 了 一 个 新 项 如 下 图 所 示 如 果屏 幕 显 示 不 是 这 样 那 么 选 一 下 C la ssIn fo 选 项 卡 即 可
这 个 对 话 框 把 新 类 的 有 关 信 息 都 显 示 出 来 H ead e r 头 文 件 及 S ourc e 源码 两 项 是 与 这 个 类 相 关 的 文 件 的 存 放 位 置 你 还 会 看 到 这 个 类 的 对 话 框 资源 是 IDD _ AB O U T B OX _ OC XE XM P L 单 击 OK 关 闭 M F C C la s s W iz a rd ( 类 向导 对 话 框
添 加 属 性 及 事 件
定 制 对 话 框 的 工 作 很 有 趣 现 在 就 让 我 们 继 续 创 建 OC X 吧 首 先 要 完 成 的工 作 是 使 按 钮 控 件 的 某 些 属 性 和 事 件 让 使 用 该 OC X 控 件 的 人 能 够 访 问 即 可见 例 如 在 用 户 单 击 按 钮 时 要 能 检 测 到 这 个 事 件 肯 定 你 想 改 变 缺 省 的 属性 如 按 钮 正 面 上 显 示 的 标 题 等 第 一 次 创 建 这 个 按 钮 时 没 有 多 少 属 性 是 可见 的 为 了 使 这 些 元 素 成 为 可 见 状 态 需 要 使 用 C las s W izard 类 向 导 使 用V ie w 视 图 |C la s s W izard 类 向 导 命 令 系 统 显 示 M F C C la s s W iz a rd 类向 导 对 话 框 选 取 A u to m a tio n 自 动 化 这 一 页 然 后 在 C la ss N a m e 类 名 域 选 择 OC XE x m p l C tr l
注 Visual C++ 对 你 创 建 的 控 件 作 的 假 设 非 常 少 甚 至 于 使 用 什 么 属 性 和方 法 使 控 件 可 见 也 不 做 任 何 假 定
在 这 个 例 子 中 使 用 了 两 类 不 同 的 属 性 实 际 上 M ic ros oft 提 供 了 许 多 供 你使 用 的 属 性 第 一 种 是 常 备 (S to c k ) 属 性 你 会 发 现 第 一 次 创 建 OC X 时 就连 我 们 都 认 为 是 理 所 当 然 的 C a p tio n 标 题 属 性 等 等 一 类 事 物 都 是 不 可 见 的常 备 属 性 在 图 10 .2 中 用 S 表 示 是 由 父 类 缺 省 支 持 的 一 种 属 性 另 一 种 是 定制 属 性 在 图 10 .2 中 用 C 表 示 定 制 属 性 是 把 一 个 特 定 类 作 为 子 类 时 你 向 它添 加 的 属 性 其 中 之 一 是 我 们 将 用 于 创 建 一 个 O n O ff 控 件 的 O n O f f 属 性 本 章下 面 来 讨 论 做 这 些 事 的 过 程 图 10 .2 显 示 了 创 建 我 们 例 子 时 所 有 属 性 的 完 整 列表
注 常 备 属 性 是 基 类 的 一 部 分 定 制 属 性 是 把 控 件 作 成 子 类 时 创 建 的 属 性
图 10 .2 M F C C la s s W iz a rd 类向 导 使 属性及 事件 对 OC X 用 户 成为 可见 状态
创 建 新 属 性 的 过 程 很 简 单 只 要 单 击 一 个 A dd P rope r ty 添 加 属 性 按 钮 就可 以 显 示 出 下 图 所 示 的 A dd P ro p e r ty 对 话 框
A dd P rope r ty 添 加 属 性 对 话 框 中 包 含 一 些 以 前 我 们 未 曾 见 到 过 的 重 要 特性 Ex te rn a l N a m e 组 合 框 包 含 了 创 建 OC X 时 选 择 的 基 类 的 全 部 缺 省 属 性在 我 们 的 例 子 中 就 可 见 到 C a p tio n 属 性 等 为 了 创 建 常 备 属 性 从 这 个 列 表中 选 一 项 并 单 击 OK 即 可 V is u a l C + + 将 处 理 细 节 现 在 接 着 创 建 出 本 例 子 程序 中 的 全 部 常 备 属 性 参 见 图 10 .2
我 们 还 需 要 三 个 定 制 属 性 M oda l R e s u lt O n O ff 及 S tdB u ttonT y p e 为 了 创建 它 们 把 它 们 键 入 到 刚 才 提 到 的 Ex te rn a l N a m e 外 部 名 称 域 中 然 后 需 要在 T y p e 类 型 字 段 中 为 它 们 选 择 数 据 类 型 在 我 们 例 子 中 M oda l R e s u lt 和S tdB u ttonT y p e 属 性 是 long 型 而 O n O ff 是 B OOL 型 在 这 里 你 可 能 要 先
关 闭 M F C C la s s W iz a rd 类 向 导 对 话 框 然 后 再 打 开 它 否 则 在 有 些 时 候你 选 择 的 属 性 可 能 没 记 录 下 来
这 个 例 子 中 我 们 使 用 的 事 件 都 是 常 备 的 他 们 来 自 于 按 钮 基 类 的 一 部 分 要 做 的 是 单 击 A c tiv e X E v e n ts 事 件 页 系 统 显 示 如 图 10 .3 所 示 添 加 常 备事 件 的 做 法 与 添 加 一 个 常 备 属 性 的 方 法 一 样 只 需 单 击 A dd E v e n t 添 加 事 件 按 钮 显 示 出 A dd E v e n t 添 加 事 件 对 话 框 从 Ex te n a l N a m e 外 部 名 称 组 合框 中 选 取 一 个 常 备 的 名 称 然 后 单 击 OK 即 可 图 10 .3 显 示 了 需 要 为 这 个 例 子选 择 的 全 部 常 备 事 件
定 义 属 性 页
现 在 该 向 属 性 页 中 添 加 一 些 功 能 了 访 问 属 性 页 的 方 法 与 访 问 A bout 对 话框 的 方 法 相 同 就 是 使 用 V ie w 视 图 |R es o u rce S y m b o ls 资 源 符 号 命 令在 R e s o u rce S y m b o ls 资 源 符 号 对 话 框 选 择 IDD _ P R OP P AGE _ O C X E X M P L 项 属 性 页 用 途 广 泛 其 中 绝 大 多 数 是 面 向 配 置 的
V is u a l C + + 支 持 两 种 标 准 规 格 的 属 性 页 OC X 的 缺 省 选 择 是 250 62 的 小号 规 格 这 种 规 格 对 我 们 的 目 的 说 来 太 小 了 所 以 需 要 把 它 变 成 250 110 的 大号 属 性 页 创 建 一 个 控 件 时 一 定 要 确 定 用 这 一 种 还 是 另 一 种 你 不 用 标 准 尺 寸时 也 不 会 发 生 什 么 坏 事 但 用 户 可 能 会 收 到 警 告 信 息 说 你 没 使 用 标 准 尺 寸 的属 性 页
图 10 .3 A c t iv e X 事件 页显 示了 在我们 的 OC X 程 序 例 子 中 要 添 加的全 部常 备事件
现 在 要 完 成 的 工 作 是 为 向 页 中 定 义 标 准 的 按 钮 类 型 来 添 加 一 种 方 法 如图 10 .4 所 示 它 们 是 单 选 按 钮 你 需 要 10 个 按 钮 现 在 不 必 担 心 如 何 配 置 它们 下 述 段 落 中 会 进 行 讲 解 每 个 单 选 按 钮 应 有 不 同 的 ID 以 便 于 能 检 测 出用 户 单 击 的 是 哪 一 个 参 见 R a d io B u tton P rope r tie s 单 选 按 钮 属 性 对 话 框
中 G e n e ra l 页 上 的 ID 域
图 10 .4 P ro p e r ty P a g e 属性 页 对 话框允 许用 户创 建除 on /o f f 按钮 之外 的标 准按钮 类型
属 性 页 上 已 有 了 10 个 标 准 的 单 选 按 钮 现 在 让 它 们 完 成 一 些 任 务 用 右 键单 击 其 中 一 个 单 选 按 钮 从 上 下 文 菜 单 中 选 择 P rope r tie s 属 性 系 统 显 示 R a d io B u tto n P rope r t ie s 单 选 按 钮 属 性 对 话 框 如 下 图 所 示
为 了 使 单 选 按 钮 看 起 来 与 如 图 10 .4 所 示 的 外 观 相 同 要 对 它 们 作 些 小 的 改动 首 先 在 R a d io B u tton P rope r tie s 单 选 按 钮 属 性 对 话 框 选 择 S ty le 风 格 页 并 为 每 个 按 钮 选 中 P u s h - lik e 复 选 框 还 需 把 这 些 单 选 按 钮 放 入 一 个 组 使得 当 你 选 择 一 个 新 按 钮 时 当 前 选 择 能 消 除 掉 为 了 完 成 这 个 任 务 先 对 使 用ID C _ R AD IO1 缺 省 ID 的 组 中 的 第 一 个 单 选 按 钮 复 选 G roup 及 Ta b s to p 复 选 框而 对 该 组 中 其 它 的 单 选 按 钮 都 只 复 选 Ta b s to p 复 选 框 否 则 最 后 得 到 的是 每 组 只 有 一 个 按 钮 的 10 个 组 而 不 是 有 10 个 按 钮 的 一 个 组 V is u a l C + + 把 它看 到 的 第 一 个 选 择 了 G roup 复 选 框 的 按 钮 作 为 组 的 起 点 顺 序 下 去 在 V is u a l C+ + 看 到 选 择 了 G roup 复 选 框 的 下 一 个 按 钮 之 前 所 有 按 钮 都 归 为 这 一 个 组
技 巧 大 多 数 Microsoft 产 品 推 荐 使 用 尺 寸 为 2 5 0 62 或 250 110 对 话 框单 元 的 属 性 页 但 你 可 以 按 照 需 要 使 用 任 意 尺 寸 的 属 性 页 , 当 你 试 图访 问 这 个 属 性 页 时 你 就 会 看 到 一 条 消 息 说 你 没 使 用 标 准 尺 寸 清除 这 一 消 息 则 属 性 按 通 常 那 样 显 示 出 来
在 这 个 对 话 框 中 我 们 要 对 单 选 按 钮 再 做 一 件 事 为 了 在 单 选 按 钮 和 OC X 控件 之 间 建 立 OL E 连 接 要 对 它 们 的 输 出 赋 以 OL E 属 性 按 下 CT RL 键 并 双 击该 组 中 第 一 个 单 选 按 钮 ( N one ) 系 统 显 示 A dd M e m b e r V a r ia b le 添 加 成 员 变 量 对 话 框 如 下 图 所 示
技 巧 键 入 CTRL-W 显 示 MFC ClassW izard 对 话 框 选 择 Member Var iable 成 员 变 量 页 再 单 击 Add Variable 添 加 变 量 按 钮 也 可 以访 问 这 个 对 话 框
这 儿 定 制 的 各 个 项 目 都 是 十 分 关 键 的 原 因 在 于 V is u a l C
-
- 不 检 查 它 们 的
对 错 并 且 也 不 能 从 列 表 中 选 择 它 们 在 M e m b e r V a r ia b le N a me 成 员 变 量 名 域 键 入 m _ s td B u tto r T y p e 这 是 前 面 我 们 创 建 的 定 制 属 性 之 一 的 内 部 名 称 保持 C a te gor y 范 畴 域 及 V a r ia b le T y p e 变 量 类 型 域 不 变 在 O p tiona l P rope r ty N a m e 可 选 属 性 名 称 域 中 键 入 S tdB u tto n T y p e 这 是 把 属 性 页 链 接 到 你 的OC X 控 件 的 一 个 项 记 住 C+ + 是 区 分 大 小 写 的 所 以 大 写 很 重 要
技 巧 Optional Property Name 可 选 属 性 名 称 域 的 下 拉 列 表 中 通 常 包含 了 从 控 件 基 类 继 承 来 的 属 性 的 完 整 列 表
添 加 代 码
直 到 现 在 我 们 还 没 有 向 我 们 的 应 用 程 序 中 添 加 一 行 代 码 因 为 我 们 一 直在 忙 于 建 立 代 码 框 架 现 在 该 向 OC X 中 添 加 代 码 了 首 先 要 添 加 一 些 代 码 使得 我 们 的 控 件 能 与 使 用 这 个 控 件 的 用 户 交 换 数 据 例 如 当 看 到 控 件 属 性 对 话框 时 通 常 想 看 到 这 些 属 性 的 当 前 值 类 似 地 当 改 变 了 一 个 属 性 值 时 就 想确 信 实 际 控 件 也 随 之 改 变 程 序 列 表 10 .1 是 需 要 添 加 的 代 码
程 序 列 表 10.1
V O ID C O C X E x m p lC trl::D o P ro p E x c h a n g e ( C P ro p E x c h a n g e * p P X )
{
/ / D efau l t ac t io ns o n th e p a r t o f th e C las s W izard .
E x c h a n g e V e rs io n ( p P X ,M A KE L ONG (_ wV e r M in o r ,_ w V e r M a jo r ) ) C O le C o n tro l::D o P ro p E x c h a n g e ( p P X ) ;
//M a k e a ll o f o u r p ro p e rtie s p e rs is te n t .
P X _B oo l( p P X ," O n O f f" ,m _o n O f f ,F A L S E ) ;
P X _L oog ( pP X ," M oda l R e s u lt" ,m _m oda l R e s u lt,m r N one ) ; P X _L oog ( p PX ," S tdB u t tonT y p e " ,m _s td B u t to n T y p e ,0);
}
现 在 假 定 你 不 喜 欢 按 钮 的 缺 省 大 小 并 且 想 在 用 户 把 按 钮 插 入 到 W e b 页 或其 它 框 架 中 时 显 示 一 个 具 体 的 标 题 可 以 在 O n R e s e t( ) 函 数 中 改 变 这 两 个 属 性程 序 列 表 10 .2 中 显 示 了 需 要 修 改 的 代 码 请 注 意 我 们 使 用 CO le Co n tro l 类 的函 数 来 完 成 所 需 的 修 改 S e tT e x t() 函 数 修 改 按 钮 的 标 题 每 当 用 户 插 入 这 一 控件 时 标 题 B u tto n 就 会 显 示 在 该 控 件 上 S e tC o n tro l S iz e ( ) 函 数 把 控 件 大 小 变成 75 25 个 像 素 显 然 可 以 按 你 自 己 的 意 愿 设 置 这 些 属 性 甚 至 能 够 选 择 其中 一 个 按 钮 作 为 缺 省 按 钮
程 序 列 表 10.2
V O ID C O C X E x m p lC trl::O n R e s e t S ta te ( )
{
C O le C o n tro l::O n R e s e t S ta te ( ) ; //R e s e ts d e fa u lts fo u n d in D o P ro p E x c h a n g e
//M o d if y th e M ic ro s o f t c o n tro l to m a tc h c u s to m s iz e s e ttin g s . C O le C o n tro l::S e t T e x t( " B u tto n " ) ;
C O le C o n tro l::S e t C o n tro lS iz e ( 7 5 ,2 5 ) ;
}
现 在 我 们 有 了 交 换 信 息 的 方 法 并 且 把 控 件 按 我 们 的 要 求 进 行 了 设 置 下面 来 实 现 我 们 创 建 的 三 个 定 制 属 性 是 的 每 当 你 创 建 一 个 定 制 属 性 时 就 需要 定 义 一 些 代 码 使 得 这 种 属 性 能 完 成 一 些 任 务 否 则 它 就 只 能 呆 在 那 里 干不 成 事 程 序 列 表 10 .3 列 出 了 用 以 实 现 M oda l R e s u lt O n O ff 和 S tdB u ttonT y p e 属 性 所 需 添 加 的 代 码 下 一 节 我 来 解 释 一 下 这 些 代 码 的 内 部 操 作 方 式 在 目 前你 只 要 知 道 这 些 代 码 实 现 了 我 们 创 建 的 属 性 就 够 了
程 序 列 表 10.3
v o id C O C X E x m p lC trl::O n M o d a l R e s u ltC h a n g e d ( )
{
/ / W e don 't n e e d to d o a n y th ing h e re e x c e pt s e t th e m o d if ie d f la g . S e tM o d ifie d F la g ( ) ;
}
v o id C O C X E x m p lc trl::O n O f f C h a n g e d ( )
{
/ / I f th e p ro g ram m e r se t th e O n O f f p rop erty tru e , tak e a p p ro p r ia te a c t io n . if ( m _ onO f f )
{
C O le C o n tro l::S e t T e x t(" O n " ) ; //C h a n g e th e C a p tio n
}
e ls e
{
}
m _ S e tO n = T R U E ; //S e t a n in te rn a l c a p tio n f la g m _ m o d a lR e s u l t = m r O n ; //S e t th e m o d a l re s u lt v a lu e .
C O le C o n tro l::S e t T e x t(" B u tto n " ) ; //R e s to re d e fa u l t C a p tio n m _ S e t O n = F A L S E ; / / T u rn o u r c a p t io n f la g o ff
m _ m o d a lR e s u l t = m r N o n e ; //U s e th e d e fa u lt m o d a l re s u lt.
//P e r fo rm th e d e fa u lt a c tio n . S e tM o d ifie d F la g ( ) ;
}
v o id C O C X E x m p lC trl::O n S td B u tto n T y p e C h a n g e d ( )
{
// C h a n g e th e m o d a l re su lt a n d b u tto n c a p tio n to m a tc h th e u s e r se le c tio n . s w i tc h ( m _s td B u t ton T y pe )
{
cas e 0 :
m _ m o d a l R e s u l t = m r N o n e ;
C O le C o n tro l::S e t T e x t(" B u tto n " ) ; b re a k ;
cas e 1 :
m _ m o d a l R e s u l t = m r O K ;
C O le C o n tro l::S e t T e x t(" O K " ) ; b re a k ;
cas e 2 :
m _ m o d a l R e s u l t = m r C a n c e l ;
C O le C o n tro l::S e t T e x t(" C a n c e l" ) ; b re a k ;
cas e 3 :
m _ m o d a l R e s u l t = m r A b o r t ;
C O le C o n tro l::S e t T e x t(" A b o rt" ) ; b re a k ;
cas e 4 :
m _ m o d a l R e s u l t = m r R e tr y ;
C O le C o n tro l::S e t T e x t(" R e try " ) ; b re a k ;
cas e 5 :
m _ m oda l R e s u l t = m r Igno re ;
C O le C o n tro l::S e t T e x t(" Ig n o re " ) ;
b re a k ; cas e 6 :
m _ m o d a l R e s u l t = m r Y e s ;
C O le C o n tro l::S e t T e x t(" Y e s" ) ; b re a k ;
cas e 7 :
m _ m o d a l R e s u l t = m r N o ;
C O le C o n tro l::S e t T e x t(" N o " ) ; b re a k ;
cas e 8 :
m _ m o d a l R e s u l t = m r O n ;
C O le C o n tro l::S e t T e x t(" O n " ) ; b re a k ;
cas e 9 :
m _ m o d a l R e s u l t = m r O f f ;
C O le C o n tro l::S e t T e x t(" O f f" ) ; b re a k ;
}
/ / S et th e O n O f f p rop e r ty to fa ls e s in ce th e u ser s e le cted ano th e r ty p e . m _ o n O f f = F A LS E;
/ / S et th e m o d if ie d f lag . S e tM o d ifie d F la g ( ) ;
}
我 们 现 在 需 要 在 OC XE X M P L C tl. c p p 文 件 中 做 最 后 的 一 些 编 码 工 作 当 用户 单 击 按 钮 时 怎 么 办 如 果 他 使 用 的 是 标 准 按 钮 类 型 之 一 O n O ff 控 件 将 返 回一 个 标 准 的 模 式 结 果 值 但 是 O n O ff 控 件 还 有 一 个 特 殊 行 为 如 果 你 把 O n O ff属 性 设 置 为 T ru e 按 钮 则 随 着 用 户 的 单 击 而 在 On 和 O ff 之 间 切 换 我 们 需 要添 加 一 些 特 殊 的 事 件 代 码 来 处 理 这 种 情 况 使 用 V ie w 视 图 |C la s s W izard 类向 导 命 令 显 示 出 M F C C las s W izard M F C 类 向 导 对 话 框 选 取 M e s s a g e M a p s消 息 映 射 页 选 择 C la ss N a m e 类 名 域 中 的 CO CX E x m p l C tr l 项 在
M e ssa g e s 消 息 列 表 中 选 中 O n C lic k 单 击 A dd F unc tion 添 加 函 数 向 类 中添 加 一 个 函 数 框 架 这 时 M F C C las s W izard M F C 类 向 导 对 话 框 如 下 图 所 示
现 在 向 O n C lic k ( ) 函 数 中 添 加 代 码 单 击 E d it C ode 编 辑 代 码 按 钮 V is u a l C+ + 就 把 你 带 入 到 新 函 数 中 程 序 列 表 10 .4 列 出 了 需 要 添 加 的 代 码
程 序 列 表 10.4
v o id C O C X E x m p lC trl::O n C lic k ( U S H O R T iB u tto n )
{
//s e e if th e O n O f f f la g is s e t. I f s o , c h a n g e th e c a p tio n a n d in te rn a l
/ / c a p t io n f la g . T he e f fe c t y o u s h ou ld s e e f ro m th is c o d e is a togg lin g
//o f th e c a p tio n te x t. if ( m _ onO f f )
{
if ( m _ S e t O n )
{
}
e ls e
{
}
}
C O le C o n tro l::S e t T e x t(" O f f" ) ; m _ S e t O n = F A L S E ;
m _ m o d a l R e su l t = m r O f f ;
C O le C o n tro l::S e t T e x t(" O n " ) ; m _ S e t O n = T R U E ;
m _ m o d a l R e su l t = m r O n ;
//C a l l th e d e fa u lt O n C lic k p ro c e s s in g . C O le C o n tro l::O n C lic k ( B u tto n ) ;
}
现 在 我 们 已 经 实 现 了 函 数 编 码 部 分 但 我 们 还 需 要 向 O C XE XM P L C tl. h 文
件 中 添 加 两 个 支 持 项 第 一 个 项 是 枚 举 类 型 其 唯 一 目 的 是 使 源 代 码 容 易 阅 读每 个 元 素 对 应 一 个 标 准 按 钮 类 型 第 二 个 项 是 一 个 特 殊 变 量 如 果 注 意 一 下 代码 就 会 看 到 我 们 一 直 引 用 一 个 名 为 m _ S e t O n 的 成 员 变 量 但 这 个 变 量 现 在 还不 是 类 的 一 部 分 程 序 列 表 10 .5 显 示 了 如 何 向 头 文 件 中 添 加 所 需 的 枚 举 类 型 及特 殊 变 量 ─ ─ 就 在 Ev e n t m a p s 和 D is p atc h an d ev en t ID s 项 之 间 添 加
程 序 列 表 10.5
/ / E ve nt m a ps
/ /{ { A F X _ E VE NT ( C OC X E x m p l C tr l)
/ /} } A F X _ E VE NT
D E C L A R E_ EV EN T _ M A P ( )
//C re a t a n e w e n u m e ra te d ty p e fo r th e m o d a l re s u lt. ty pe de f e n um
{
m r N o n e = - 1 L , m r O k = 1 L ,
m r C a n c e l = 2 L , m r A bort = 3L , m r R e tr y = 4 L , m rIg n o re = 5 L , m r Y e s = 6 L ,
m r N o = 7 L ,
m r O n = 8 L , m r O f f = 9 L ,
} M ODAL T Y P E ;
/ / S p ecial O n / O f f s tate v a r iab le .
B O O L m _ S e t O n ;
//D is p a tc h a n d e v e n t ID s p u b l ic :
e n u m {
/ /{ { A F X _ D IS P _ ID (C O C X E x m p l C trl) d is p id M o d a lR e su lt = 1 L ,
d is p id O n O f f = 2 L ,
d is p id S td B u tto n T y p e = 3 L ,
/ /} } A F X _ D IS P _ ID
} ;
详 细 解 析 代 码
你 对 上 述 代 码 作 出 的 最 初 反 应 肯 定 是 觉 得 太 可 怕 了 但 是 如 果 每 次 处 理一 个 函 数 这 实 际 上 又 相 当 容 易 事 实 上 作 为 A c tiv e X 控 件 定 义 处 理 过 程 的一 部 分 V is u a l C + + 已 为 你 写 出 了 大 部 分 的 代 码 所 以 你 写 出 的 代 码 并 没 有 比
为 一 个 标 准 应 用 程 序 所 写 的 代 码 多 多 少 我 们 添 加 的 函 数 只 不 过 是 定 义 我 们要 求 这 个 控 件 所 要 完 成 的 特 殊 任 务
让 我 们 把 代 码 分 解 开 来 看 一 下 你 修 改 的 第 一 个 函 数 是 D o P ropE xc ha nge ( ) 这 个 函 数 在 这 个 例 子 中 只 完 成 一 种 服 务 ─ ─ 把 你 的 定 制 属 性 变 成 持 久 属 性 实际 上 PX _ 系 列 函 数 调 用 允 许 把 一 个 特 定 属 性 的 值 从 一 个 会 话 期 存 贮 到 下 一个 会 话 期 对 你 定 义 的 每 一 个 变 量 类 型 都 调 用 一 次 该 类 型 的 函 数 每 次 调 用 都接 受 类 似 于 下 文 所 述 的 四 个 变 量
P X _ B o o l ( p P X ," O n O f f", m_ On O ff, F A L S E ) ;
第 一 个 变 量 是 指 向 属 性 交 换 结 构 的 一 个 指 针 V is u a l C + + 自 动 定 义 这 一 结构 你 只 管 使 用 就 是 了 第 二 个 参 数 包 含 了 属 性 的 外 部 名 用 户 在 P rope r ty In s p ecto r 中 可 以 看 到 它 对 于 P rope r ty In s p e c tor V is u a l C + + 称 之 为 属 性 对 话框 D e lphi 称 为 对 象 观 察 器 等 等 第 三 个 参 数 是 属 性 的 内 部 名 使 用 它 在整 个 程 序 中 确 定 该 属 性 最 后 的 参 数 是 定 义 属 性 的 缺 省 值 除 非 你 想 让 用 户 在P rope r tie s 属 性 对 话 框 中 看 到 一 个 空 白 域
你 修 改 的 下 一 个 函 数 是 O n R e s e tS ta te ( ) 这 个 函 数 提 供 的 是 当 用 户 把 组 件添 加 到 窗 体 上 时 用 户 看 到 的 一 些 美 学 细 节 在 这 儿 我 们 给 予 组 件 一 个 缺 省标 题 并 改 变 其 尺 寸 使 之 与 能 在 W e b 页 上 正 常 工 作 的 定 制 尺 寸 相 匹 配 如 果 你设 计 一 个 A c tiv e X 控 件 用 于 其 它 目 的 就 需 要 改 变 这 一 设 置 以 满 足 你 使 用 最多 的 程 序 设 计 语 言 的 需 要 要 记 住 重 要 的 是 O n R e s e tS ta te ( ) 函 数 允 许 你 对 使 用 控件 所 需 要 的 任 何 设 置 进 行 操 作
技 巧 Microsoft 使 用 的 组 件 缺 省 尺 寸 差 不 多 是 Borland 产 品 如 DelPhi 的 两 倍 Internet 控 件 的 尺 寸 可 变 但 本 例 中 使 用 的 7 5 25 宽 高 规 格 在 绝 大 多 数 情 况 下 都 能 工 作
在 代 码 的 消 息 处 理 程 序 ( ha nd le r ) 部 分 三 个 修 改 过 的 函 数 中 有 两 个 需 要进 一 步 修 改 M oda l R e s u lt C ha ng e d ( ) 函 数 不 需 作 修 改 所 以 这 里 就 不 讨 论 它 了与 M oda l R e s u lt C ha ng e ( ) 函 数 相 关 的 属 性 M oda l R e s u lt 由 其 它 两 个 函 数 进 行 修 改先 看 一 看 O n O f f C ha nge ( ) 函 数 我 们 要 做 的 是 设 置 内 部 标 题 标 志 和 初 始 标 题 如果 程 序 员 设 置 O n O ff 属 性 为 T ru e 我 们 通 过 设 置 它 的 标 题 为 On 把 控 件 设 置 为一 个 on /off 开 关 按 钮 当 按 钮 用 作 on /off 开 关 时 还 提 供 了 不 同 的 模 式 结 果 值请 留 意 内 部 属 性 变 量 m _onO f f 追 踪 着 标 志 的 状 态 而 内 部 属 性 m _ S e t O n 追 踪着 O n O ff 控 件 的 当 前 状 态 (o n 或 o ff) 因 为 这 个 按 钮 初 始 时 为 On 所 以 一 开 始设 置 m _ S e t O n 标 志 为 T ru e
现 在 看 一 下 这 个 OC X 的 P rope r ty P a ge 属 性 页 中 功 能 所 需 的 处 理 过 程
O n S tdB u ttonT y p e C ha ng e d 函 数 只 不 过 是 一 个 cas e 语 句 它 按 照 创 建 各 种 缺 省 按钮 类 型 的 需 要 来 改 变 按 钮 的 C a p tio n 和 M oda l R e s u lt 属 性 请 留 意 如 果 用 户 选择 了 缺 省 的 按 钮 类 型 我 们 还 不 得 不 关 闭 O n O ff 的 按 钮 处 理 过 程
O n C lic k ( ) 消 息 处 理 函 数 在 运 行 期 间 是 激 活 的 这 里 有 两 个 层 次 的 动 作 第一 需 要 确 定 程 序 员 是 不 是 把 这 个 按 钮 定 义 为 on /off 开 关 如 果 是 我 们 就 改变 内 部 状 态 变 量 (m _ S e t O n ) 和 按 钮 标 题 该 函 数 让 按 钮 状 态 在 On 和 O ff 之 间 按需 要 切 换 一 旦 我 们 完 成 了 使 按 钮 工 作 所 需 的 内 部 处 理 我 们 就 调 用 缺 省 的O n C lic k 处 理 例 程 如 调 用 失 败 则 导 致 OC X 跳 过 你 为 按 钮 事 件 附 加 的 专 用 于
程 序 设 计 环 境 的 代 码 例 如 如 果 你 在 V is u a l C + + 应 用 程 序 中 使 用 这 个 控 件附 加 于 V is u a l C + + 中 e xpos e d 事 件 的 任 何 代 码 都 会 被 忽 略
在 能 够 使 用 这 个 组 件 之 前 还 得 在 V is u a l C + + 中 建 立 它 建 立 过 程 的 一 部分 是 用 W ind ow s 自 动 为 你 注 册 OC X 我 确 实 喜 欢 这 一 特 色 因 为 在 测 试 OC X 时它 为 我 节 省 了 不 少 时 间 唯 一 的 缺 憾 是 预 先 注 册 污 染 了 工 作 环 境 从 In te rn e t 上 使 用 A c tiv e X 控 件 的 角 度 来 看 你 必 须 到 另 一 台 机 器 上 去 测 试 这 一 组 件
测 试 控 件
— 旦 创 建 了 一 个 任 意 种 类 的 A c tiv e X 控 件 不 论 是 否 你 的 编 译 器 是 否 将 它称 为 OC X 都 要 进 行 一 些 测 试 从 而 保 证 它 按 预 期 的 方 式 工 作 对 于 想 用 于In te rn e t 的 A c t iv e X 控 件 来 说 其 测 试 工 作 最 好 分 为 四 个 阶 段 三 个 层 次 的 内 部测 试 和 第 四 层 次 的 外 部 测 试 下 述 列 表 说 明 了 各 个 阶 段 的 重 要 性
-
内
部 测 试 阶 段 1 在 标 准 环 境 中 使 用 这 个 控 件 在 将 控 件 从 标 准 程 序 设 计 平台 移 走 之 前 看 一 下 它 是 否 能 够 工 作 正 常 这 样 做 的 理 由 很 简 单 在 浏 览器 内 测 试 A c tiv e X 控 件 时 没 有 调 试 程 序 可 用 在 把 它 从 C+ + 或 其 它OC X /A c tiv e X 程 序 设 计 环 境 中 移 走 之 前 测 试 A c tiv e X 控 件 的 基 本 功 能 使你 拥 有 调 试 程 序 从 而 能 随 时 找 出 真 正 严 重 的 问 题
-
内
部 测 试 阶 段 2 在 浏 览 器 内 进 行 本 地 测 试 在 你 的 本 地 机 器 上 建 立 简 短 测试 看 一 看 A c tiv e X 控 件 能 否 装 入 到 一 个 HT M L 页 中 这 样 可 以 使 后 面 的工 作 节 省 一 些 时 间 你 还 应 该 验 证 一 下 是 否 有 足 够 多 的 属 性 在 实 际 使 用控 件 时 可 用 并 且 在 你 浏 览 测 试 页 时 它 能 否 工 作
-
内
部 测 试 阶 段 3 使 用 网 络 连 接 测 试 整 个 W e b 页 一 旦 你 对 A c tiv e X 控 件的 基 本 功 能 完 成 了 测 试 工 作 并 验 证 了 它 能 在 浏 览 器 中 正 常 使 用 就 要 确定 它 是 否 能 够 在 一 整 页 HT M L 标 记 中 正 常 工 作 总 之 不 能 与 同 在 一 页 上的 其 它 控 件 一 起 工 作 的 控 件 有 什 么 用 呢 控 件 间 的 相 互 作 用 能 引 起 一 些 真正 奇 怪 的 问 题 可 以 在 应 用 程 序 中 使 用 标 准 窗 体 来 测 试 相 互 作 用 问 题 但也 帮 不 了 多 少 忙 问 题 是 浏 览 器 并 不 是 像 你 所 喜 爱 的 编 译 器 那 样 来 处 理A c tiv e X 控 件
-
外
部 测 试 在 未 被 污 染 的 机 器 上 核 查 控 件 功 能 你 遇 到 的 最 大 问 题 是 污 染请 记 住 大 部 编 译 器 总 是 自 动 地 对 你 所 创 建 的 OC X 或 A c tiv e X 控 件 进 行 注册 而 进 入 你 的 In te rn e t 站 点 的 人 却 没 有 这 个 便 利 非 常 重 要 的 是 用 未 被污 染 的 客 户 机 和 服 务 器 在 W e b 页 的 上 下 文 环 境 中 测 试 你 的 新 控 件 换 言之 测 试 的 最 后 阶 段 要 像 任 何 访 问 你 的 In te rn e t 站 点 的 人 那 样 来 看 待 这 个控 件
现 在 你 已 经 明 白 我 们 要 做 些 什 么 了 让 我 们 看 一 下 我 们 创 建 的 控 件 的 测 试工 作 吧 在 下 面 我 将 使 用 V is u a l C + + 6 .0 你 可 以 使 用 支 持 OC X 的 任 意 程 序 设计 环 境 例 如 可 以 使 用 V isu a l B a sic 或 D e lp h i 来 测 试 O n O ff 控 件 看 看 在 这些 语 言 中 控 件 是 如 何 工 作 的 重 要 的 考 虑 不 在 于 你 用 什 么 语 言 来 测 试 而 在 于要 使 用 包 含 了 全 部 调 试 支 持 的 一 些 程 序 设 计 语 言 来 完 全 地 测 试 这 个 控 件 在 预定 要 使 用 控 件 的 最 安 全 的 环 境 中 要 确 保 创 建 的 控 件 能 够 真 正 地 按 预 期 方 式 工作 由 于 许 多 In te rn e t 工 具 处 于 测 试 阶 段 你 会 发 现 看 起 来 好 象 控 件 能 工 作 却 又工 作 不 了 在 一 个 已 知 的 环 境 中 通 过 对 控 件 进 行 测 试 来 消 除 控 件 本 身 的 干 扰
这 是 迈 向 找 出 问 题 的 第 一 步
内 部 测 试 阶 段 1 在 标 准 环 境 中 使 用 控 件
内 部 测 试 的 第 一 阶 段 不 会 是 一 个 既 长 又 累 人 的 过 程 真 正 需 要 完 成 的 任 务是 使 用 标 准 程 序 设 计 环 境 创 建 一 个 工 程 然 后 把 你 创 建 的 A c tiv e X 控 件 添 加 进去 要 保 证 所 有 属 性 如 预 期 的 那 样 工 作 起 来 花 些 时 间 彻 底 地 核 查 属 性 页
注 记 住 需 要 使 用 Project 工 程 |Add to Project|Component s and Controls 组 件 与 控 件 命 令 显 示 出 Component s and Controls Gallery 组 件 与 控 件 展 台 对 话 框 在 这 个 对 话 框 中 把 OCXExmpl 控 件 添 加 到当 前 工 程 中 去
在 你 喜 欢 的 支 持 OC X 工 作 的 程 序 设 计 环 境 中 创 建 一 个 新 工 程 对 于 本例 来 说 在 V is u a l C + + 中 创 建 一 个 基 于 对 话 框 的 应 用 程 序 就 能 容 易 地 测 试 该 控件 M F C A ppW iz a rd M F C 应 用 程 序 向 导 为 你 做 了 大 部 分 工 作 在 第 2 章中 已 讨 论 过 用 V is u a l C + + 创 建 基 于 对 话 框 的 应 用 程 序 的 过 程 我 们 把 这 个 工程 命 名 为 OC XT e s t
创 建 了 新 工 程 之 后 必 要 时 再 创 建 一 个 窗 体 并 把 A c tiv e X 控 件 添 加 进 去 V is u a l C + + 自 动 地 将 A c tiv e X 控 件 注 册 所 以 前 一 节 中 创 建 的 控 件 就 会 出 现 在 可用 控 件 列 表 中 其 它 程 序 设 计 环 境 可 能 需 要 你 单 独 地 注 册 你 的 A c tiv e X 控 件 图 10 .5 显 示 了 为 调 试 这 一 例 子 而 创 建 的 测 试 程 序 对 话 框 它 还 显 示 了 P rope r ty
属 性 对 话 框 中 选 中 的 C on tro l 控 件 属 性 页
图 10 .5 控件 属性 页对 话框表 明了 这个 按钮的 特殊 特色
绝 大 多 数 程 序 设 计 环 境 还 提 供 了 一 种 方 法 使 得 你 可 以 查 看 与 一 个 控 件 相关 联 的 所 有 属 性 下 图 显 示 了 O C X E xm pl C o n tro l P rope r t ie s 控 件 属 性 对 话框 的 A ll 页 其 中 O n O ff 属 性 设 置 为 T ru e
也 许 你 想 向 程 序 中 添 加 一 些 测 试 代 码 从 而 能 够 核 查 各 个 控 件 事 件 的 作 用例 如 本 例 中 的 O n / O f f 开 关 按 钮 提 供 了 许 多 依 赖 于 怎 样 设 置 按 钮 属 性 的 模 式 结果 返 回 值 把 O n O ff 属 性 设 置 为 T ru e 则 创 建 了 一 个 开 关 按 钮 M oda l R e s u lt 属
性 在 两 个 值 间 切 换 但 是 也 可 以 从 P rope r tie s 属 性 对 话 框 的 C on tro l 控件 页 中 很 容 易 地 选 择 一 种 标 准 按 钮 值
第 一 件 要 做 的 事 是 按 下 CT RL 键 并 双 击 控 件 然 后 看 到 A d d M e m b er V a r iab le
添 加 成 员 变 量 对 话 框 在 M e m b e r V a r ia b le N a me 成 员 变 量 名 域 中 键 入m _ O n O ff B u tto n 还 要 保 证 C a te gor y 范 畴 域 设 置 成 C on tro l 控 件 并 且V a r ia b le T y p e 变 量 类 型 域 设 置 成 CO CX E x m p l 现 在 就 能 够 在 测 试 应 用 程 序中 访 问 控 件 的 属 性 了 用 右 键 单 击 控 件 在 上 下 文 相 关 菜 单 中 选 中 Ev e n ts 就能 看 到 如 下 图 所 示 的 N e w W indow M e s s a ge a nd E v e n t H a nd le rs 新 建 窗 口 消 息和 事 件 处 理 程 序 对 话 框
请 注 意 V is u a l C + + 自 动 地 选 择 了 C lic k 单 击 事 件 和ID C _ OC XE XM P L C T R L 1 对 象 需 要 你 做 的 工 作 是 单 击 A dd a nd E d it 添 加 与编 辑 按 钮 来 向 你 的 程 序 中 添 加 一 个 新 函 数 看 到 A dd M e m b e r F unc tion 添 加成 员 函 数 对 话 框 后 接 受 缺 省 函 数 名 并 单 击 OK 这 时 就 会 看 到 这 个 按 钮 的函 数 框 架
程 序 列 表 10 .6 是 这 个 例 子 的 C+ + 测 试 代 码 请 注 意 V is u a l C + + 自 动 为 控
件 创 建 的 G e tM o d a lR e s u lt() 封 装 类 函 数 的 使 用 在 OC XE XM P L E . H 文 件 中 可以 找 到 V is u a l C + + 为 你 制 作 的 全 部 说 明 因 为 头 文 件 说 明 了 V is u a l C + + 是 如 何与 控 件 打 交 道 的 所 以 看 一 下 这 个 头 文 件 是 有 启 发 意 义 的 看 一 下 这 个 文 件能 帮 助 你 找 出 可 能 漏 掉 的 接 口 问 题 特 别 是 如 果 你 不 对 控 件 的 每 个 属 性 进 行完 全 测 试 时 更 是 如 此
注 释 创 建 OnClickOcx exmplctrl1() 函 数 的 方 法 有 多 种 最 简 单 的 方 法 是使 用 M FC ClassW izard 类 向 导 使 用 View 视 图 |ClassWiza rd 类 向 导 命 令 显 示 这 个 向 导 在 Object I D s 对 象 标 识 列 表框 中 选 中 IDC_OCXEXM PLCTRL1 项 并 在 Messages 消 息 列 表 框 中选 中 Click 项 这 时 单 击 Add Function 添 加 函 数 按 钮 就 把 函数 添 加 到 了 你 的 程 序 中
程 序 列 表 10.6
v o id C O C X T e s t D lg ::O n C lic k O c x e x m p lc trl1 ( )
{
//G e t th e c u r re n t M o d a lR e su lt v a lu e lo n g liM o d a l R e s u lt;
liM o d a l R e s u lt = m _ O n O f f B u tto n . G e tM o d a l R e su lt() ;
//D e te rm in e w h ic h m o d a l re s u lt w a s re tu rn e d a n d d is p la y a m e s s a g e . s w i tc h ( liM o d a l R e su lt)
{
cas e - 1 :
M e s s ag eb o x ( " N o ne bu t to n p res se d " ," S tate o f con tro l" , M B _ O K ) ; b re a k ;
cas e 1 :
M e s s a g e b ox ( " O K bu tton p re s s e d" ," S ta te of c on tro l" ,M B _ O K ) ; b re a k ;
cas e 2 :
M e s s a g e b ox ( " C a n c e l bu tton p re s s e d " ," S ta te of c on tro l" ,M B _ O K ) ; b re a k ;
cas e 3 :
M e s s a g e b ox ( " A b o r t bu tto n pre s s e d" ," S ta te of c on tro l" , M B _ O K ) ; b re a k ;
cas e 4 :
M e s s a g e b ox ( " R e try bu tto n pre s se d" ," S ta te of c o n tro l" ,M B _ O K ) ; b re a k ;
cas e 5 :
M e s s a g e b ox ( " Ig n o re bu tto n pre ss e d " ," S ta te of c o n tro l" , M B _ O K ) ; b re a k ;
cas e 6 :
M e s s ag eb o x ( " Y e s b u t to n p res se d " ," S tate o f co n tro l" , M B _ O K ) ;
b re a k ; cas e 7 :
M e s s a g e b ox (" N o b u t ton pre s se d" ," S ta te o f c o n tro l" ,M B _ O K ) ; b re a k ;
cas e 8 :
M e s s a g e b o x ( " B u tto n is O n " ," S ta te o f c o n tro l" ,M B _ O K ) ; b re a k ;
cas e 9 :
M e s s ag eb o x ( " B u t to n is O f f " ," S tate o f co n tro l" , M B _ O K ) ; b re a k ;
}
}
我 们 已 创 建 了 一 个 简 单 窗 体 并 把 你 的 控 件 添 加 到 该 窗 体 上 面 试 着 测 试 一下 它 吧 示 例 程 序 将 显 示 一 个 简 单 的 带 有 A c tiv e X 控 件 的 对 话 框 单 击 控 件就 会 看 到 另 一 个 对 话 框 其 中 显 示 了 按 钮 的 状 态 如 图 10 .6 所 示 单 击 OK 或C a n c e l 控 钮 由 V is u a l C + + 自 动 提 供 就 结 束 本 程 序 如 前 所 述 这 是 对 控 件基 本 功 能 的 简 单 测 试 到 现 在 为 止 我 们 核 查 了 属 性 页 属 性 和 使 用 控 件 的 结果
图 10 .6 O n O ff 控件 按预 期方 式工作 返回 模式 结 果 值
内 部 测 试 阶 段 2 在 浏 览 器 内 进 行 本 地 测 试
到 现 在 为 止 我 们 还 没 有 在 本 章 中 做 一 些 哪 怕 是 远 远 地 接 近 一 下 在 W e b 页中 工 作 的 事 至 于 向 W e b 页 中 添 加 A c tiv e X 控 件 涉 及 得 就 更 少 了 在 第 8 章中 我 们 确 实 研 究 过 使 用 W e b 页 问 题 如 果 想 了 解 使 用 In te rn e t 的 简 单 情 况 时一 定 去 读 一 下 这 一 章 该 变 化 一 下 了 测 试 过 程 的 下 一 步 就 是 把 控 件 插 入 到一 个 HT M L 文 档 中 我 们 再 次 使 用 一 个 非 常 简 单 的 设 置
注 释 在 这 一 节 中 我 们 使 用 一 个 非 常 简 单 而 且 容 易 使 用 的 实 用 程 序 如果 计 划 设 计 许 多 普 通 的 或 高 难 度 的 W e b 页 那 么 应 该 考 虑 使 用 某 个工 具 比 如 Visual I nterDev 但 ActiveX Co ntrol Pad 用 作 测 试工 具 或 用 作 设 计 简 单 W e b 页 更 好 使 用 些
M ic ros oft 提 供 了 一 个 A c tiv e X C o n tro l P a d 实 用 程 序 可 用 于 测 试 控 件时 快 速 建 立 HT M L 页 图 10 .7 是 第 一 次 打 开 这 个 实 用 程 序 时 的 样 子 还 可 以 用它 创 建 功 能 强 大 的 W e b 页 第 8 章 我 们 讨 论 过 创 建 过 程
图 10 .7 A c t iv e X C o n tro l P a d 允 许 快速 地设 计一 个 HT M L 页来 测试 你的 控件
为 了 创 建 用 于 测 试 A c tiv e X 控 件 的 HT M L 页 使 用 Ed it 编 辑 |Ins e r t A c tive X C on tro l 插 入 A c tiv e X 控 件 命 令 显 示 出 In s e r t A c tiv e X C o n tro l 插 入 A c tiv e X 控 件 对 话 框 从 提 供 的 列 表 中 选 择 你 的 控 件 单 击 OK 就 会 看 到 A c tiv e X 控件 已 装 入 如 图 10 .8 所 示 正 常 情 况 下 应 该 把 该 控 件 放 入 一 个 窗 体 中 但 这
儿 唯 一 的 目 的 只 是 测 试 它 而 已
每 装 入 一 个 新 控 件 A c tiv e X C o n tro l P a d 都 会 自 动 地 显 示 出 P rope r tie s 属性 对 话 框 如 图 10 .8 所 示 这 个 对 话 框 包 含 了 这 个 控 件 的 已 发 布 的 ( pub lis he d) 属 性 的 标 准 列 表 请 留 意 图 10 .8 还 显 示 出 了 G e n e ra l 属 性 页 通 过 用 右 键 单 击控 件 并 在 关 联 菜 单 中 选 择 所 需 的 项 就 可 显 示 出 这 个 页 对 我 们 的 示 例 来 说
要 选 择 第 二 个 P rope r tie s 属 性 项
我 们 需 要 改 变 的 唯 一 一 个 属 性 是 P rope r tie s ( 属 性 对 话 框 中 的 O n O ff 属 性把 它 变 成 T ru e 然 后 关 闭 包 含 控 件 的 对 话 框 A c tiv e X C o n tro l P a d 就 向 HT M L 页 脚 本 添 加 一 个 标 记 如 果 看 不 懂 HT M L 页 上 的 专 用 术 语 的 话 请 到 第 8 章 找出 对 HT M L 标 记 的 说 明 请 注 意 该 项 包 含 了 控 件 的 C L A SS ID 和 所 有 需 要 设置 的 属 性
图 10 .8 A c t iv e X C o n tro l P a d 在 装 入你 的控 件后 就 显 示 它
技 巧 你 在 HTML 脚 本 中 紧 挨 着 <OBJECT> 标 记 的 地 方 会 看 到 一 个 小 按 钮 单击 这 个 按 钮 再 次 显 示 这 个 控 件 从 而 可 以 编 辑 它 的 属 性 每 当 你 把一 个 A ctiveX 控 件 或 一 个 HTML 页 框 架 放 入 脚 本 时 ActiveX Control P a d 就 显 示 这 个 按 钮 使 你 能 容 易 地 按 需 要 编 辑 控 件 或 页 面 布 局
使 用 工 具 栏 上 的 Sa v e 保 留 按 钮 保 存 示 例 HT M L 页 面 我 将 其 命 名 为Te s t P a g e .H TM 关 闭 A c tiv e X C o n tro l P a d 然 后 使 用 你 喜 欢 的 与 A c tiv e X 兼容 的 W e b 浏 览 器 写 作 本 书 时 仅 限 于 In te rn e t E x p lo re r 和 使 用 使 用 NC o m p a s s S c r ip t A c tiv e 插 件 的 N e ts c a p e N a v ig a to r 打 开 这 个 HT M L 页 面 如 果 你 使 用In te rn e t E xp lore r 要 保 证 把 浏 览 器 的 安 全 层 次 设 为 中 等 设 置 安 全 层 次 的 步 骤是 使 用 V ie w 视 图 |O p tions 选 项 命 令 选 择 S ecu r ity 安 全 页 在这 个 页 中 单 击 Sa fe ty L e v e l 安 全 层 次 按 钮 即 可
注 要 保 证 保 存 的 测 试 用 W e b 页 的 文 件 扩 展 名 为 H T M
装 入 Te s t P a g e .H TM 文 件 后 所 看 到 的 如 图 10 .9 所 示 现 在 看 上 去 并 不 使人 肃 然 起 敬 但 控 件 却 能 做 那 些 标 准 HT M L 页 按 钮 做 不 到 的 事 单 击 按 钮 就会 看 到 标 题 在 On 和 O ff 间 切 换 你 还 能 监 测 按 钮 的 模 式 结 果 值 并 确 定 它 处 于什 么 状 态 所 有 这 一 切 一 行 CG I 脚 本 代 码 也 不 用 写 就 做 到 了 本 章 后 面 将讨 论 从 A c tiv e X 控 件 中 得 到 信 息 的 方 法
图 10 .9 A c t iv e X 控件 在这 个页 上能做 通常 控件 做不到 的事 单击 它时 它 在两种 状态 之间 切换
注 释 也 许 你 会 看 到 Satety Violation 安 全 被 破 坏 对 话 框 它 告 诉你 本 页 的 ActiveX 控 件 含 有 不 安 全 代 码 这 是 因 为 我 们 还 没 有 把 它 注册 (mark) 为 安 全 的 在 第 1 4 章 中 会 学 到 关 于 安 全 性 的 知 识 第 1 4 章中 包 括 了 一 旦 控 件 完 全 测 试 完 成 后 怎 样 把 它 注 册 为 安 全 的 现 在 暂且 不 用 理 会 这 条 消 息 4.2 版 以 上 的 Microsoft Visual C+ + 提 供 的工 具 负 责 处 理 这 些 细 节 至 少 提 供 一 个 菜 单 使 你 不 必 回 到 D O S 提 示 符下 本 章 开 头 我 就 说 过 可 以 用 旧 编 译 器 编 译 ActiveX 控 件 但 新的 编 译 器 使 得 做 这 类 事 更 方 便 上 面 的 情 形 就 是 其 中 的 一 个 方 面
现 在 已 在 C+ + 和 本 地 A c tiv e X 文 档 中 测 试 了 控 件 的 基 本 功 能 在 移 到 网络 上 去 之 前 应 该 试 试 控 件 的 各 种 变 换 比 如 O n O ff 控 件 应 能 在 其 它 几 个 标准 配 置 中 工 作 试 一 下 看 看 它 们 是 否 真 能 工 作
现 在 要 把 O n O ff 控 件 与 其 它 控 件 集 成 在 一 起 使 用 了 我 们 在 A c tiv e X C o n tro l Pa d 中 新 建 一 个 HT M L 页 我 们 先 创 建 一 个 新 的 HT M L 框 架 然 后 把 O n O ff 控件 放 入 这 个 框 架 使 用 F ile 文 件 |N e w H T M L L a y out 新 建 HT M L 框 架 命令 创 建 一 个 如 图 10 .10 所 示 的 窗 体 这 个 图 还 显 示 了 在 下 面 段 落 中 要 添 加 的O n / O f f 控 件 就 是 在 这 里 你 可 以 拖 几 个 组 件 来 与 O n O ff 控 件 集 成 在 一 起
注 意 到 示 例 框 架 中 为 了 进 行 测 试 只 把 几 个 控 件 放 到 了 窗 体 上 在 这 时 确 实不 必 添 加 太 多 的 复 杂 性 只 要 有 足 够 的 信 息 来 保 证 控 件 能 在 一 个 标 准 的 HT M L 环 境 中 工 作 就 可 以 了
注 有 趣 的 是 我 们 在 工 具 箱 中 看 到 的 所 有 控 件 实 际 上 都 是 ActiveX 控件 而 不 是 标 准 HTML 控 件
这 次 添 加 A c tiv e X 控 件 的 过 程 与 以 前 有 些 不 同 右 击 T oo lb o x 工 具 箱
就 会 看 到 上 下 文 菜 单 选 择 A dd itiona l C o n tro ls 附 加 控 件 选 项 就 会 看 到如 下 图 所 示 的 A d d itio n a l C o n tro ls 附 加 控 件 对 话 框
A d d itio n a l C o n tro ls 附 加 控 件 对 话 框 包 含 了 你 的 机 器 上 全 部 A c tiv e X 控件 的 完 整 列 表 实 际 上 不 用 管 这 些 控 件 会 不 会 是 OC X 还 能 够 选 择 显 示 出 可插 入 对 象 的 完 整 列 表 例 如 你 可 以 把 M ic ros oft W o rd 文 档 或 一 个 Ex c e l 电 子表 格 放 入 窗 体 在 第 11 章 我 们 将 讨 论 这 个 特 殊 过 程
从 列 表 中 选 中 OC XE x m p l 可 选 项 或 者 是 你 命 名 的 控 件 名 称 要 保 证 确实 把 挨 着 这 个 控 件 的 复 选 框 选 中 否 则 A c tiv e X C o n tro l P a d 不 安 装 它 单 击OK 则 大 功 告 成 你 会 看 到 一 个 新 控 件 添 加 到 了 你 的 T oo lb o x 工 具 箱 中 抓取 住 它 并 把 它 挨 着 Co m m a n d 命 令 按 钮 放 下 如 图 10 .10 所 示 和 以 前 一 样如 果 使 用 本 章 中 的 示 例 控 件 就 要 保 证 把 它 的 O n O ff 属 性 设 置 成 T ru e
完 成 编 辑 后 保 存 你 的 框 架 然 后 关 闭 本 页 A c tiv e X C o n tro l P a d 将 向 HT M L 脚 本 添 加 一 个 <O B J E C T > 标 记 就 如 同 前 面 为 我 们 测 试 的 A c tiv e X C o n tro l 页 所做 的 工 作 那 样 当 然 这 时 的 不 同 点 是 我 们 看 到 了 一 整 页 控 件 而 不 是 仅 仅 只有 一 个 控 件 在 页 上 呆 着 保 存 新 的 测 试 页 然 后 再 用 浏 览 器 打 开 它 看 看 控 件 能不 能 工 作 在 这 种 环 境 下 对 控 件 进 行 测 试 后 你 就 可 以 使 用 我 们 刚 才 建 立 的 两个 页 移 兵 到 网 络 中 进 行 测 试 了
图 10 .10 测试 A c t iv e X 控件 的第 二步 工作是 看一 下它 能否与 其它 现存的 HT M L 控件 一起 工作
内 部 测 试 阶 段 3 使 用 网 络 连 接 测 试 整 个 W e b 页
在 网 络 上 测 试 控 件 的 方 法 相 当 多 唯 一 的 要 求 是 要 有 两 台 机 器 一 个 是 服务 器 一 个 是 客 户 机 并 使 用 TC P / IP 协 议 将 它 们 连 接 起 来 你 还 可 以 在 服 务 器上 运 行 H TTP 服 务 程 序 幸 运 的 是 W ind ow s N T 4 .0 的 两 个 版 本 都 自 带 有 小 型的 H TTP 服 务 器 你 可 以 用 它 进 行 测 试 事 实 上 W ind ow s N T 的 新 版 本 还 将包 括 FT P 和 G ophe r 服 务 器
Web 链 接 Windows 95 用 户 进 行 W e b 页 的 本 地 测 试 时 不 用 再 羡 慕 Windows NT 邻 居 了 现 在 也 可 以 得 到 Windows 95 的 个 人 Web 服 务 器 了
Windows95 的 OSR2 版 的 拥 有 者 已 把 这 一 特 色 作 为 软 件 包 的 一 部 分 使用 了 这 只 需 打 开 Network Propertie s 网 络 属 性 对 话 框 并 安装 它 就 可 以 了 如 果 你 的 Windows95 是 老 版 本 你 可 以 从http://www .microsoft .com/msdownload/iepl atform
/iewin95/1 0000.htm 下 载 所 需 的 支 持 在 http://www .microsoft.com
/windows/p r/win95osr.htm 可 以 发 现 为 Windows95 可 以 下 载 哪 些 O S R 功 能
你 要 保 证 能 用 标 准 浏 览 器 和 你 指 定 的 域 名 与 服 务 器 通 信 不 要 错 误 地 认 为可 以 通 过 像 浏 览 器 如 E xp lo re r 这 样 的 东 西 访 问 服 务 器 然 后 双 击 测 试 页不 错 这 将 打 开 浏 览 器 你 将 看 到 你 的 测 试 页 但 是 你 将 使 这 一 测 试 阶 段 的目 的 遭 受 挫 折 通 过 E xp lore r 或 文 件 管 理 器 (F ile M a n a g e r) 打 开 这 个 页 将 使 浏览 器 置 于 文 件 模 式 它 不 允 许 你 测 试 H TTP 服 务 程 序 的 能 力 这 一 测 试 阶 段 的
目 的 是 尽 可 能 紧 密 地 模 拟 典 型 用 户 访 问 你 的 站 点 时 的 环 境
— 旦 与 服 务 器 建 立 了 链 接 就 能 看 到 它 提 供 的 缺 省 的 W e b 页 在 其 中 添 加一 个 到 你 的 测 试 页 的 链 接 使 用 这 个 链 接 就 能 测 试 前 一 节 中 创 建 的 单 个 控 件 和整 个 HT M L 页 多 数 情 况 下 你 会 发 现 对 于 测 试 的 这 个 阶 段 而 言 简 单 地 测试 一 下 链 接 就 很 充 分 了 换 言 之 如 果 控 件 在 一 种 模 式 下 能 工 作 那 么 它 就应 该 在 你 提 供 给 它 的 全 部 其 它 模 式 下 也 能 工 作 例 如 在 我 们 的 示 例 控 件 中我 把 它 作 为 一 个 on /off 开 关 进 行 简 单 的 测 试 那 么 标 准 按 钮 模 式 也 应 工 作 得很 好 因 为 在 测 试 的 前 两 个 阶 段 我 已 经 彻 底 地 测 试 过 它 们 了 这 正 是 本 地测 试 之 所 以 重 要 的 原 因 它 能 在 这 个 阶 段 节 省 时 间 想 象 一 下 不 得 不 反 复创 建 同 一 W e b 页 的 几 个 版 本 并 在 服 务 器 连 接 上 测 试 它 们 对 于 程 序 说 来 这是 多 么 没 有 效 率 的 方 法 呀
外 部 测 试 在 未 被 污 染 的 机 器 上 检 查 控 件 的 功 能
在 我 们 的 私 有 环 境 中 已 对 控 件 进 行 了 彻 底 的 测 试 考 察 了 每 种 控 件 访 问我 们 确 信 控 件 可 以 与 标 准 的 HT M L 控 件 一 起 工 作 现 在 该 进 入 外 部 测 试 阶 段 了
实 际 上 这 一 阶 段 仅 仅 是 第 三 个 内 部 阶 段 的 扩 充 而 已 但 是 不 再 是 从 网络 上 访 问 W e b 站 点 而 是 像 你 的 用 户 那 样 通 过 电 话 连 接 来 访 问 站 点 另 外你 对 控 件 进 行 测 试 一 直 使 用 的 是 受 了 污 染 的 机 器 在 这 种 机 器 上 已 安 装 了 被测 试 控 件 而 且 拥 有 了 所 有 适 当 的 注 册 表 项
这 个 测 试 阶 段 的 目 的 分 为 两 个 方 面 第 一 方 面 想 确 信 当 从 一 个 未 被 污染 的 机 器 上 进 行 访 问 时 控 件 仍 能 工 作 否 则 就 会 发 现 你 的 控 件 依 赖 于 某 些注 册 表 项 或 者 依 赖 于 客 户 机 访 问 你 的 W e b 站 点 时 不 能 满 足 的 其 它 要 求 第 二
想 检 测 你 的 W e b 页 的 下 载 时 间 到 现 在 为 止 我 们 一 直 通 过 高 速 连 接 访 问 测 试页 而 使 用 你 的 站 点 的 人 就 没 有 这 种 便 利 了 他 们 中 的 大 多 数 人 是 通 过 拨 号 连接 来 访 问 你 的 站 点 的
技 巧 可 能 你 想 把 你 的 测 试 页 安 装 到 你 的 W e b 站 点 中 一 个 私 有 部 分 从 而防 止 其 它 人 访 问 他 们 与 网 络 测 试 阶 段 不 一 样 不 要 在 你 的 主 W e b 页上 放 上 对 测 试 页 的 链 接 因 为 你 已 经 在 以 前 的 测 试 阶 段 中 测 试 过 连 接性 能 所 以 可 以 用 直 接 地 址 访 问 测 试 页
为 了 完 成 这 一 部 分 的 测 试 工 作 把 测 试 页 移 到 你 的 W e b 服 务 器 的 一 个 私 有部 分 从 一 个 未 被 污 染 的 机 器 上 使 用 一 个 支 持 A c tiv e X 的 浏 览 器 拨 号 进 入你 的 W e b 服 务 器 你 需 要 使 用 你 的 网 络 的 私 有 部 分 的 UR L 而 不 是 主 页 的UR L 先 试 一 试 单 一 控 件 测 试 页 看 看 A c tiv e X 控 件 是 否 能 工 作 还 要 看 一 看在 没 有 一 个 整 页 实 现 的 影 响 时 下 载 控 件 用 多 长 时 间 一 旦 检 测 完 单 一 控 件 测 试页 就 转 向 使 用 整 个 HT M L 框 架 的 第 二 页 若 这 个 连 接 成 功 你 就 获 得 了 一 个可 以 工 作 的 A c tiv e X 控 件 这 个 控 件 能 够 用 于 增 强 你 的 正 规 HT M L 页 面 的 功 能
1 0. 3 在 Ne ts ca pe Na vi ga to r 和 In te rn et Ex pl or er
中 使 用 Ac ti ve X 控 件
演 奏 音 乐 以 及 其 它 形 式 的 音 响 效 果 大 概 是 使 W e b 页 更 具 吸 引 力 的 最 普 通的 方 法 R eal A u d io 在 提 高 你 获 得 的 声 音 质 量 时 至 少 使 得 这 个 过 程 容 易 些
R eal A u d io 有 好 几 种 不 同 形 式 而 不 仅 仅 是 一 种 A c t iv e X 控 件 这 个 多 媒 体 的 当前 版 本 还 可 以 做 为 N e ts c a pe N a v iga to r 的 插 件 在 h ttp :// w w w . re a la u d io .c o m / 可 以与 R eal A u d io 的 制 作 者 联 系 从 而 了 解 播 放 器 SD K 和 支 持 的 实 用 程 序 的 详 细情 况 SD K R e a l A ud io E n c ode r 编 码 器 R e a l A ud io T im e L ine E d ito r 在 线编 辑 器 R e a l A ud io P e rs on a l S e v e r 个 人 服 务 器 以 及 R eal A u d io C o n te n t C reatio n G u id e 内 容 创 建 指 南 是 可 以 免 费 下 载 的 R e a l A ud io P e rs ona l S e ve r 支 持 两 种数 据 流 ─ ─ 这 对 于 用 于 演 示 和 试 验 目 的 来 说 是 太 多 了 点
这 个 播 放 器 提 供 的 多 层 次 支 持 只 是 使 用 这 一 特 定 技 术 的 原 因 之 一 相 当多 的 站 点 都 使 用 了 它 最 有 趣 的 站 点 是 h ttp : / / www. c dnow . c o m / 它 与M a ga z ine W a re hous e 相 连 接 这 是 一 个 使 用 多 媒 体 效 果 的 CD / m o v ie 电 影 商 店 例 如 如 果 你 打 算 买 一 张 CD 那 么 在 购 买 之 前 可 以 先 在 你 的 PC 扬 声 器上 听 一 听 所 选 的 乐 曲 片 段 它 还 卖 恤 衫 你 可 以 在 购 买 之 前 先 看 一 看 货 唯一 做 不 到 的 是 不 能 在 购 买 电 影 之 前 先 看 一 些 电 影 片 段 但 几 乎 可 以 肯 定 的 是 它最 终 会 添 加 这 一 功 能
启 动 R eal A u d io 不 成 问 题 要 做 的 只 不 过 是 安 装 服 务 程 序 对 你 的 文 件 编 码然 后 安 装 W e b 页 R e a l A ud io E n c ode r 实 用 程 序 对 话 框 如 下 图 所 示 只 需 选 择 将要 编 码 的 文 件 在 D e s c r ip t io n 说 明 区 键 入 所 需 的 信 息 然 后 单 击 E n c ode 按钮 对 文 件 编 码 R e a l A ud io E n c o d e r 实 用 程 序 自 动 地 为 你 指 定 一 个 目 的 文 件 名
把 这 个 控 件 添 加 到 W e b 页 也 相 当 容 易 在 A c tiv e X C o n tro l P a d 的 In s e rt A c tiv e X C o n tro l 插 入 A c tiv e X 控 件 对 话 框 的 控 件 列 表 中 选 择 R e a l A ud io 控件 ─ ─ 以 前 我 们 所 做 的 也 是 这 样 一 个 过 程 除 了 C ode B a s e 这 一 个 属 性 需 要 改 变外 其 它 需 要 改 变 的 属 性 如 下 图 所 示 把 声 音 文 件 所 在 的 UR L 打 入 即 可
程 序 列 表 10 .7 是 这 个 示 例 的 代 码 注 意 它 包 含 了 N C om pa s s S c r ip tA c t ive 所需 的 <E M B E D > 标 记 它 是 在 N e ts c a pe N a v iga to r 和 In te rn e t E xp lore r 上 都 能 无毛 病 地 进 行 工 作 的 少 数 控 件 之 一
注 释 也 许 需 要 改 变 一 下 RealAudio1 <OBJECT> 标 记 中 HEIGHT 和 WIDTH 属性 使 它 能 在 你 的 特 定 的 显 示 配 置 中 工 作 当 前 值 代 表 的 是 缺 省 尺 寸也 许 有 些 人 会 发 现 在 高 分 辨 率 显 示 中 它 太 小 了
程 序 列 表 10.7
<H T M L >
<H E A D >
< T IT L E > R e a l A u d io Te s t < / T ITL E>
< / H E A D >
< B ODY>
<!- 显示标题 ->
< C E N T E R > < H 2> T e s t of R e a l A u d io A c t iv e X C on tro l < / H 2 > < / C E N T E R >
C lic k h e re to te s t th e c o n tro l:< B R >
<!- 显示控件 ->
< O B J E C T ID = " R e a l A u d io 1 " W IDT H= 4 9 H E IGHT = 3 9
C L A SS ID = " C L S ID : C FC D A A 0 3 - 8B E 4 - 1 1 C F- B 8 4 B
- 0 0 2 0 A FB B C C F A "
C O D E B A S E = " h ttp ://a u x /c o n tro ls " >
< P AR AM N A M E = " _ E x te n t X " V A L U E = " 1 2 9 6 " >
< P AR AM N A M E = " _ E x te n t Y " V A L U E = " 1 0 3 2 " >
< P A R A M N A M E = " S R C " V A L U E = " h ttp ://a u x / m u ltim e d ia /T w ilZ o n e .R A " >
< P AR AM N A M E = " AUT OS T A R T " VA L U E = " 0 " >
< P AR AM N A M E = " NOL AB E L S " VAL UE = " 0 " >
< E M B E D NAM E = " R e a l A u d io 1 " W IDT H = 4 9 HE IGHT = 3 9
C L A SS ID = " C L S ID : C FC D A A 0 3 - 8B E 4 - 1 1 C F- B 8 4 B
- 0 0 2 0 A FB B C C F A "
C O D E B A S E = " h ttp ://a u x /c o n tro ls " > T Y P E = " ap p l icatio n /o leo bject"
P A R A M __E x te n t X = " 12 9 6 " >
P A R A M __E x te n t Y = " 10 3 2 " >
P A R A M _ _ S R C = " h ttp ://a u x / m u ltim e d ia /T w ilZ o n e .R A " > P A R A M _ _ AUT OS T A R T = " 0 " >
P A R A M _ _ N O L A B E L S = "0 ">
< / O B J E C T >
< / B ODY>
< / H T M L >
图 10 .11 R e a lA ud io 控件 提供 了独 特的按 钮接 口以 及关联 菜单 供用户 进行 设置
现 在 把 代 码 写 好 了 来 看 一 下 最 后 结 果 吧 图 10 .11 显 示 的 是 这 个 例 页 的 外观 用 户 只 要 单 击 R eal A u d io 按 钮 就 可 以 打 开 声 音 文 件 这 个 控 件 还 有 别 的 功能 右 击 该 控 件 就 会 看 到 如 图 10 .11 所 示 的 上 下 文 菜 单 用 户 可 以 定 制 控 件以 满 足 专 门 需 要
那 么 该 控 件 操 作 起 来 是 什 么 样 子 呢 下 图 显 示 了 用 户 眼 中 示 例 W A V 文件 的 显 示 情 况
请 注 意 这 个 对 话 框 中 显 示 了 在 R e a l A ud io E n c ode r 实 用 程 序 中 添 加 的 说 明信 息 遗 憾 的 是 你 添 加 的 信 息 量 受 到 限 制 最 好 除 了 控 件 所 提 供 的 缺 省 域 外再 添 加 一 个 用 户 可 配 置 的 域