第 2 章 建 立 基 本 应 用 程 序
学 习 一 门 新 语 言 甚 至 更 新 你 曾 经 用 过 一 段 时 间 的 某 门 语 言 的 知 识 从 来就 不 会 像 郊 游 野 餐 那 么 容 易 旧 的 语 言 已 经 习 惯 而 新 的 语 言 总 是 包 含 一 些 不熟 悉 的 东 西 用 起 来 别 别 扭 扭 然 而 如 果 你 想 紧 跟 当 今 商 业 化 世 界 的 潮 流就 必 须 学 习 新 的 语 言 或 最 低 程 度 上 更 新 老 语 言 的 知 识
那 么 如 何 以 最 短 的 时 间 跨 越 学 习 曲 线 底 部 呢 我 认 识 的 许 多 程 序 员 都 有一 个 用 于 学 习 新 语 言 的 基 本 应 用 程 序 实 际 上 真 正 高 水 平 的 程 序 员 都 有 几 个基 本 的 应 用 程 序 称 之 为 测 试 套 件 其 实 际 用 途 就 是 学 习 和 测 试 新 的 语 言这 类 应 用 程 序 的 功 能 相 对 比 较 全 面 也 可 以 再 增 加 其 它 的 功 能 否 则 的 话 你就 不 知 道 是 否 真 正 学 会 了 这 门 语 言
上 一 章 已 经 考 察 了 V is u a l C + + 的 功 能 本 章 打 算 给 读 者 一 个 V isu a l C + + 编 程的 初 步 印 象 即 使 你 是 个 C+ + 高 手 也 同 样 值 得 花 点 时 间 玩 一 玩 V is u a l C + + 的 这 个 新 版 本 这 样 才 能 确 定 如 何 使 用 该 产 品 建 立 这 类 测 试 套 件 将 帮 助你 了 解 如 何 使 用 V is u a l C + + 以 及 V is u a l C + + 能 为 你 做 些 什 么
当 然 我 们 要 花 点 时 间 建 立 能 够 使 用 的 应 用 程 序 为 简 单 起 见 对 绝 大 多数 情 况 来 说 我 把 应 用 程 序 完 整 功 能 实 现 的 任 务 留 给 了 读 者 然 而 不 要 忘 记本 章 的 真 正 目 的 是 演 示 — — 当 样 本 程 序 与 实 际 工 作 十 分 相 似 时 或 许 就 到 了 抛
弃样本程序 开始实际工作的时候 了
Web 链 接 任 何 严 肃 的 程 序 员 都 会 花 点 时 间 在 Internet 上 学 习 新 的 编 程 技巧 Microsoft 主 持 了 各 种 Visual C++ 的 新 闻 组 其 中 一 些 相 当 专 业最 通 用 的 新 闻 组 是 microsoft. public.vc.language 如 果 你 想 了 解ActiveX 技 术 的 进 展 情 况 或 许 应 该 到 micro- soft.publi c.vc.activextemplate lib 看 一 看 查 找 数 据 库 信 息 的 一个 好 位 置 是 microsoft. public.vc.database 最 活 跃 的 新 闻 组 之 一是 microsoft. public.vc.mfc 这 里 专 门 讨 论 Microsoft Foundation Classes MFC 微 软 基 础 类 库 当 然 还 有 另 外 两 个 与 M F C 相 关 的新 闻 组 microsoft. public.vc.mfc.docvie w 和 micro- soft.publi c.vc.mfc.macintosh 最 后 不 要 忘 记 看 一 看microsoft. public.win32.program mer 下 的 一 般 Windows 编 程 新 闻 组 它 下 面 有 许 多 与 程 序 员 有 关 的 新 闻 组 因 此 你 需 要 选 择 最 适 合 自己 需 要 的 新 闻 组
- 1 了 解 应 用 程 序 类 型
V is u a l C + + 有 能 力 创 建 你 能 够 想 像 到 以 及 有 些 你 想 不 到 的 任 何 应 用 程 序然 而 从 整 体 上 看 应 用 程 序 可 以 分 为 五 种 类 型 这 就 是 本 文 首 先 要 集 中 讨 论的 内 容
-
控 制
台 应 用 程 序 适 用 于 你 真 正 需 要 与 遗 留 系 统 保 持 某 种 兼 容 性 或 不 需 要 为用 户 提 供 全 功 能 操 作 界 面 的 情 况
-
基
于 对 话 框 的 应 用 程 序 通 常 是 实 用 程 序 的 专 利 也 适 用 于 极 小 型 不 需 要 菜单 系 统 的 应 用 程 序
-
单
文 档 应 用 程 序 适 用 于 操 作 自 有 数 据 的 简 单 应 用 程 序 比 如 记 事 本 或 小 型数 据 库 前 端 应 用 这 类 应 用 程 序 也 需 要 某 种 类 型 的 菜 单 系 统
-
多
文 档 应 用 程 序 是 提 供 完 整 功 能 的 应 用 程 序 比 如 字 处 理 程 序 或 电 子 表 格由 于 多 文 档 应 用 程 序 是 C+ + 编 程 中 十 分 复 杂 的 部 分 因 此 当 你 考 虑 建 立这 类 应 用 程 序 时 应 该 在 V is u a l C + + 的 灵 活 性 与 诸 如 V is u a l B a s ic 之 类 的 快速 应 用 开 发 工 具 提 供 的 速 度 之 间 进 行 权 衡
-
基
于 HT M L 的 应 用 程 序 是 V is u a l C ++ 6 .0 新 增 的 应 用 程 序 类 型 它 们 操 作某 种 类 型 的 数 据 像 单 文 档 或 多 文 档 应 用 程 序 那 样 但 与 In te rn e t 结 合 在了 一 起 作 为 标 准 编 辑 器 的 替 代 物 你 的 用 户 会 看 到 W e b 浏 览 器 风 格 的 前端 应 用
注 释 请 注 意 本 章 我 们 在 讨 论 应 用 程 序 Visual C++ 有 能 力 创 建 各 种 不 同类 型 的 代 码 使 用 Visual C++ 不 仅 可 以 创 建 D L L ActiveX 控 件 ISAPI 扩 展 程 序 设 备 驱 动 程 序 像 屏 幕 保 护 器 之 类 的 后 台 应 用 程 序 甚 至也 可 以 扩 展 Visual C++ 本 身 本 章 中 我 们 只 讨 论 一 般 的 应 用 程 序随 着 本 书 的 展 开 我 们 也 会 介 绍 许 多 其 它 类 型 的 代 码
控 制 台 应 用 程 序
我 前 面 已 经 介 绍 过 控 制 台 应 用 程 序 的 概 况 但 由 于 这 一 介 绍 过 于 粗 略 以至 于 并 未 真 正 告 诉 读 者 控 制 台 应 用 程 序 到 底 是 什 么 样 的 控 制 台 应 用 程 序 具 备DOS 风 格 的 窗 口 外 观 而 不 是 读 者 更 熟 悉 一 些 的 W ind ow s 风 格 窗 口 控 制 台 应用 程 序 使 用 等 距 字 体 就 像 你 在 DOS 窗 口 中 看 到 的 那 样 在 控 制 台 应 用 程 序 中可 以 使 用 标 准 C 函 数 完 成 输 入 输 出 比 如 p rin tf 和 s can f ( ) 然 而 从 内 部 上 讲控 制 台 应 用 程 序 确 实 是 个 W ind ow s 应 用 程 序 下 图 是 个 控 制 台 应 用 程 序 的 典 型示 例 本 章 后 文 中 我 们 将 实 际 创 建 一 个 这 样 的 程 序
注 使 用 控 制 台 应 用 程 序 可 以 把 某 些 功 能 型 D O S 代 码 转 移 到 Windows 系 统之 下
那 么 为 什 么 要 创 建 这 种 杂 交 怪 物 呢 假 设 说 你 有 一 些 工 作 得 很 好 的 老 的遗 留 代 码 但 它 们 是 DOS 下 的 应 用 程 序 你 想 把 这 个 程 序 迁 移 到 W ind ow s 系统 下 但 又 没 有 时 间 把 所 有 代 码 都 转 换 成 W ind ow s 调 用 那 么 控 制 台 应 用 程 序提 供 了 一 个 折 中 的 解 决 办 法 在 这 类 应 用 程 序 中 你 可 以 使 用 老 的 代 码 至 少 是其 中 的 一 部 分 但 在 W ind ow s 环 境 中 执 行 这 一 程 序
注 从 长 远 的 观 点 看 创 建 控 制 台 应 用 程 序 并 不 一 定 会 节 省 时 间 和 精 力 —
— 没 有 谁 能 保 证 让 你 使 用 所 有 现 存 代 码
使 用 控 制 台 应 用 程 序 还 有 另 外 一 个 好 处 当 把 应 用 程 序 从 DOS 搬 到 W in d o w s 中 时 外 观 上 就 不 一 样 没 有 什 么 办 法 填 平 两 者 之 间 的 鸿 沟 从 用 户 的 观 点 来看 你 引 入 了 一 个 完 全 不 同 的 应 用 程 序 需 要 做 出 计 划 重 新 培 训 每 一 个 工 作 人员 及 一 切 相 关 的 事 情 另 一 方 面 控 制 台 应 用 程 序 外 观 上 与 DOS 应 用 程 序 十 分
相 似 每 个 人 都 已 经 相 当 熟 悉 因 此 或 许 你 并 不 需 要 花 多 少 精 力 进 行 配 置 你会 感 到 烦 恼 的 唯 一 的 一 件 事 就 是 如 何 让 每 个 人 都 习 惯 以 不 同 方 式 运 行 应 用 程序
然 而 不 要 以 为 控 制 台 应 用 程 序 是 每 个 DO S 应 用 程 序 迁 移 到 W ind ow s 环 境
的 理 想 途 径 本 质 上 两 种 方 式 下 你 都 要 创 建 新 的 应 用 程 序 其 间 的 唯 一 差 别 是可 重 用 代 码 数 量 因 此 也 表 现 在 创 建 新 的 应 用 程 序 所 耗 费 的 时 间 事 实 上 如果 你 决 定 采 用 控 制 台 应 用 程 序 这 种 方 法 时 只 要 考 虑 一 下 就 会 发 现 你 终 将 编写 两 个 应 用 程 序 绝 大 多 数 公 司 发 现 他 们 终 将 承 受 把 DOS 应 用 程 序 转 换 到 W in - dow s 应 用 程 序 所 付 出 的 代 价
当 然 如 果 DOS 应 用 程 序 在 DO S 窗 口 中 运 行 得 相 当 好 时 你 也 必 须 斟 酌一 下 重 新 编 写 控 制 台 应 用 程 序 是 否 明 智 无 疑 地 控 制 台 应 用 程 序 可 以 使 用 某些 W ind ow s 服 务 但 或 许 所 需 的 一 切 服 务 已 经 在 DOS 应 用 程 序 中 实 现 了 你需 要 访 问 某 些 M F C 函 数 以 增 强 应 用 程 序 的 功 能 并 改 进 应 用 程 序 的 易 用 性 向你 的 DOS 应 用 程 序 中 添 加 越 多 的 W ind ow s 功 能 控 制 台 应 用 程 序 的 可 采 用 性也 变 得 越 低
可 移 植 性 可 以 安 全 地 假 定 使 用 控 制 台 应 用 程 序 能 够 把 D O S 应 用 程 序 的 商务 逻 辑 迁 移 到 Windows 环 境 也 可 以 把 某 些 显 示 和 打 印 功 能 进 行 迁移 然 而 想 通 过 控 制 台 应 用 程 序 使 用 一 组 代 码 同 时 实 现 D O S 和 Win- dows 下 应 用 程 序 的 假 定 从 来 都 不 是 安 全 的 — — 这 两 个 环 境 的 差 别 实在 太 大 了 当 把 应 用 程 序 从 D O S 迁 移 到 Windows 时 总 需 要 进 行 某 些 修改
基 于 对 话 框 的 应 用 程 序
许 多 人 把 配 置 屏 幕 A bout 对 话 框 之 类 的 应 用 与 基 于 对 话 框 的 应 用 程 序 联 系
起 来 而 把 其 它 功 能 要 求 归 类 于 全 功 能 应 用 程 序 基 于 对 话 框 的 应 用 程 序 在 编程 世 界 中 也 占 有 一 席 之 地 它 们 对 实 用 程 序 类 应 用 程 序 极 为 有 用 在 这 类 应 用程 序 中 通 常 只 需 要 显 示 少 量 的 数 据 和 获 取 少 量 的 用 户 输 入 下 图 是 本 章 后 面 要创 建 的 一 个 基 于 对 话 框 的 应 用 程 序 的 示 例
技 巧 当 确 定 是 创 建 基 于 对 话 框 的 应 用 程 序 还 是 创 建 基 于 窗 口 的 应 用 程 序时 需 要 考 虑 实 用 程 序 如 果 你 的 应 用 程 序 适 合 作 实 用 程 序 那 么 基于 对 话 框 的 应 用 程 序 界 面 或 许 是 良 好 的 选 择 另 一 方 面 如 果 打 算 在应 用 程 序 中 添 加 众 多 的 特 性 或 者 需 要 用 户 进 行 大 量 的 交 互 操 作 那 么应 该 考 虑 选 用 基 于 窗 口 的 界 面 在 做 出 决 定 时 一 定 要 考 虑 未 来 对 应 用程 序 的 扩 充 问 题 — — 今 天 做 出 的 错 误 选 择 将 在 明 天 的 重 新 实 现 中 付 出沉 重 的 代 价
那 么 到 底 是 什 么 原 因 使 基 于 对 话 框 的 应 用 程 序 比 基 于 窗 口 的 全 功 能 应 用程 序 更 好 呢 最 重 要 的 原 因 之 一 是 程 序 规 模 你 可 以 创 建 同 一 个 应 用 程 序 的 两种 版 本 一 种 使 用 对 话 框 界 面 另 一 种 使 用 窗 口 界 面 每 次 做 这 样 的 实 验 时 你都 会 发 现 对 话 框 版 本 的 程 序 更 小 一 些 除 了 节 省 资 源 外 对 话 框 版 本 的 应 用 程序 的 加 载 速 度 也 更 快 些 基 于 对 话 框 的 应 用 程 序 比 完 成 相 同 功 能 的 基 于 窗 口 的应 用 程 序 更 简 单 有 效
你 还 会 发 现 创 建 基 于 对 话 框 的 应 用 程 序 的 速 度 也 很 快 基 于 对 话 框 应 用 程序 的 特 点 就 是 规 模 小 效 率 高 当 你 发 现 需 要 在 这 类 应 用 程 序 中 增 加 大 量 功 能和 特 性 时 或 许 你 一 开 始 就 选 错 了 要 创 建 的 应 用 程 序 的 类 型 基 于 对 话 框 的 应用 程 序 通 常 避 免 使 用 菜 单 和 其 它 基 于 窗 口 应 用 程 序 为 提 供 友 好 界 面 所 需 的 部件 更 少 的 特 性 减 少 了 程 序 员 的 开 发 和 调 试 时 间 显 然 任 何 有 利 于 提 高 程 序员 效 率 的 方 法 都 值 得 一 试
注 把 过 多 的 控 件 塞 进 基 于 对 话 框 的 应 用 程 序 的 做 法 只 能 使 该 应 用 程 序 既笨 拙 又 难 以 使 用
基 于 对 话 框 的 应 用 程 序 并 不 一 定 要 承 受 缺 乏 重 要 特 性 的 遗 憾 例 如 你 可以 把 基 于 对 话 框 的 应 用 程 序 创 建 成 完 美 的 OL E 服 务 器 在 这 方 面 V is u a l C + + 向导 会 为 你 提 供 相 应 的 帮 助 因 此 在 应 用 程 序 中 添 加 OL E 支 持 只 需 要 你 多 做 一丁 点 工 作
使 用 对 话 框 应 用 程 序 唯 一 存 在 的 问 题 是 某 些 程 序 员 感 到 难 以 划 分 对 话 框
我 曾 经 见 过 一 个 基 于 对 话 框 的 应 用 程 序 其 上 充 满 了 让 人 不 知 所 措 的 各 种 小 玩意 基 于 对 话 框 的 应 用 程 序 看 上 去 会 比 同 等 功 能 的 基 于 窗 口 的 应 用 程 序 拥 挤 些但 也 不 应 该 把 它 们 拥 挤 到 谁 也 不 能 使 用 的 地 步
技 巧 就 像 Windows 中 用 于 配 置 的 属 性 对 话 框 那 样 你 可 以 使 用 选 项 卡 来降 低 基 于 对 话 框 应 用 程 序 界 面 的 拥 挤 程 度
单 文 档 界 面 应 用 程 序
单 文 档 界 面 应 用 程 序 是 像 N o te P a d 记 事 本 或 M ic ros oft P a in t 画 笔 这
样 | 的 | 应 | 用 | 程 | 序 | 它 | 一 | 次 | 处 | 理 | 一 | 个 |
文 |
档 | 降 |
低 |
了 |
编 |
程 |
的 |
复 |
杂 |
度 |
并 |
减 |
少 |
了 |
运 |
行 |
程 |
序 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
时 | 所 | 需 | 的 | 资 | 源 | 对 | 某 | 些 | 小 | 型 | 应 | 用 | 比 | 如 | 文 |
本 |
编 |
辑 |
器 |
或 |
小 |
型 |
图 |
像 |
编 |
辑 |
器 |
可 |
以 |
采 | |||
用 | 这 | 种 | 类 | 型 | 的 | 窗 | 口 | 应 | 用 | 程 | 序 | 单 |
文 |
档 | 界 | 面 |
应 |
用 |
程 |
序 |
允 |
许 |
用 |
户 |
与 |
其 |
创 |
建 |
的 |
文 |
档 |
进 | |
行 | 全 | 面 | 的 | 交 | 互 | 但 | 通 | 常 | 不 | 如 | 多 | 文 |
档 |
界 |
面 |
的 |
应 |
用 |
程 |
序 |
耐 |
用 |
另 |
外 |
单 |
文 |
档 |
界 |
面 |
应 | |||
用 | 程 | 序 |
至 |
少 | 要 | 比 | 多 |
文 |
档 | 界 |
面 |
的 |
应 |
用 |
程 |
序 |
少 |
一 |
个 |
菜 |
单 |
— |
— |
就 |
是 |
用 |
于 |
选 |
择 |
要 |
编 |
辑 |
文 |
档 的 W ind ow s 菜 单
注 对只需要用 户进行少量交互的小型 应用程序来说 可以采 用单文档 基于窗口的 界面
与 基 于 对 话 框 的 应 用 程 序 相 似 单 文 档 应 用 程 序 也 可 以 创 建 成 OL E 服 务 器实 际 上 这 类 应 用 程 序 也 可 以 作 为 OL E 客 户 程 序 尽 管 极 少 有 程 序 员 把 这 种 能力 添 加 到 他 的 应 用 程 序 中 下 图 是 本 章 后 面 要 介 绍 的 一 个 单 文 档 应 用 程 序 示 例请 注 意 这 个 示 例 可 以 作 为 OL E 的 客 户 端
注 通 过 把 应 用 程 序 的 基 视 图 类 选 择 为 CHtmlView 可 以 把 单 文 档 界 面 的 应用 程 序 转 换 成 简 单 的 W e b 浏 览 器
不 幸 的 是 单 文 档 界 面 的 应 用 程 序 与 基 于 对 话 框 的 应 用 程 序 有 相 同 的 问 题
— — 用 起 来 太 复 杂 了 我 还 记 得 以 前 使 用 老 版 本 Co re l D R A W 时 的 问 题 每 当我 想 查 看 一 幅 图 案 时 不 得 不 在 查 看 之 前 首 先 关 闭 当 前 打 开 的 文 档 这 种 限 制使 得 Co re l D R A W 比 它 应 该 提 供 的 方 法 要 难 用 一 些 例 如 我 在 比 较 两 幅 图 案时 浪 费 了 太 多 的 时 间 所 幸 的 是 Co re l S y s te m s 在 当 前 版 本 的 Co re l D R A W 中已 经 纠 正 了 这 一 缺 陷
技 巧 当 操 作 数 据 库 管 理 系 统 时 单 文 档 基 于 窗 口 的 应 用 程 序 工 作 的 相当 完 美 其 原 因 相 当 简 单 极 少 有 用 户 需 要 同 时 打 开 多 个 数 据 库 即使 他 们 需 要 同 时 打 开 多 个 数 据 库 数 据 库 本 身 的 使 用 规 则 也 减 少 了 用户 本 身 访 问 多 个 数 据 库 的 可 能 性 正 常 情 况 下 你 需 要 以 可 编 程 方 式控 制 对 各 种 数 据 库 元 素 的 访 问 并 把 结 果 显 示 给 用 户
多 文 档 界 面 应 用 程 序
现 在 我 们 来 谈 谈 多 文 档 界 面 应 用 程 序 使 用 这 种 类 型 基 于 窗 口 的 应 用 程 序可 以 创 建 像 字 处 理 程 序 或 电 子 表 格 那 样 的 应 用 程 序 例 如 M ic ros oft W o rd 和M ic ros oft E x c e l 都 是 多 文 档 应 用 程 序 的 示 例 如 果 你 想 一 想 就 会 发 现 文 本编 辑 器 具 备 有 限 吸 引 力 的 原 因 正 是 由 于 其 一 次 只 能 打 开 一 个 文 档 人 们 需 要 在文 档 之 间 进 行 比 较 这 就 是 多 文 档 界 面 的 应 用 程 序 不 仅 幽 雅 而 且 在 众 多 情 形 下需 要 的 原 因
注 通 过 把 应 用 程 序 的 基 视 图 类 选 择 为 CHtmlView 可 以 把 多 文 档 界 面 的 应
用 程 序 转 换 成 简 单 的 W e b 浏 览 器
多 文 档 界 面 的 应 用 程 序 通 常 也 都 具 有 多 种 功 能 你 可 能 会 走 向 另 一 个 极 端看 一 看 人 们 对 当 今 厂 商 生 产 的 主 流 产 品 臃 肿 特 性 的 抱 怨 也 就 知 道 了 文 本 编辑 器 可 以 提 供 十 分 简 单 的 查 找 功 能 但 并 不 提 供 替 换 文 本 的 任 何 方 法 而 全 功 能的 字 处 理 程 序 则 把 查 找 和 替 换 作 为 标 准 功 能 来 对 待
多 文 档 界 面 应 用 程 序 的 缺 点 就 在 于 它 处 理 多 个 文 档 同 时 处 理 多 个 文 档 的能 力 也 意 味 着 需 要 更 多 的 额 外 编 程 工 作 你 并 不 只 是 要 跟 踪 所 有 打 开 的 文 档 也 要 提 供 W ind ow s 菜 单 来 管 理 特 殊 的 程 序 特 性 比 如 要 考 虑 屏 幕 划 分 问 题 你 还 需 要 决 定 是 否 允 许 用 户 同 时 显 示 多 个 文 档 像 最 小 化 其 中 一 个 文 档 而 最 大化 另 一 个 文 档 这 样 的 任 务 也 需 要 额 外 的 程 序 代 码 总 而 言 之 即 使 在 开 始 编 写多 文 档 应 用 程 序 之 前 就 需 要 做 大 量 的 编 程 准 备 工 作 了
当 然 多 文 档 界 面 的 应 用 程 序 也 有 不 少 的 缺 点 例 如 如 果 你 以 前 把 W o rd 用 做 过 OL E 服 务 器 你 就 会 知 道 在 另 一 个 应 用 程 序 中 单 击 链 接 之 后 每 次 打开 这 个 庞 大 的 应 用 程 序 时 都 要 等 待 很 长 时 间 这 种 烦 恼 了 而 且 你 或 许 也 经 历过 内 存 不 够 的 困 惑 在 最 近 之 前 每 当 你 要 使 用 OL E 时 你 就 必 须 有 足 够 的 内存 同 时 运 行 两 个 应 用 程 序 客 户 和 服 务 器 所 幸 的 是 通 过 让 服 务 器 接 管 客户 端 窗 口 的 方 法 M ic ros oft 已 经 降 低 了 这 类 内 存 需 求 现 在 只 负 责 操 作 文 档 本身 了 客 户 窗 口 为 服 务 器 菜 单 和 工 具 条 提 供 了 框 架 因 此 不 会 再 浪 费 额 外 的 内存 空 间 了
基 于 HTML 文 档 的 应 用 程 序
V is u a l C + + 6 . 0 提 供 了 一 种 新 的 应 用 程 序 类 型 但 你 在 N e w 对 话 框 的 P ro je c t 选 项 卡 中 却 找 不 到 它 的 踪 影 你 可 以 通 过 M F C A ppW iz a rd 第 6 步 的 对 话 框 创 建基 于 HT M L 文 档 的 应 用 程 序 本 章 中 我 们 将 花 费 几 节 的 篇 幅 讨 论 这 方 面 的 内 容上 述 对 话 框 B a s e C la s s 基 类 组 合 框 中 包 含 了 一 个 C H tm lV ie w 选 项 正 是 使 用这 个 选 项 来 创 建 这 种 新 型 的 应 用 程 序
那 么 基 于 HT M L 文 档 的 应 用 程 序 有 什 么 优 点 呢 想 一 想 创 建 自 己 定 制 的W e b 浏 览 器 的 好 处 吧 你 可 以 把 这 个 浏 览 器 设 置 成 自 动 浏 览 公 司 W e b 站 点 并 限制 用 户 访 问 W e b 上 非 商 务 站 点 的 方 式 由 于 定 制 的 浏 览 器 不 需 要 具 备 全 功 能 浏览 器 所 有 的 通 用 功 能 因 此 定 制 浏 览 器 会 减 少 内 存 需 求 和 磁 盘 空 间 需 求 换
句 话 说 |
你 可 以 建 立 一 个 提 供 浏 览 器 所 有 功 能 |
而 又 不 存 在 它 们 所 含 问 题 |
的 程 |
---|---|---|---|
序 环 境 |
至 少 在 访 问 公 司 W e b 站 点 上 是 这 样 |
下 图 是 个 用 于 访 问 W e b |
站 点 |
的 基 于 |
HT M L 文 档 的 应 用 程 序 的 示 例 显 示 的 是 |
C H tm lV ie w 类 提 供 的 缺 省 |
W e b |
站 点 |
不 管 怎 么 说 这 种 新 型 应 用 程 序 比 你 原 先 想 像 得 更 有 价 值 例 如 你 可 以把 C H tm lV ie w 类 添 加 到 现 存 应 用 程 序 中 让 它 能 够 访 问 基 于 W e b 服 务 器 的 帮助 桌 面 在 第 15 章 的 给 你 的 应 用 程 序 添 加 基 于 HT M L 的 帮 助 一 节 我 将 介绍 基 于 HT M L 的 帮 助 作 为 创 建 标 准 帮 助 文 件 并 把 它 添 加 到 应 用 程 序 的 一 种替 代 方 法 你 可 以 创 建 十 分 专 业 化 的 W e b 浏 览 器 并 把 它 置 入 到 应 用 程 序 中
基 于 HT M L 的 帮 助 的 优 点 十 分 明 显 使 用 老 的 帮 助 文 件 就 意 味 着 一 旦 把 应用 程 序 交 付 给 用 户 或 在 整 个 公 司 内 分 发 后 你 就 不 能 够 轻 易 地 更 新 帮 助 文 件 而 更 新 HT M L 帮 助 则 简 单 到 只 需 要 在 W e b 服 务 器 上 修 改 文 件 即 可 另 外 使用 M ic ros oft H e lp W o rk s hop 还 需 要 做 一 些 额 外 的 工 作 而 基 于 HT M L 的 帮 助 则既 不 需 要 编 译 器 也 不 需 要 特 殊 工 具 只 要 有 个 文 本 编 辑 器 即 可 理 论 上 说在 编 写 巨 型 帮 助 文 件 时 你 需 要 个 专 门 为 操 作 HT M L 而 设 计 的 编 辑 器
HT M L 帮 助 也 有 一 些 缺 陷 一 方 面 难 以 在 基 于 HT M L 的 帮 助 中 建 立 能 够满 足 需 要 的 查 询 功 能 由 于 查 询 用 户 所 需 的 信 息 与 建 立 这 些 信 息 处 于 同 等 重 要的 位 置 因 此 基 于 HT M L 的 帮 助 并 不 适 合 于 初 级 用 户 另 外 基 于 HT M L 的 帮 助 必 须 建 立 In te rn e t 至 少 为 内 部 网 链 接 如 果 你 的 公 司 中 有 许 多 旅 途 中的 用 户 那 么 试 图 建 立 In te rn e t 链 接 或 许 并 不 现 实 当 然 总 可 以 复 制 所 需 的HT M L 文 件 但 这 与 以 前 的 帮 助 形 式 存 在 相 同 的 问 题 过 期 的 帮 助 文 件
这 种 新 的 应 用 程 序 类 型 还 有 许 多 其 它 的 用 途 — — 多 的 这 里 无 法 罗 列 需 要记 住 的 重 要 一 点 是 从 In te rn e t 访 问 中 能 够 得 到 好 处 的 应 用 程 序 从 C H tm lV ie w 类 的 使 用 中 也 会 得 到 好 处 利 用 这 个 类 可 以 完 成 从 销 售 代 表 处 远 程 更 新 公 司数 据 库 到 让 用 户 易 于 登 记 产 品 之 类 的 一 切 任 务 换 句 话 说 C H tm lV ie w 类 为 你和 你 的 用 户 打 开 了 一 个 新 的 世 界
- 2 编 写 控 制 台 应 用 程 序
如 前 所 述 控 制 台 应 用 程 序 让 你 能 够 把 应 用 程 序 的 商 务 逻 辑 从 DOS 环
境 迁 移 到 W ind ow s 环 境 你 也 可 以 迁 移 某 些 甚 至 是 绝 大 多 数 显 示 逻 辑 但也 需 要 一 些 M F C 提 供 的 功 能 本 质 上 讲 控 制 台 应 用 程 序 就 像 添 加 了 一 些 特 性的 DOS 应 用 程 序 编 码 之 后 需 要 彻 底 地 测 试 控 制 台 应 用 程 序 以 确 保 从 DOS 迁 移 到 W ind ow s 的 各 种 特 性 依 然 能 够 正 确 地 工 作
让 我 们 探 讨 一 个 相 当 简 单 的 控 制 台 应 用 程 序 看 看 在 这 个 程 序 中 你 能 做 些什 么 这 个 示 例 中 我 们 并 不 把 程 序 的 功 能 看 得 很 重 要 只 是 要 了 解 应 该 如 何完 成 示 例 当 然 第 一 步 的 工 作 是 创 建 程 序 框 架 按 下 述 步 骤 进 行 操 作
-
如
果 你 还 没 有 启 动 V is u a l C + + 那 么 启 动 V is u a l C + +
-
使
用 F ile |N e w 命 令 显 示 如 下 图 所 示 的 N e w 对 话 框 注 意 我 已 经 选 择 了
P ro jects 选 项 卡 并 加 亮 了 要 在 本 例 中 使 用 的 工 程 类 型
-
当
选 择 了 W in3 2 C ons o le A pp lic a t io n 后 在 P ro ject N a m e 域 中 键 入 程 序名 称 这 个 样 本 程 序 使 用 的 名 称 为 C ons o le 你 或 许 还 需 要 修 改 一 下 Lo c a tio n 域的 内 容 那 么 单 击 一 下 该 域 旁 边 的 浏 览 按 钮 系 统 会 显 示 C hoos e D ire c tor y 对 话框 在 这 个 对 话 框 中 选 择 应 用 程 序 的 存 放 目 录
-
单
击 OK 按 钮 你 会 看 到 W in3 2 C ons o le A p p lic a tion - S te p 1 of 1 对 话 框 如 下 图 所 示 注 意 在 这 个 对 话 框 中 有 几 个 应 用 程 序 类 型 供 选 择 这 也 是 V is u a l C+ + 6 .0 的 一 个 新 特 性 以 前 版 本 的 V is u a l C + + 简 单 地 创 建 一 个 空 的 工 程 现 在
到 了 选 择 要 创 建 哪 种 类 型 工 程 的 时 候 了 即 使 空 工 程 也 要 进 行 选 择
-
必
要 时 选 择 A n E m pty P ro je c t 然 后 单 击 F in is h 你 会 看 到 一 个 N e w P ro je c t In fo rm a tio n 对 话 框 它 告 诉 你 都 选 择 了 哪 些 选 项
-
单 击
OK 按 钮 创 建 示 例 程 序
在 该 工 程 真 正 能 够 运 行 之 前 还 需 要 完 成 其 它 一 些 步 骤 该 工 程 需 要 M F C
类 当 你 把 对 该 类 的 支 持 加 入 到 上 面 的 应 用 程 序 向 导 的 设 置 中 时 再 次 使 用 该
向 导 把 DOS 应 用 程 序 转 换 到 W ind ow s 下 时 所 需 的 重 写 代 码 的 代 码 量 就 会 显 著减 少 选 择 P ro je c t | S e t tings 命 令 显 示 P ro je c t S e ttings 对 话 框 选 择 该 对 话 框 的G e n e ra l 选 项 卡 并 在 Se t tin g s Fo r 组 合 框 中 选 择 A ll C o n fig u ra tio n s 在 M ic ros oft F ounda tion C la s s e s 组 合 框 中 选 择 U s e M F C in a S h ared D L L 选 项 单 击 OK 完 成设 置 工 作
现 在 到 了 给 示 例 程 序 添 加 代 码 的 时 候 了 需 要 完 成 的 第 一 件 事 是 向 工 程 中添 加 一 个 文 件 让 我 们 看 看 添 加 过 程
-
使
用 F ile | N e w 命 令 打 开 N e w 对 话 框 选 择 F ile 选 项 卡 其 中 显 示 了 文件 类 型 的 完 整 列 表 包 括 R e s o u rc e T e m p la te 以 及 像 Ic on F ile 这 样 的 各 种 图 像 文件
-
加
亮 C + + S ourc e F ile 选 项 由 于 我 们 要 在 样 本 代 码 中 添 加 一 些 类 因 此要 选 择 C+ + 源 文 件 选 项
-
在
F ile N a m e 域 中 键 入 C ons o le V is u a l C + + 会 自 动 添 加 上 正 确 的 文 件 扩
展 名
- 单
击 OK 系 统 显 示 一 个 空 的 C+ + 源 文 件
现 在 我 们 有 了 一 个 要 使 用 的 空 文 件 该 添 加 一 些 代 码 了 程 序 列 表 2 .1 显 示
了 该 示 例 的 C+ + 源 程 序 注 意 其 中 它 既 直 接 包 括 了 一 些 C 代 码 也 包 括 了 一些 C+ + 代 码 我 这 样 做 的 目 的 就 是 为 了 让 读 者 看 清 楚 在 这 种 环 境 下 系 统 是 如 何工 作 的
程 序 列 表 2 . 1
# inc lude <a fx c o l l .h> / / P rov ide s A c c e s s to M F C func t io n s C la s s C D ra w B o x : p u b lic C O b je c t
{
pub l ic :
// D ra w s th e b o x .
vo id D o D ra w ( c h a r * s tr in g )
};
v o id C D ra wB o x :: D o D ra w ( c h a r * c V a lu e )
{
in t i C oun t; / / L oop c o u n te r
in t i S p ace; / / A m o u n t o f s p aces to add fo r s tr ing .
/ / D ra w th e top of th e bo x fp r in tf ( s td ou t," \ 3 11" ) ;
fo r ( i C o u n t = 1; i C oun t < = 78 ; i C ou nt + + )
{
fp rin tf( s td o u t ," \ 3 1 5 " ) ;
}
fp r in tf ( s td ou t," \ 2 73" ) ;
// F ig u re o u t th e c e n te r o f th e s tr in g , th e n d is p la y it
/ / w i th th e box s ide s .
i S p ace = ( 8 0 - s tr le n ( c V a lu e)) / 2 ; fp r in tf ( s td ou t," \ 2 72" ) ;
fo r ( i C o u n t = 1 ; iC o u n t < = iS p a c e s ; iC o u n t +
- )
{
fp rin tf( s td o u t ," " ) ;
}
fp r in tf(s td o u t , " % s " , c V a lu e );
// C o m p e n s a te fo r o d d s iz e d s tr in g s , th e n c o m p le te th e s id e . if ( ( s trle n ( c V a lu e ) % 2 ) = = 1 )
{
i S p ace s - - ;
}
fo r ( i C o u n t = 1 ; iC o u n t < = iS p a c e s ; iC o u n t +
- )
{
fp rin tf( s td o u t , " " ) ;
}
fp r in tf ( s td ou t," \ 2 72" ) ;
// D ra w th e b o tto m o f th e b o x
fp r in tf ( s td ou t, " \ 3 1 0" ) ;
fo r ( i C o u n t = 1; i C oun t < = 78 ; i C ou nt + + )
{
fp rin tf( s td o u t , " \ 3 1 5 " );
}
fp r in tf ( s td ou t, " \ 2 7 4 \ n" ) ;
}
in t m a in ( in t arg c , ch ar ** arg v )
{
ch ar * cN am e; / / N a m e o f p e r s o n ty p e d at co m m an d l in e. ch ar * cL o cale; / / P ro g ram ex ec u t io n lo c a t io n .
C T im e o M y T im e ; // A tim e o b je c t.
C S tr ing c D a te ; // S tr ing u s e d to ho ld t im e a nd d a te . C D ra w B o x o M y D ra w ; // S p e c ia l te x t d is p la y .
// S e e if w e h a v e e n o u g h c o m m a n d lin e a rg u m e n ts . if ( a rg c != 2 )
{
fp r in tf ( s td e r r , " T y p e th e p rog ra m na m e fo l lo w e d by y o u r na m e .\ n" ) ; re tu rn 1 ;
}
// G e t th e c o m m a n d lin e a rg u m e n ts c L oc a le = a rgv [ 0 ];
cN am e = arg v [ 1 ] ;
// G e t th e c u r re n t tim e a n d p u t it in a s tr in g . o M y T im e = C T im e ::G e t C u r re n tT im e ( ) ;
cD ate = o M y T im e .F o rm at( " % A , % B % d ,% Y " ) ;
//D is p la y e v e ry th in g w e 'v e c o lle c te d .
fp r in tf ( s td o u t , " H e llo % s \n \n " , c N a m e ) ;
fp r in tf ( s td ou t, " P rog ra m is e x e c u tin g f rom : \ n % s \n \ n " , c L oc a le ) ; fp r in tf ( s td o u t , " T h e d a te is : % s \n " , c D a te ) ;
/ / U s e o u r cla ss to d raw a b o x aro u nd s o m e te x t . oM y D ra w . D o D ra w (" I t's a b ox !" ) ;
re tu rn 0 ;
}
如 你 所 见 在 这 个 示 例 中 我 展 示 了 四 个 基 本 技 巧 第 一 个 技 巧 是 对 命 令 行参 数 适 宜 个 数 的 检 查 如 果 不 满 足 所 需 个 数 的 话 就 在 std e r r 设 备 上 显 示 一 条
出 错 信 息 然 后 返 回 出 错 代 码 并 退 出 应 用 程 序 你 可 以 在 DOS 命 令 行 中 检 测 这个 错 误 代 码 但 对 W ind ow s 来 说 根 本 不 起 作 用 一 旦 代 码 检 测 到 有 足 够 的 命 令行 参 数 它 就 把 这 些 参 数 放 入 一 对 变 量 中 用 于 随 后 的 显 示
到 现 在 为 止 你 看 到 的 还 都 是 DO S 应 用 程 序 的 代 码 代 码 中 使 用 的 第 二 个 技巧 是 得 到 当 前 时 间 它 使 用 了 一 个 M F C 调 用 来 完 成 这 项 任 务 那 么 如 何 才 能够 在 控 制 台 应 用 程 序 中 访 问 M F C 函 数 呢 正 如 你 所 看 到 的 我 在 代 码 的 一 开 始就 包 含 AF XC OL L . H 文 件 这 个 文 件 包 含 了 控 制 台 应 用 程 序 中 调 用 的 有 限 个 M F C 函 数 的 所 有 定 义 和 类 定 义
不 要 以 为 你 可 以 任 意 使 用 M F C 调 用 例 如 不 能 创 建 CD ia lo g 对 象 并 实 际使 用 该 对 象 如 果 这 样 做 的 话 即 使 你 让 代 码 通 过 了 编 译 也 可 能 会 产 生 下 述两 种 情 况 或 者 程 序 以 运 行 时 错 误 而 终 止 运 行 或 者 应 用 程 序 忽 略 与 对 话 框 有关 的 代 码
技 巧 在 确 定 哪 些 M F C 类 可 以 使 用 时 的 一 条 重 要 原 则 是 看 该 类 是 否 操 作 图像 元 素 如 果 某 个 类 操 作 图 像 元 素 的 话 你 就 不 能 在 控 制 台 应 用 程 序中 使 用 该 类 另 外 你 还 会 发 现 某 些 系 统 调 用 不 再 有 效 并 且 当 系 统调 用 涉 及 安 全 问 题 和 磁 盘 访 问 时 你 还 必 须 小 心 仔 细 地 进 行 实 验 如果 存 在 疑 问 的 话 那 么 就 只 好 使 用 AFXCOLL.H 或 其 它 任 何 相 关 的 头文 件 比 如 AFX.H 中 列 出 的 调 用 而 不 使 用 其 它 调 用 在 任 何 控 制台 应 用 程 序 中 你 都 可 以 安 全 地 使 用 AFXCOLL.H 文 件 中 列 出 的 所 有 调用
现 在 我 们 已 经 得 到 了 一 些 要 显 示 的 数 据 随 后 的 代 码 把 这 些 数 据 发 送 到
s tdout 标 准 输 出 设 备 上 这 就 是 我 要 向 读 者 展 示 的 第 三 个 技 巧 在 绝 大 多 数
t 标 准 输 出 设 备 上 这 就 是 我 要 向 读 者 展 示 的 第 三 个 技 巧 在 绝 大 多 数 情 况下 s tdout 代 表 了 显 示 当 然 如 果 需 要 的 话 你 也 可 以 轻 易 地 把 输 出 发 送 到其 它 地 方 这 里 的 要 点 是 使 用 了 与 以 前 使 用 格 式 化 方 式 相 同 的 格 式 化 方 式 这样 你 也 可 以 在 代 码 中 使 用 fp rin tf() 函 数 调 用 的 地 方 使 用 简 单 一 些 的 fp rin t() 函 数调 用
在 m a in ( ) 函 数 中 还 有 一 个 调 用 没 有 讲 到 我 们 把 数 据 发 送 到 一 个 名 称 为CD ra w B o x 的 类 中 这 是 我 要 向 读 者 展 示 的 第 四 个 技 巧 这 个 类 要 完 成 的 任 务就 是 在 一 个 文 本 框 中 让 文 本 居 中 对 齐 使 用 AS C I I 字 符 集 的 高 位 字 符 你 或许 在 许 多 DOS 应 用 程 序 中 见 到 过 这 种 做 法 这 里 的 想 法 是 从 M F C C O b ject 类中 导 出 一 个 新 类 然 后 在 控 制 台 应 用 程 序 中 使 用 该 新 类 同 样 地 在 你 自 己 创建 的 应 用 程 序 也 可 以 使 用 类 似 的 技 巧 正 如 前 面 我 曾 经 介 绍 过 的 那 样 当 你 把DOS 应 用 程 序 迁 移 到 W ind ow s 环 境 时 你 会 有 一 种 向 应 用 程 序 中 添 加 更 多 功 能的 强 烈 愿 望 添 加 功 能 意 义 的 大 小 依 赖 于 应 用 程 序 迁 移 时 所 耗 费 的 时 间 长 短 以及 增 强 功 能 对 整 个 应 用 程 序 的 相 对 价 值 的 大 小
这 个 控 制 台 应 用 程 序 示 例 可 以 开 始 运 行 了 然 而 与 你 写 过 的 许 多 DOS 应用 程 序 相 似 为 了 便 于 测 试 我 们 需 要 一 个 批 处 理 文 件 程 序 列 表 2 .2 是 本 例使 用 的 批 处 理 文 件 的 源 代 码 它 完 成 的 任 务 是 调 用 程 序 测 试 是 否 出 错 如 果出 错 时 反 馈 一 条 出 错 信 息 前 面 你 已 经 看 到 了 该 应 用 程 序 的 输 出 这 里 就 不 再重 复 了
程 序 列 表 2 . 2
@ E C HO OF F
C O NS OL E
IF ER R O R L EV EL== 1 E C H O IT 'S B A D C O NS OL E J O HN
IF ER R O R L EV EL== 1 E C H O IT 'S B A D @ E C HO ON
- 3 编 写 基 于 对 话 框 的 应 用 程 序
基 于 对 话 框 的 应 用 程 序 十 分 常 用 于 像 实 用 程 序 系 统 监 控 程 序 甚 至 向 导 这样 的 小 型 任 务 中 绝 大 多 数 情 况 下 它 们 专 门 用 于 把 复 杂 程 度 降 到 最 低 限 度 的应 用 程 序 中 实 际 上 可 以 安 全 地 假 定 基 于 对 话 框 的 应 用 程 序 只 使 用 很 少 的 控件
我 们 要 看 一 看 另 外 一 个 简 单 示 例 在 这 个 示 例 程 序 中 我 们 要 组 合 使 用A c tiv e X 控 件 和 内 置 部 件 以 把 所 需 的 实 际 代 码 量 减 少 到 最 低 限 度 下 面 的 步骤 将 帮 助 你 建 立 一 个 空 的 结 构 随 后 再 填 充 代 码
-
打
开 V is u a l C + + 如 果 还 没 有 打 开 的 话
-
使
用 F ile | N e w 命 令 打 开 N e w 对 话 框 然 后 选 择 P ro je c t 选 项 卡 本 例 中我 们 将 在 工 程 类 型 列 表 中 选 择 M F C A ppW iz a rd EX E 工 程 类 型
-
在
P ro ject N a m e 域 中 键 入 应 用 程 序 的 名 称 本 样 本 程 序 使 用 的 名 称 为 D ia - lo g 但 你 也 可 以 使 用 任 何 自 己 喜 欢 的 名 称 必 要 时 修 改 Lo c a tio n 域 的 值 单 击L o c a tio n 域 旁 边 的 按 钮 进 行 选 择
-
单
击 OK 按 钮 你 会 看 到 如 下 图 所 示 的 M F C A ppW iz a rd - S te p 1 对 话 框
- 选
择 D ia lo g B a s e d 选 项 按 钮 然 后 单 击 N e x t 系 统 显 示 如 下 图 所 示 的 M F C A ppW iz a rd - S te p 2 of 4 对 话 框
- 在
P le a s e E n te r a T itle fo r Y o u r D ia lo g 域 中 键 入 Sa m p le D ia lo g A p p lic a t io n 注 意 在 这 个 对 话 框 中 可 以 给 应 用 程 序 增 加 一 些 其 它 特 性 比 如上 下 文 相 关 帮 助 等 A u to m a tio n 复 选 框 允 许 把 OL E 自 动 化 功 能 添 加 到 应 用 程 序中 你 也 可 以 在 这 个 对 话 框 中 对 应 用 程 序 增 加 W ind ow s S o c k e ts 支 持 — — 该 支 持允 许 应 用 程 序 通 过 TC P /IP 网 络 进 行 通 信
技 巧 把 M F C 静 态 链 接 到 应 用 程 序 中 可 以 减 少 发 布 应 用 程 序 时 必 须 分 发 的文 件 的 数 量 实 际 上 如 果 愿 意 的 话 你 可 以 只 向 其 他 人 提 供 应 用 程序 的 可 执 行 文 件 这 种 方 式 也 提 高 了 应 用 程 序 在 各 个 所 安 装 机 器 上 正常 运 行 的 机 会 原 因 在 于 应 用 程 序 总 是 访 问 设 计 应 用 程 序 时 使 用 的MFC 版 本 静 态 链 接 的 缺 点 是 应 用 程 序 变 得 更 加 庞 大 而 且 在 加 载 时占 用 更 多 的 内 存 另 外 无 论 什 么 时 候 当 你 想 给 应 用 程 序 增 加 新 的特 性 时 都 必 须 重 新 链 接 应 用 程 序 不 久 这 种 方 式 就 会 让 人 感 到 厌 烦
-
单
击 N e x t 然 后 再 单 击 N e x t 我 们 不 需 要 改 变 这 两 个 对 话 框 中 的 设 置 但 应 该 知 道 它 们 的 作 用 前 一 个 对 话 框 让 你 选 择 是 否 要 在 代 码 中 添 加 注 释 你还 可 以 选 择 M F C 是 静 态 还 是 动 态 链 接 到 应 用 程 序 中
-
单
击 F in is h V is u a l C + + 显 示 如 下 图 所 示 的 N e w P ro ject In fo rm atio n 对 话框 这 是 你 确 保 各 种 设 置 都 正 确 无 误 的 最 后 一 次 机 会 不 正 确 的 设 置 选 择 将 延长 工 程 的 开 发 时 间 而 不 是 缩 短 开 发 时 间
- 单
击 OK M F C A p p W izard 将 生 成 应 用 程 序 的 框 架
现 在 我 们 已 经 得 到 了 一 个 可 以 使 用 的 基 本 程 序 框 架 到 了 实 际 开 始 编 写 示例 程 序 的 时 候 了 由 于 这 个 程 序 要 使 用 M ic ros oft C a le nd a r 控 件 所 以 我 们 要 做的 第 一 件 事 就 是 安 装 所 需 的 A c tiv e X 控 件 使 用 P ro je c t | A dd to P ro je c t | C o m po- ne n ts a nd C on tro ls 命 令 显 示 如 下 图 所 示 的 C o m pon e n ts a nd C on tro ls G a lle r y 对 话框
注 确 保 已 经 安 装 了 Visual C++ 携 带 的 OCX 控 件 否 则 可 能 就 没 有 可 用 的
Microsoft Calendar 控 件
双 击 R e g is tered A c tiv eX C o n tro ls 文 件 夹 你 就 会 看 到 机 器 中 已 经 注 册 的 一系 列 控 件 找 到 C a le nda r C o n tro l 8 .0 列 表 项 这 是 本 版 V is u a l C + + 携 带 的 控 件之 一 然 后 单 击 In s e rt V is u a l C + + 将 显 示 一 个 对 话 框 询 问 是 否 真 要 把 这 个 控件 插 入 到 工 程 中 单 击 OK V is u a l C + + 将 添 加 某 些 包 装 类 到 应 用 程 序 中 以 便为 其 提 供 该 A c tiv e X 控 件 V is u a l C + + 在 如 下 图 所 示 的 C onfirm C la s s e s 对 话 框中 显 示 这 些 类 的 类 名
单 击 OK 接 受 缺 省 的 A c tiv e X 控 件 类 设 置 现 在 我 们 有 了 一 个 可 以 使 用 的 新控 件 它 被 添 加 到 了 工 具 箱 中 单 击 C lo s e 按 钮 关 闭 C o m pone n ts a nd C o n tro ls G a lle r y 对 话 框
现 在 到 了 设 计 对 话 框 的 时 候 了 图 2 .1 显 示 了 设 计 好 的 对 话 框 该 对 话 框 的当 前 大 小 为 300 200 我 把 C a le nda r 控 件 的 大 小 调 整 为 230 186 这 样 该 控 件上 的 数 字 就 看 得 清 楚 些 了 请 注 意 虽 然 该 应 用 程 序 现 在 并 没 有 运 行 但 C a le nda r 控 件 依 然 立 即 显 示 当 前 日 期 这 是 由 于 在 把 A c tiv e X 控 件 放 置 到 对 话 框 上 时
该 控 件 自 动 激 活 了 自 身 如 果 在 你 把 某 个 控 件 放 置 到 对 话 框 上 时 并 没 有 发 生 其它 反 应 或 许 该 控 件 没 有 正 确 地 安 装 显 然 需 要 检 查 控 件 的 文 档 以 确 保 控 件
按 所 期 待 的 方 式 工 作
技 巧 在 屏 幕 右 部 状 态 条 第 二 个 方 框 中 总 能 看 到 当 前 控 件 的 大 小 紧 挨 着该 方 框 的 左 边 方 框 中 显 示 了 所 选 控 件 相 对 于 显 示 区 左 上 角 的 位 置 利用 这 两 个 方 框 可 以 十 分 精 确 地 控 制 控 件 在 对 话 框 上 的 大 小 和 位 置
如 果 现 在 编 译 和 运 行 这 个 应 用 程 序 你 会 发 现 它 只 是 个 半 成 品 日 历 会 让你 选 择 新 的 日 期 单 击 OK 按 钮 后 对 话 框 也 会 消 失 但 也 只 是 如 此 该 程 序 现在 还 没 有 更 多 的 其 它 功 能
图 2. 1 加入 控件 后 基于对 话框 的示 例程序 开始 成型了
在 给 C a le nda r 控 件 添 加 代 码 之 前 我 们 还 要 为 它 创 建 一 个 成 员 变 量 创 建成 员 变 量 是 件 简 单 的 事 按 住 CT RL 键 双 击 C a le nda r 控 件 系 统 显 示 如 下 图 所示 的 A dd M e m b e r V a r ia b le 对 话 框
由 于 该 控 件 是 应 用 程 序 中 使 用 的 第 一 个 C a le nda r 控 件 因 此 在 m_ 不 要 删除 m_ 后 键 入 C a le n d a r 1 单 击 OK 创 建 该 变 量
下 一 步 要 完 成 的 任 务 是 检 测 用 户 是 否 改 变 了 该 控 件 右 击 C a le nda r 控 件
你 会 看 到 一 个 上 下 文 菜 单 从 中 选 择 Ev e n ts 系 统 显 示 如 下 图 所 示 的 N e w W in - dow s M e s s a g e a nd E v e n t H a n d le rs 对 话 框
该 对 话 框 包 含 了 控 件 可 以 监 视 的 所 有 事 件 的 完 整 列 表 程 序 员 在 设 计 该 控件 时 设 置 了 这 些 事 件 在 本 例 的 情 况 下 我 们 要 监 视 D b lC lic k 事 件 加 亮 D b lC lic k 事 件 列 表 项 然 后 单 击 A dd a nd E d it 按 钮 V is u a l C + + 显 示 A dd M e m b e r F unc t ion 对 话 框 单 击 OK 接 受 缺 省 的 函 数 名 你 会 看 到 一 个 空 的 函 数 体 现 在 我 们 要完 成 的 任 务 就 是 加 些 代 码 让 函 数 正 常 工 作 程 序 列 表 2 .3 显 示 了 所 需 的 程 序 代码
程 序 列 表 2 . 3
vo id C D ia logD L g : : O nD b lC l ic kC a le n d a r 1 ( )
{
C S tr in g c S elected D a te ; // D a te s e lec ted b y u s er. C h ar * cD a y = " " ; / / S e lected d a y .
C h ar * cY ear = " " ; / / S e lecte d ye ar.
/ / G e t d a y fro m c a le n d a r c o n tro l .
i to a ( m _ C alend a r 1 . G e t D a y ( ) , cD ay ,1 0 ) ; cS elec te d D ate = cD ay ;
/ / G e t m on th f ro m c a le n d a r c on tro l . s w i tc h ( m _C a le n da r 1 .G e t M o n th ( ) )
{
cas e 1 :
cS elec te d D ate = cS e le c te dD ate + " J a n u ary " ; bre a k;
cas e 2 :
cS elec te d D ate = cS e le c te dD ate + " F e b ru a ry " ; bre a k;
cas e 3 :
cS elec te d D ate = cS e le c te dD ate + " M a rc h " ; bre a k;
cas e 4 :
cS elec te d D ate = cS e le c te dD ate + " A p r i l " ; bre a k;
cas e 5 :
cS elec te d D ate = cS e le c te dD ate + " M a y " ; bre a k;
cas e 6 :
cS elec te d D ate = cS e le c te dD ate + " J u ne " ; bre a k;
cas e 7 :
cS elec te d D ate = cS e le c te dD ate + " J u ly " ; bre a k;
cas e 8 :
cS elec te d D ate = cS e le c te dD ate + " A u g u s t " ; bre a k;
cas e 9 :
cS elec te d D ate = cS e le c te dD ate + " S e p tem b e r " ; bre a k;
cas e 1 0 :
cS elec te d D ate = cS e le c te dD ate + " O c to b e r " ; bre a k;
cas e 1 1 :
cS elec te d D ate = cS e le c te dD ate + " N o v e m b er " ; bre a k;
cas e 1 2 :
cS elec te d D ate = cS e le c te dD ate + " D e c e m b er " ; bre a k;
}
// G e t th e y e a r .
ito a ( m _ C a le n d a r 1 .G e tY e a r ( ) , c Y e a r , 1 0 ) ; cS elec te d D ate = cS e le c te d D ate + cY e a r ;
//D is p la y th e d a te .
A fxM e s s a ge B ox (" Y o u d o ub le - c l ic k e d o n :" + c S e le c te d D a te , M B _O K | M B _ IN F OR M A T ION, 0 ) ;
}
现 在 你 可 以 运 行 该 应 用 程 序 了 它 也 确 实 会 完 成 一 些 任 务 编 译 并 运 行这 个 应 用 程 序 双 击 任 意 日 期 程 序 显 示 如 图 2 .2 所 示 的 对 话 框 该 对 话 框 以易 于 阅 读 的 方 式 显 示 了 你 在 C a le nda r 控 件 中 所 选 的 日 期 虽 然 这 个 功 能 现 在 看
起 来 并 没 有 多 大 用 处 但 你 有 多 种 方 法 轻 易 地 扩 展 这 个 实 用 程 序 的 功 能 例 如
你 | 可 | 以 | 在 | 每 | 次 | 双 | 击 |
日 |
期 |
时 |
显 |
示 | 一 |
个 |
弹 | 出 | 式 |
的 |
小 | 型 |
记 |
事 | 本 |
在 |
记 |
事 |
本 |
中 |
记 |
录 |
每 |
天 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
的 | 日 | 程 | 安 | 排 | 毫 |
无 |
疑 |
问 |
这 |
个 |
程 |
序 |
不 | 会 | 取 | 代 | 你 |
的 |
合 |
同 |
管 |
理 |
器 |
但 |
作 |
为 |
一 |
个 |
笔 |
记 | |||
本 | 它 | 确 |
实 |
干 |
得 |
不 |
错 |
— |
— | 特 |
别 |
是 | 在 | 空 | 间 | 有 | 限 | 的 | 膝 | 上 |
机 |
和 |
你 |
并 |
不 |
想 |
让 |
大 |
型 |
应 |
用 |
程 |
序 |
用 尽 电 池 的 情 况 下
图 2 .2 样本 对话 框应 用程序 显示 一个 对话框 告诉 用户它 所选 择的 日期
C a le nda r 控 件 提 供 了 不 少 的 功 能 绝 大 部 分 本 章 中 都 没 有 涉 及 再 做 一 个把 日 期 设 置 回 当 天 日 期 的 按 钮 简 单 方 便 这 样 当 你 打 电 话 离 开 一 会 儿 时 就 可以 用 了 添 加 这 样 的 按 钮 一 点 也 不 难 图 2 .3 显 示 了 我 已 经 添 加 到 现 存 工 程 中的 按 钮 它 的 ID 为 ID C_ RE S E T _ D A T E 标 题 为 R e s e t D a te 如 果 把 该 按 钮 放置 在 243 ,39 并 把 它 调 整 到 50 40 的 大 小 时 对 话 框 看 上 去 更 舒 服 些
既 然 我 们 有 了 按 钮 那 就 再 添 加 几 行 代 码 吧 右 击 该 按 钮 并 从 上 下 文 菜 单中 选 择 Ev e n ts 系 统 显 示 N e w W indow s M e s s a ge a nd E v e n t H a nd le rs 对 话 框 选择 BN _ C L ICK E D 事 件 然 后 单 击 A dd a n d E d it 单 击 OK 接 受 缺 省 的 过 程 名 你 会 看 到 一 个 空 的 过 程 程 序 列 表 2 .4 提 供 了 要 在 该 过 程 中 添 加 的 代 码
图 2 .3 提供 个按 钮在 操作了 一阵 日历 后把日 期重 新设置 到当 前日 期确实 很方 便
程 序 列 表 2 . 4
vo id C D ia logD L g : : O nR e se t D a te ( )
{
// R e s e t s e le c te d c a le n d a r d a te to to d a y . m _ c a le n da r 1 .T od a y ( )
}
现 在 只 要 你 单 击 一 下 R e s e t D a te 按 钮 C a le nda r 控 件 就 会 向 用 户 返 回 当 前 的月 份 和 年 度 虽 然 这 段 代 码 并 不 复 杂 它 却 展 示 了 在 不 增 加 应 用 程 序 使 用 复 杂程 度 的 情 况 下 给 对 话 框 应 用 程 序 添 加 功 能 的 途 径 当 然 即 使 只 有 少 量 的 这 种按 钮 过 上 一 阵 子 也 会 让 人 厌 倦
- 4 编 写 单 文 档 应 用 程 序
每 个 版 本 的 M ic ros oft V is u a l C + + 向 导 都 有 轻 微 的 改 进 在 你 集 中 精 力 使 用某 个 向 导 的 过 程 中 设 置 应 用 程 序 时 遗 漏 某 些 东 西 也 是 件 毫 不 奇 怪 的 事 情
本 节 研 究 单 文 档 应 用 程 序 — — 或 许 你 已 经 用 它 编 写 过 某 个 小 型 的 文 本 编 辑器 或 其 它 轻 型 通 用 的 文 档 编 辑 器 本 例 中 我 们 将 创 建 一 个 丰 富 格 式 文 本 编辑 器 它 不 需 要 做 多 少 工 作 就 可 以 很 好 地 编 辑 文 本 了 在 本 书 后 续 章 节 中 我们 将 给 这 个 程 序 增 加 新 的 功 能 使 其 更 加 有 实 用 价 值
开 始 这 个 工 程 时 使 用 F ile |N e w 显 示 N e w 对 话 框 选 择 M F C A ppW iz a rd( E X E ) 工 程 类 型 在 P ro ject N a m e 域 键 入 应 用 名 称 示 例 应 用 中 使 用 S ng1_D oc 作 为应 用 程 序 名 称 但 你 也 可 以 使 用 与 此 相 似 的 任 何 名 称 单 击 OK 系 统 显 示 M F C A ppW iz a rd - S te p 1 对 话 框 选 择 S in g le D o c u m e n t 选 项 然 后 单 击 N e x t 系 统显 示 如 下 图 所 示 的 M F C A ppW iz a rd - S te p 2 of 6 对 话 框
这 是 需 要 你 做 出 决 策 的 第 一 个 位 置 如 果 你 想 在 应 用 程 序 中 增 加 对 数 据 库的 支 持 那 么 需 要 决 定 在 M F C A ppW iz a rd 中 得 到 哪 个 层 次 的 支 持 在 本 书 的 第二 部 分 我 们 将 花 些 时 间 详 细 讨 论 这 个 问 题 因 此 这 里 我 就 不 多 讲 了 单 击 N e x t
你 会 看 到 如 下 图 所 示 的 S te p 3 对 话 框
这 个 对 话 框 的 上 半 部 决 定 了 要 在 应 用 程 序 中 添 加 哪 个 层 次 的 OL E 支 持 添加 的 支 持 越 多 应 用 程 序 也 就 越 大 最 基 本 的 OL E 支 持 层 次 是 用 做 容 器 C on ta ine r 容 器 既 可 以 作 为 客 户 又 可 以 存 储 链 接 对 象 和 嵌 入 对 象 下 一 个 OL E 支 持 层 次 是 M in i- s e rv e r 小 型 服 务 器 它 允 许 创 建 复 合 文 档 小 型 服务 器 不 能 独 立 工 作 另 外 它 只 能 操 作 嵌 入 对 象 作 为 服 务 器 使 用 时 全 功 能
服 务 器 Fu ll- Se rv e r 确 实 具 备 了 OL E 的 全 部 功 能 但 它 却 不 能 作 为 容 器 使 用这 样 的 应 用 程 序 用 起 来 与 M ic ros oft P a in t 画 图 十 分 相 似 你 可 以 把 M ic ros oft Pa in t 文 档 嵌 入 或 链 接 到 你 的 应 用 程 序 中 但 M ic ros oft P a in t 本 身 不 能 存 储 其 它
入 或 链 接 到 你 的 应 用 程 序 中 但 M ic ros oft P a in t 本 身 不 能 存 储 其 它 应 用 程 序 创建 的 对 象 最 后 B o th C on ta in e r a nd S e rv e r 选 项 让 你 的 应 用 程 序 具 备 本 地 OL E 支 持 的 所 有 功 能 你 既 可 以 把 应 用 程 序 用 做 OL E 服 务 器 也 可 以 将 它 用 做 OL E 客 户 但 是 这 种 应 用 程 序 不 能 用 做 In te rn e t 浏 览 器 — — 原 因 在 于 它 没 有 设 计 成A c tiv e X D o c u m e n t 服 务 器
注 意 在 最 后 一 个 单 选 钮 B o th C on ta ine r a nd S e rv e r 的 下 方 有 两 个 复 选 框如 果 选 中 第 一 个 复 选 框 V is u a l C + + 还 将 增 加 使 你 的 应 用 程 序 用 做 A c tiv e X
D o cu m e n t S e rv er A c t iv e X 文 档 服 务 器 所 需 的 支 持 A c tiv e D o cu m e n t S e rv er 能 够 创 建 和 管 理 A c tiv e X 文 档 第 二 个 复 选 框 是 A c tiv e D o c u m e n t C o n ta in e r 它允 许 你 的 应 用 程 序 在 其 框 架 内 包 含 A c tiv e X 文 档 本 质 上 说 它 允 许 你 在 应 用程 序 中 嵌 入 像 M ic ros oft W o rd 或 Ex c e l 这 样 的 应 用 程 序 生 成 的 文 档 现 在 我们 选 择 B o th C on ta in e r a nd S e rv e r 选 项 并 选 中 A c t iv e D o c u m e n t S e rv e r 复 选 框
在 第 11 章 中 我 们 将 探 讨 这 项 选 择 的 细 节
在 S te p 3 对 话 框 中 还 有 另 外 两 个 重 要 的 复 选 框 第 一 个 是 A u to m a t io n 对大 型 应 用 程 序 来 说 通 常 要 选 中 这 个 复 选 框 A u to m a tio n 允 许 你 操 作 其 它 应 用 程序 创 建 的 对 象 也 允 许 自 动 化 A u to m a tio n 客 户 端 操 作 你 的 应 用 程 序 创 建 的对 象 从 现 在 开 始 也 可 以 把 自 动 化 看 成 是 一 种 可 编 程 能 力 虽 然 这 种 说 法 不甚 精 确 自 动 化 的 完 整 定 义 相 当 长 需 要 放 开 讲 才 能 说 清 楚 — — 在 本 书 的 后 续章 节 中 我 们 将 讨 论 这 个 问 题
第 二 个 选 项 是 A c tiv e X C o n tro l 如 果 在 应 用 程 序 中 要 使 用 任 何 OC X 控 件 无论 OC X 控 件 是 否 设 计 成 A c tiv e X 控 件 那 么 都 必 须 选 中 这 个 复 选 框 确 实 选中 A c tiv e X C o n tro l 和 A u to m a t io n 复 选 框 然 后 单 击 N e x t 系 统 显 示 如 下 图 所示 的 S te p 4 对 话 框
该 对 话 框 的 上 半 部 分 用 于 选 择 应 用 程 序 中 要 包 含 的 界 面 元 素 的 类 型 正 常情 况 下 保 留 V is u a l C + + 的 缺 省 设 置 这 样 的 设 置 将 创 建 标 准 的 应 用 程 序 如果 想 为 用 户 提 供 上 下 文 相 关 帮 助 那 么 选 中 C o n te x t- S e n s itiv e H e lp 复 选 框 在
第 15 章 中 我 们 将 介 绍 向 应 用 程 序 中 添 加 上 下 文 相 关 帮 助 的 方 法
这 个 对 话 框 中 下 面 的 两 个 选 项 让 你 在 应 用 程 序 中 添 加 通 讯 支 持 功 能 第 一个 选 项 专 门 用 于 电 子 邮 件 选 中 这 个 选 项 后 应 用 程 序 可 以 发 送 和 接 收 电 子 邮 件只 要 电 子 邮 件 应 用 程 序 与 M A P I 兼 容 第 二 个 选 项 让 应 用 程 序 通 过 TC P / IP
网 络 进 行 通 讯 如 果 要 在 你 的 应 用 程 序 中 添 加 In te rn e t 支 持 功 能 那 么 选 中 这 个复 选 框
V is u a l C + + 包 含 的 新 特 性 让 你 能 够 选 择 工 具 条 的 外 观 我 们 既 可 以 选 择 N o r - m a l 使 用 标 准 C+ + 工 具 条 的 外 观 也 可 以 选 择 In te rn e t E xp lore r 提 供 的 新 外 观使 用 In te rn e t E x p lo re r R e B a rs 选 项 有 两 个 好 处 我 们 既 可 以 在 工 具 条 上 添 加 任 何W ind ow s 控 件 并 不 仅 限 于 菜 单 命 令 也 可 以 像 命 令 条 那 样 漂 浮 R e B a rs
剩 下 的 两 个 选 项 是 最 近 使 用 文 件 列 表 中 列 出 的 文 件 个 数 和 一 个 标 题 为 A d - va nc e d 的 神 秘 按 钮 正 常 情 况 下 我 把 最 近 使 用 文 件 列 表 中 列 出 的 文 件 个 数 设置 为 尽 可 能 大 的 值 原 因 在 于 我 经 常 要 操 作 许 多 文 档 在 这 里 给 用 户 提 供 最 大的 灵 活 性 并 不 影 响 应 用 程 序 的 大 小 和 速 度 因 此 将 其 设 置 为 尽 可 能 大 的 值 并不 是 什 么 大 是 大 非 的 问 题
现 在 让 我 们 看 一 看 A dva nc e d 按 钮 单 击 这 个 按 钮 系 统 显 示 如 下 图 所 示 的A dva nc e d O p tions 对 话 框 这 个 对 话 框 是 设 置 文 档 参 数 的 地 方 也 是 选 择 用 户使 用 时 显 示 在 标 题 条 中 文 本 这 类 设 置 的 地 方 在 标 题 条 中 也 将 显 示 当 前 文 档 的名 称
按 上 图 所 示 设 置 A dva nc e d O p tions 对 话 框 完 成 后 的 应 用 程 序 使 用 扩 展 名为 XYZ 的 文 件 应 用 程 序 的 标 题 为 S ing le D o c u m e nt E x a m p le 每 次 显 示 F ile O p e n 或 F ile Sa v e 对 话 框 时 过 滤 器 域 显 示 为 XYZ S in g le D o c u m e n t F ile (* .x y z ) 最 后 当 显 示 该 应 用 程 序 创 建 的 文 档 的 属 性 对 话 框 时 对 话 框 将显 示 该 文 档 的 类 型 为 XYZ S in g le D o c u m e n t 单 击 C lo s e 按 钮 接 受 上 述 设 置单 击 两 次 N e x t 系 统 显 示 如 下 图 所 示 的 S te p 6 对 话 框
这 是 我 要 向 你 介 绍 技 巧 的 另 一 个 地 方 如 果 你 没 有 真 正 留 意 的 话 就 有 可能 遗 漏 在 文 档 视 图 类 中 可 以 使 用 你 喜 爱 的 任 何 基 类 这 一 事 实 为 什 么 说 要 重 点考 虑 基 类 的 选 择 呢 如 果 接 受 了 V is u a l C + + 的 缺 省 设 置 那 么 应 用 程 序 对 文 档的 任 何 操 作 你 都 必 须 编 写 代 码 当 你 要 创 建 一 种 全 新 的 文 档 时 上 述 设 置 并 没有 任 何 不 妥 但 绝 大 多 数 应 用 程 序 并 非 要 创 建 一 种 全 新 的 文 档 而 是 建 立 一 个与 其 它 应 用 程 序 相 似 并 提 供 其 它 应 用 程 序 所 缺 乏 特 性 的 应 用 程 序 本 例 中
我 们 要 创 建 一 个 文 本 编 辑 器 因 此 没 有 必 要 使 用 CV ie w 应 用 程 序 的 缺 省 基 类
选 择 C E d itV ie w 或 C R ic h E d itV ie w 类 作 为 应 用 程 序 的 基 类 将 省 去 许 多 工 作 原因 在 于 该 应 用 程 序 一 经 设 计 就 已 经 知 道 作 为 简 单 的 字 处 理 程 序 应 该 如 何 完 成 任务 你 甚 至 不 需 要 添 加 任 何 代 码 就 能 得 到 上 述 功 能
为 了 展 示 基 类 的 作 用 在 示 例 程 序 中 我 们 选 择 C R ic h E d itV ie w 作 为C S ng1_D oc V ie w 类 的 基 类 单 击 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 + + 为 你 创 建 该 示 例 应 用 程 序
现 在 生 成 应 用 程 序 并 启 动 运 行 你 会 看 到 可 以 在 应 用 程 序 中 输 入 文 本 并 将其 保 存 到 XYZ 文 档 中 添 加 一 些 代 码 后 该 应 用 程 序 就 可 以 读 取 其 它 文 本 和 RT F 文 档 当 然 也 可 以 以 其 它 方 式 扩 展 这 个 应 用 程 序 例 如 由 于 该 应 用 程 序 使用 了 富 文 本 编 辑 控 件 因 此 可 以 为 其 增 加 文 本 格 式 化 功 能 和 颜 色 功 能 我 们 已经 添 加 的 OL E 能 力 意 味 着 需 要 时 可 以 在 文 档 中 插 入 图 像 已 经 完 成 的 应 用 程 序只 做 了 很 少 的 工 作 就 具 备 了 许 多 潜 在 的 功 能
或 许 现 在 你 还 没 有 注 意 到 这 个 特 殊 的 示 例 程 序 并 没 有 要 你 编 写 一 行 代 码最 终 的 程 序 相 当 完 美 是 C 程 序 员 不 敢 想 像 的 图 2 .4 展 示 了 到 现 在 为 止 这 个应 用 程 序 的 显 示 结 果 随 着 本 书 的 展 开 我 们 将 进 一 步 改 进 这 个 应 用 程 序
图 2 .4 考虑 到我 们并 没有给 这个 示例 应用程 序添 加任何 代码 应 该说它 运行 的够 完美了
- 5 编 写 基 于 HT ML 文 档 的 应 用 程 序
毫 无 疑 问 In te rn e t 已 经 成 为 许 多 公 司 降 低 成 本 提 高 效 率 计 划 的 一 部 分 另 外 In te rn e t 也 是 销 售 产 品 查 询 信 息 的 新 方 法 并 能 完 成 许 多 几 年 前 人 们 还认 为 不 能 完 成 的 许 多 商 务 方 面 的 其 它 任 务 这 就 是 本 例 极 为 重 要 的 原 因 该 示例 展 示 了 把 In te rn e t 能 力 置 入 应 用 程 序 的 方 法 它 把 两 种 不 同 的 媒 体 融 合 成 了 一个 和 谐 的 整 体
本 节 展 示 如 何 创 建 基 于 HT M L 文 档 的 程 序 框 架 虽 然 用 向 导 生 成 的 框 架 功能 还 有 限 但 它 既 能 显 示 In te rn e t 上 的 HT M L 文 档 也 能 显 示 不 在 In te rn e t 上 的HT M L 文 档 当 我 们 拥 有 了 可 以 使 用 的 基 本 框 架 后 就 可 以 考 虑 添 加 一 些 绝 大多 数 应 用 程 序 都 需 要 的 某 些 增 强 功 能 了
创 建 基 本 程 序 框 架
对 本 例 来 说 我 们 将 使 用 本 章 前 面 介 绍 过 的 单 文 档 应 用 程 序 的 一 种 变 体
作 为 本 工 程 的 开 始 使 用 F ile | N e w 命 令 显 示 N e w 对 话 框 选 择 M F C A pp- W iz a rd (E X E ) 工 程 类 型 在 P ro ject N a m e 域 中 键 入 名 称 示 例 应 用 程 序 使 用 的 应用 程 序 名 为 S g1_H T M L 但 你 可 以 选 择 自 己 喜 爱 的 任 何 名 称 单 击 OK 按 钮
系 统 显 示 M F C A ppW iz a rd - S te p 1 对 话 框 选 择 S ing le D o c u m e nt 选 项 然 后 单击 N e x t 按 钮 两 次 你 会 看 到 M F C A ppW iz a rd - S te p 3 对 话 框
正 常 情 况 下 你 会 希 望 你 的 应 用 程 序 既 用 做 OL E 服 务 器 又 用 做 OL E 容 器
但 针 对 当 前 这 种 应 用 程 序 来 说 绝 大 多 数 用 户 并 不 需 要 OL E 服 务 器 特 性 原 因在 于 只 是 使 用 这 样 的 应 用 程 序 显 示 W e b 页 面 而 无 须 建 立 新 的 数 据 正 是 出 于这 样 的 考 虑 我 们 选 择 C on ta ine r 选 项 并 选 中 A c tiv e D o cu m e n t C o n tain e r 复 选 框回 忆 一 下 A c tiv e D o cu m e n t C o n tain e r 复 选 框 的 功 能 就 会 知 道 它 允 许 你 显 示 像M ic ros oft W o rd 这 样 的 应 用 程 序 生 成 的 A c tiv e X 文 档 再 选 中 A u to m a tio n 和 A c - tiv e X C o n tro ls 复 选 框 单 击 N e x t 系 统 显 示 M F C A ppW iz a rd - S te p 4 对 话 框
在 这 个 对 话 框 中 你 至 少 要 看 一 看 其 中 的 几 个 选 项 第 一 个 选 项 是 W ind ow s S o ck ets 当 应 用 程 序 要 访 问 In te rn e t 或 内 联 网 时 应 用 程 序 需 要 W ind ow s S o c k e t 支 持 如 果 应 用 程 序 还 要 支 持 电 子 邮 件 那 么 也 要 选 中 M A P I 选 项 最 后 由于 你 的 应 用 程 序 或 许 还 需 要 相 当 复 杂 的 工 具 条 来 向 用 户 提 供 全 功 能 的 导 航 能力 那 么 也 要 选 中 In te rn e t E x p lo re r R e B a rs 选 项 我 还 把 最 近 使 用 文 件 列 表 的 文件 数 设 置 成 了 16 单 击 N e x t 两 次 系 统 显 示 M F C A ppW iz a rd - S te p 6 对 话 框
这 个 对 话 框 中 唯 一 需 要 修 改 的 选 项 是 B a s e C la s s 必 须 把 这 个 选 项 设 置 为C H tm lV ie w 以 便 应 用 程 序 得 到 我 们 所 期 待 的 In te rn e t 功 能 现 在 我 们 已 经 配 置好 了 这 个 示 例 程 序 单 击 F in is h 按 钮 系 统 显 示 N e w P ro je c t In fo rm a tio n 对 话 框然 后 单 击 OK 生 成 框 架 应 用 此 时 编 译 和 运 行 应 用 程 序 时 你 会 看 到 如 下 图 所示 的 屏 幕 显 示
增 强 示 例 程 序 功 能
如 果 你 只 是 打 算 显 示 你 的 W e b 站 点 的 主 页 那 么 使 用 上 一 节 创 建 的 应 用 程序 框 架 就 能 完 成 这 个 任 务 然 而 在 绝 大 多 数 情 况 下 还 需 要 给 应 用 程 序 添 加一 些 基 本 的 导 航 能 力 只 有 单 一 的 链 接 或 许 并 不 能 让 用 户 满 意 因 此 该 应 用程 序 至 少 要 增 加 的 功 能 是 向 前 与 向 后 按 钮 现 在 就 让 我 们 看 看 增 加 这两 个 按 钮 的 方 法 吧
首 先 需 要 完 成 的 任 务 是 打 开 ID R _ M A IN F R A M E 对 话 框 没 错 In te rn e t E x - p lore r R e B a r 实 际 上 是 个 对 话 框 而 不 是 标 准 的 工 具 条 该 对 话 框 的 类 是C D ia logB a r 而 不 是 过 去 我 们 常 用 的 标 准 C D ia lo g 类 与 其 它 任 何 对 话 框 相 同
你 可 以 向 这 个 对 话 框 上 添 加 标 准 的 W ind ow s 控 件 我 们 在 这 个 对 话 框 上 添 加 了两 个 按 钮 如 下 图 所 示 请 注 意 这 两 个 按 钮 的 标 题 为 Fo rw a rd 和 B ack w a rd 其 ID 分 别 为 ID C_ F O RW A R D 和 ID C_ BA C K W A RD
现 在 我 们 在 R e B a r 对 话 框 上 放 置 了 两 个 按 钮 但 还 没 有 定 义 单 击 它 们 时 做些 什 么 事 实 际 上 如 果 现 在 就 编 译 和 运 行 这 个 应 用 程 序 你 会 看 到 这 两 个 按钮 以 灰 色 显 示 并 且 什 么 事 也 做 不 了 其 原 因 在 于 我 们 告 诉 了 V is u a l C + + 在哪 里 绘 制 这 两 个 按 钮 但 并 没 有 告 诉 V is u a l C + + 用 它 们 来 干 什 么 让 这 两 个 按钮 发 挥 作 用 需 要 下 述 三 个 步 骤
-
定 义
按 钮 与 消 息 处 理 程 序 之 间 的 连 接
-
声 明
消 息 处 理 程 序 函 数
-
编 写
消 息 处 理 程 序 代 码
让 我 们 先 完 成 第 一 步 定 义 按 钮 与 消 息 处 理 程 序 之 间 的 连 接 由 于 我 们 希望 这 两 个 按 钮 影 响 HT M L 页 面 的 内 容 我 们 需 要 在 C S g l_H T M L V ie w 类 中 使 用ON _ C O M M AN D 宏 建 立 连 接 程 序 列 表 2 .5 以 粗 体 形 式 显 示 了 需 要 添 加 到C S g l_H T M L V ie w .C P P 文 件 中 M E SSA G E _ M A P 节 的 代 码 请 注 意
ON _ C O M M AN D 宏 提 供 了 这 两 个 按 钮 标 识 为 ID C_ F O RW A R D 和
ID C_ BA CK W A RD 与 其 对 应 的 消 息 处 理 函 数 之 间 的 连 接
程 序 列 表 2 . 5
B E G IN _ M E S S AGE _ M AP ( C S g l_ HT M L V ie w ,C H tm l V ie w )
/ /{ { A FX _ M SG _ M A P ( C Sg l_ H T M L V ie w )
// N O T E - th e C la s s W iz a rd w ill a d d a n d re m o v e m a p p in g m a c ro s h e re .
/ / D O N O T E D IT w h a t y ou s e e in th e s e b loc k s of g e ne ra te d c o d e !
ON _ W M _ D E S T R OY () O N _ W M _ S E T FO C U S () ON _ W M _ S IZ E ( )
ON _ C O M M AND ( ID _ O L E _ IN S E R T _ N E W ,O n In se r t O b je c t)
ON _ C O M M AND ( ID _ C ANC E L _ E D IT _ C NT R ,O n C a n c e l E d i t C n tr )
/ / } } A F X_ M S G _ M A P
/ / S ta nda rd prin t ing c o m m a n ds
O N _ C O M M A N D ( ID _ F IL E _ P R IN T , C H tm lV ie w ::O n F ile P r in t)
O N _ C O M M A N D ( ID _ F IL E _ P R IN T _ D IR E C T C H tm lV ie w ::O n F ile P r in t)
O N _ C O M M A N D ( ID _ F IL E _ P R IN T _ P R E V IE W ,C H tm lV ie w ::O n F ile P rin tP re v ie w )
/ / A dd tw o m a c r o s f o r o u r bu tto ns
O N _ C O M M AND ( I DC _ F O RW A RD, CS g l_ H T M L V ie w : : O n F o r w a r d )
O N _ C O M M AND ( I DC _ B A C K W ARD , CS g l_ H T M L V ie w : : O n B a c k w a r d )
E ND _ M E S S A GE _ M AP ( )
当 我 们 定 义 了 这 两 个 按 钮 与 其 对 应 的 消 息 处 理 程 序 之 间 的 连 接 后 需 要 在
C S g l_H T M L V ie w .H 文 件 中 声 明 相 应 的 函 数 程 序 列 表 2 .6 显 示 了 声 明 这 些 函 数
的 方 |
法 |
需 要 保 证 的 一 |
点 是 |
函 数 要 声 明 成 希 |
望 创 建 |
的 |
消 |
息 |
处 理 程 序 |
在 |
这 个 |
---|---|---|---|---|---|---|---|---|---|---|---|
声 明 |
中 有 |
几 点 需 要 注 意 |
首 先 |
把 函 数 声 明 成 |
pub lic |
方 |
式 |
这 样 在 该 类 |
的 |
外 部 | |
也 可 |
以 访 |
问 这 些 函 数 |
其 次 |
把 函 数 声 明 成 虚 |
函 数 类 |
型 |
以 |
便 在 必 要 时 |
重 |
载 它 | |
们 |
程 序 列 表 2 . 6
/ / M e s s ag e H a n d le rs pub l ic :
/ / A dd s o m e m ove m e nt h a n d le rs .
v ir tu a l |
vo id |
O n F o rw a rd(); |
---|---|---|
v ir tu a l |
vo id |
O n B a c k w a rd ( ) ; |
这 两 个 消 息 处 理 函 数 相 当 简 单 程 序 列 表 2 .7 显 示 了 需 要 添 加 到C S g l_H T M L V ie w .C P P 文 件 尾 部 的 程 序 代 码 在 消 息 处 理 程 序 节 这 两 个 消息 处 理 程 序 所 做 的 事 情 就 是 直 接 调 用 C H tm lV ie w 类 的 成 员 函 数 G o F o rw a rd ( ) 和G o B ack ( )
程 序 列 表 2 . 7
///////////////////////////////////////////////////////////////////////////////////////////////////////
// C S g l_ H T M L V ie w m e s s a g e h a n d le rs vo id C S g l_H T M L V ie w : : O nF orw a rd ( )
{
G o F o rw a rd ( ) ;
}
vo id C S g l_H T M L V ie w : : O nB a c k w a rd ( )
{
G o B a c k ( ) ;
}
如 果 现 在 编 译 和 运 行 这 个 应 用 程 序 就 会 发 现 R e B a r 上 已 经 添 加 了 两 个 按钮 单 击 B ack w a rd 移 动 到 最 近 浏 览 过 的 前 一 个 W e b 页 面 单 击 Fo rw a rd 按 钮就 会 看 到 刚 刚 退 出 的 那 个 页 面 这 两 个 按 钮 的 工 作 方 式 与 它 们 在 W e b 浏 览 器 中的 工 作 方 式 相 同 当 然 这 还 仅 仅 是 个 开 始 你 可 以 在 该 对 话 框 工 具 条 上 添 加
任 意 个 数 的 定 制 按 钮 或 其 它 控 件