第 3 章 理 解 V isu a l C + + 的 资 源
资 源 是 指 各 种 各 样 可 供 利 用 的 财 富 它 们 可 能 埋 藏 在 地 表 下 面 也 可 能就 在 你 的 后 院 中 就 物 理 意 义 而 言 从 森 林 中 的 树 木 到 地 层 中 开 采 出 来 的 煤 炭这 一 切 都 可 以 称 为 资 源 虽 然 不 能 从 V is u a l C + + 中 获 得 物 理 意 义 上 的 贵 重 珍 宝但 可 以 挖 掘 到 建 立 程 序 时 所 需 的 资 源
和 任 何 一 种 矿 产 资 源 一 样 V is u a l C + + 中 的 资 源 提 供 了 一 种 原 材 料 将 其 与程 序 元 素 结 合 起 来 就 可 以 创 建 一 个 成 品 在 这 里 资 源 与 代 码 结 合 创 建 应 用程 序 的 一 部 分 如 菜 单 或 工 具 条 事 实 上 在 程 序 中 看 到 的 大 多 数 元 素 也 都 来自 某 类 资 源 当 然 V is u a l C + + 资 源 不 仅 仅 是 原 材 料 但 原 材 料 的 作 用 是 非 常大 的 我 们 在 下 面 的 章 节 中 讨 论 资 源 的 用 途 牢 记 住 这 一 点 的 话 就 会 得 到 很大 的 帮 助
那 么 可 以 从 V is u a l C + + 的 资 源 矿 产 中 挖 掘 到 什 么 呢 这 些 资 源 的 外 形 和大 小 各 不 相 同 包 括 加 速 键 位 图 光 标 对 话 框 图 标 菜 单 串 表 工 具条 和 版 本 信 息 随 着 课 程 的 进 展 我 们 最 后 将 使 用 十 种 资 源 中 的 九 种 将 在 第15 章 讨 论 HT M L 资 源 你 会 看 到 某 些 资 源 存 在 子 类 每 种 资 源 都 有 特 定 的用 途 在 某 些 情 况 下 用 向 导 设 计 程 序 时 V is u a l C + + 自 动 创 建 资 源 如 A bout 对 话 框 所 创 建 的 其 它 资 源 是 设 计 另 外 一 些 程 序 的 一 部 分 如 字 符 串 最 后
你 会 人 工 设 计 一 些 资 源 如 对 话 框
注 Visual C++ 支 持 十 种 资 源 加 速 键 位 图 光 标 对 话 框 HTML 图标 菜 单 串 表 工 具 条 和 版 本 信 息
注 释 我 们 要 在 本 章 中 使 用 第 二 章 介 绍 过 的 Sng1_Doc 示 例 如 果 想 把 这 两个 练 习 分 开 只 需 创 建 Sng1_Doc 工 程 文 件 夹 的 一 个 拷 贝 为 了 便 于本 章 使 用 请 将 所 有 的 Sng1_Doc 工 程 文 件 复 制 到 Resource 资 源 工 程 文 件 夹
幸 运 的 是 你 可 以 随 时 创 建 任 何 所 需 要 的 资 源 只 需 显 示 R e s o u rce V iew 资源 视 图 右 击 R e s ourc e s 资 源 文 件 夹 从 上 下 文 菜 单 中 选 择 In s e rt 插 入
你 会 看 到 一 个 In se r t R e so u rc e 插 入 资 源 对 话 框 如 上 图 所 示 请 注 意 它 显示 出 我 们 已 提 到 过 的 所 有 十 种 资 源 还 应 该 看 到 有 三 种 创 建 资 源 的 方 式 即使 用 对 话 框 上 的 N e w 新 建 Im port 导 入 或 Cu s to m 自 定 义 按 钮
可 以 在 当 前 程 序 中 使 用 来 自 其 它 工 程 的 资 源 例 如 可 能 想 在 编 写 的 每 一个 程 序 中 都 使 用 相 同 的 公 司 徽 标 只 需 右 击 R e s ourc e s 资 源 文 件 夹 从 上 下文 菜 单 选 择 Im port 导 入 而 不 是 In s e rt 插 入 你 会 看 到 O p e n - ty p e 打 开类 型 对 话 框 选 择 包 含 了 想 要 导 入 的 资 源 的 文 件 正 是 由 于 这 个 原 因 你 会想 到 把 你 的 大 多 数 资 源 与 程 序 分 离 可 惜 的 是 这 种 方 法 只 对 图 标 光 标 声波 文 件 以 及 V isu a l B a sic 窗 体 文 件 有 用
技 巧 有 几 种 使 用 来 自 其 它 工 程 的 其 它 类 型 资 源 的 方 式 如 About 关 于 对 话 框 只 需 简 单 地 为 想 要 共 享 的 资 源 创 建 一 个 分 离 的 R C 文 件 就 行了 这 在 遇 到 像 About 对 话 框 这 样 的 资 源 时 很 有 用 你 只 要 将 R C 文件 添 加 到 工 程 中 剩 下 的 由 Visual C++ 来 处 理 另 一 种 共 享 资 源 的方 法 是 将 其 复 制 到 剪 贴 板 再 在 创 建 了 正 确 类 型 的 空 白 资 源 后 将其 粘 贴 到 工 程 中
自 定 义 资 源 就 是 自 己 设 计 的 资 源 实 际 上 它 并 不 适 合 V is u a l C + + 所 提 供的 预 定 义 类 型 创 建 一 个 自 定 义 资 源 项 目 很 容 易 只 要 单 击 In s e rt R e s o u rc e 插入 资 源 对 话 框 上 的 Cu s to m 自 定 义 按 钮 你 会 看 到 包 含 单 个 空 白 的 N e w C u s to m R e s ourc e 新 建 自 定 义 资 源 对 话 框 简 单 地 输 入 自 定 义 资 源 名 这 时 V is u a l C + + 会 产 生 一 个 新 的 文 件 夹 它 含 有 你 提 供 的 自 定 义 资 源 名 和 该 文 件 夹 内 的 一 个 新资 源 还 要 提 供 实 现 这 个 资 源 所 需 的 二 进 制 数 据
- 1 定 制 使 用 应 用 程 序 向 导 生 成 的 应 用 程 序 所 用 的 资 源
如 前 所 述 在 设 计 应 用 程 序 的 工 作 区 时 V is u a l C + + 会 自 动 创 建 某 些 类 型 的资 源 例 如 除 非 另 外 告 知 M F C A ppW iz a rd 否 则 它 会 在 程 序 中 包 括 A bout 关于 对 话 框 这 样 做 的 原 因 是 简 化 应 用 程 序 的 设 计 为 开 发 人 员 提 供 一 些 便 利条 件 还 可 以 告 诉 用 户 是 谁 设 计 了 他 们 正 在 使 用 的 程 序 一 些 缺 省 资 源 很 有 趣而 不 是 显 得 很 功 利 即 使 你 确 实 不 需 要 特 殊 的 程 序 图 标 还 是 没 有 任 何 办 法 告诉 应 用 程 序 向 导 你 并 不 想 要 程 序 的 自 定 义 图 标 另 外 包 括 图 标 的 原 因 也 很简 单 W ind ow s 需 要 它 在 E xp lo re r 中 显 示 程 序 创 建 的 每 一 个 工 程 都 应 该 有版 本 信 息 这 一 次 这 个 信 息 对 你 是 有 益 处 的 因 为 它 帮 助 你 掌 握 用 户 拥 有 哪 一种 版 本 的 产 品
注 Visual C++ 至 少 要 提 供 下 述 缺 省 资 源 自 定 义 应 用 程 序 图 标 About 关 于 对 话 框 和 版 本 信 息
如 你 所 见 自 动 创 建 这 些 缺 省 资 源 的 原 因 是 很 明 显 的 事 实 上 这 三 种 资源 代 表 了 对 每 个 工 程 你 都 应 该 考 虑 定 制 的 部 件 尽 管 你 应 该 考 虑 自 己 的 标 准 定制 技 术 但 是 本 节 仍 会 给 出 一 些 关 于 处 理 缺 省 资 源 的 提 示 和 技 巧
应 用 程 序 图 标
用 V is u a l C + + 创 建 的 每 一 个 M F C 应 用 程 序 都 有 一 个 缺 省 的 应 用 程 序 图 标事 实 上 图 标 的 名 称 总 是 相 同 的 ID R _ M A IN F R A M E 你 会 发 现 这 个 图 标 不
仅 定 义 程 序 图 标 在 E xp lo re r 或 任 何 其 它 显 示 程 序 图 标 的 程 序 中 的 外 观 还同 样 影 响 程 序 的 内 部 表 现 例 如 A bout 关 于 对 话 框 显 示 这 个 图 标 作 为 向 用户 介 绍 应 用 程 序 信 息 的 一 部 分
你 所 创 建 的 所 有 M F C 应 用 程 序 开 始 时 都 有 一 个 相 同 的 图 标 如 图 3 .1 所 示
图 3 .1 M F C A ppW iz a rd 提供 了这 个可 以使用 的缺 省图 标 但 你 确 实应该 定制 一个 自己的 图标
注 虽 然 可 以 在 应 用 程 序 中 添 加 许 多 需 要 的 图 标 但 缺 省 的 自 定 义 应 用 程序 图 标 是 IDR_MAINFR AME
如 果 你 并 不 在 乎 人 们 在 安 装 你 的 应 用 程 序 时 看 到 的 图 标 是 什 么 那 么 他 们就 会 看 到 这 个 M F C 徽 记 就 我 个 人 来 说 希 望 徽 记 看 上 去 更 有 趣 一 些 你 也 应该 如 此 毕 竟 每 次 程 序 用 户 在 E xp lo re r 中 寻 找 或 从 S ta r t 开 始 菜 单 中 选 择时 都 会 看 到 这 个 图 标
技 巧 一 定 要 为 应 用 程 序 同 时 修 改 3 2 32 图 标 如 图 3 . 1 所 示 和 1 6 16 图 标 32x32 图 标 是 在 Explorer 中 看 到 的 图 标 16 1 6 图 标 显 示 在程 序 的 控 制 菜 单 中 和 Windows 任务条上 Device 下拉列表框 如 图 3.1 所示 是选 择 3 2 32 或 1 6 1 6 图 标 的 位 置
决 定 用 应 用 程 序 创 建 文 档 时 出 现 第 二 个 缺 省 图 标 就 像 我 们 在 第 二 章 的S ng1_D oc 实 例 中 所 做 的 一 样 在 这 种 情 况 下 会 看 到 已 创 建 的 每 一 个 文 档 类 型的 ID R 在 我 们 的 实 例 中 它 是 ID R _ SN G L _ D T Y PE 它 们 会 有 相 同 的 起 始 图标 图 3 .2 显 示 了 M F C A ppW iz a rd 提 供 的 缺 省 图 标 与 应 用 程 序 图 标 不 同 如果 应 用 程 序 支 持 多 种 文 档 类 型 的 话 它 几 乎 总 是 要 强 制 你 定 制 文 档 的 图 标
除 了 绘 图 功 能 外 如 果 想 创 建 有 效 的 图 标 还 要 了 解 可 供 随 意 使 用 的 工 具所 需 要 的 全 部 工 具 都 显 示 在 窗 口 的 右 侧 它 们 包 括 一 套 标 准 的 绘 图 工 具 G ra ph ic s 工 具 条 和 一 个 颜 色 图 表 ( C o lors 工 具 条 这 些 工 具 条 可 以 象 我 们 讨 论 过 的 任何 其 它 工 具 条 那 样 隐 藏 或 显 示 它 们
图 3 .2 如果 应用 程序 需要 M F C A ppW iz a rd 还会 提供 一个 像这样 的文 档图 标
如 图 3 .2 所 示 的 G ra ph ic s 工 具 条 上 的 工 具 你 不 应 该 都 不 熟 悉 你 已 经 熟 悉 了标 准 的 选 择 工 具 画 线 和 各 种 椭 圆 及 矩 形 的 工 具 但 是 V is u a l C + + 还 包 括 喷雾 器 工 具 和 不 规 则 选 择 工 具 它 们 使 绘 画 变 得 更 加 容 易 你 还 会 发 现 M a gn ify放 大 工 具 比 一 些 绘 图 程 序 中 的 相 同 工 具 更 为 出 众 — — 它 可 以 将 图 画 放 大 至
正 常 大 小 的 八 倍
你 还 需 要 了 解 Co lo rs 工 具 条 上 的 两 种 特 殊 颜 色 由 于 它 们 使 用 监 视 器 符 号代 替 了 彩 色 方 框 所 以 可 以 很 容 易 地 找 到 它 们
注 Colors 工 具 条 中 的 两 个 监 视 器 包 含 了 当 前 窗 口 颜 色 和 透 明 颜 色 后 者可 以 把 图 标 下 面 的 东 西 显 示 出 来
上 面 的 监 视 器 可 以 创 建 一 个 透 明 区 换 言 之 你 会 看 到 桌 面 上 或 放 置 程 序图 标 的 其 它 地 方 的 该 区 下 面 所 出 现 的 东 西 下 面 的 显 示 器 允 许 你 创 建 一 个 区 它 使 用 和 用 户 窗 口 前 景 颜 色 相 同 的 颜 色 换 言 之 改 变 窗 口 颜 色 时 图 标 中 该区 的 颜 色 也 随 之 改 变 你 会 看 到 当 前 的 前 景 和 背 景 颜 色 出 现 在 两 个 监 视 器 的 左侧 前 景 颜 色 出 现 在 上 面 的 矩 形 中 背 景 颜 色 出 现 在 下 面 的 矩 形 中
让 我 们 来 看 一 个 示 例 看 看 可 以 用 这 两 个 图 标 做 些 什 么 图 3 .3 显 示 了 为 我的 程 序 版 本 而 绘 制 的 示 例 图 标 和 你 看 到 的 其 它 图 标 相 比 也 许 它 们 的 艺 术 性不 是 很 高 你 们 当 中 一 定 有 艺 术 家 但 比 你 从 V is u a l C + + 得 到 的 缺 省 图 标要 好 些 很 明 显 可 以 用 任 何 方 式 定 制 图 标 请 试 着 使 用 各 种 颜 色 一 定 要 试验 所 提 到 的 两 种 自 定 义 颜 色 因 为 在 创 建 图 标 时 它 们 特 别 重 要 很 多 程 序 员 因为 不 知 道 如 何 有 效 使 用 这 两 种 特 殊 的 颜 色 所 以 创 建 的 图 标 看 上 去 很 奇 怪 它们 确 实 不 能 与 桌 面 上 其 它 图 标 协 调 一 致
图 3 .3 向程 序中 添加 特殊的 图标 一点 也不困 难 怎么想 的就 怎么 画
Web 链 接 如 果 创 建 图 标 时 需 要 一 些 美 妙 的 灵 感 Internet 上 众 多 的 站 点正 合 乎 你 的 需 求 一 个 较 好 的 站 点 是ht tp :/ /p er so na l. so lu ti on s. ne t/ hi ll el /i co .h tm 它 包 含 了 一 些 很好 的 光 标 图 标 示 例 以 及 创 建 它 们 的 实 用 程 序 如 果 这 个 站 点 还 不 能为 你 提 供 足 够 的 灵 感 可 以 看 一 看 ht tp :/ /c ra b.
看 h t t p : / / c r a b . rutgers.ed u/icons_new/icons.ht ml 虽 然 这 个 站点 主 要 提 供 G I F 图 标 但 其 3,000 个 示 例 应 该 可 以 带 给 你 一 些 灵 感这 些 图 标 中 的 绝 大 多 数 都 涉 及 流 行 的 主 题 像 The Simpsons 幸 运的 是 图 标 做 了 索 引 所 以 你 不 必 一 次 把 全 部 3,000 个 示 例 都 试 一 遍你 还 可 以 找 到 数 量 可 观 的 特 定 主 题 站 点 例 如
http://www .geocities.com/Area5 1/8604/xfiles.htm 包 含 一 批 相 当完 整 的 X 文 件 专 用 图 标 ICO 格 式
警 告 决 不 要 以 为 你 可 以 在 计 划 出 售 或 转 赠 他 人 的 程 序 中 使 用 Internet 上找 到 的 任 何 图 标 或 与 此 相 似 的 其 它 图 形 而 要 假 定 这 些 资 源 有 利于 引 发 灵 感 除 非 你 得 到 了 原 始 编 写 者 的 书 面 许 可 不 可 把 这 些 资 源用 于 其 它 用 途 在 Internet 提 供 的 开 放 环 境 中 侵 权 现 象 是 严 重 的也 比 较 容 易 发 生 从 经 验 来 看 最 好 的 办 法 是 创 建 你 自 己 的 图 标 或者 从 可 靠 的 来 源 那 里 得 到 准 许 用 于 商 业 目 的 的 许 可
请 注 意 我 在 两 个 图 标 上 都 使 用 了 透 明 颜 色 并 赋 予 它 们 三 维 的 外 观 再说 一 句 虽 然 它 们 并 非 那 么 富 于 美 观 但 确 实 给 了 用 户 一 种 特 别 的 感 觉 很 明显 编 辑 器 内 的 透 明 着 色 所 表 现 出 来 的 和 用 户 看 到 实 际 上 或 者 看 不 到 的 不同 下 面 是 在 E xp lo re r 内 看 到 的 两 个 图 标 的 外 观
技 巧 在 修 改 图 标 后 一 定 要 再 次 编 译 程 序 否 则 它 不 能 在 Explorer 中 显示 运 行 程 序 也 是 一 个 好 主 意 因 为 在 第 一 次 运 行 程 序 时 Visual C++ 会 制 作 注 册 表 项 目 最 后 一 定 要 在 Explorer 内 使 用 View | Refr esh 命 令 否 则 你 看 到 的 依 然 是 Explorer 先 前 存 储 的 老 图 标
About 对 话 框
为 应 用 程 序 定 制 A bout 对 话 框 并 不 麻 烦 事 实 上 使 用 前 一 节 中 介 绍 的 信息 修 改 应 用 程 序 图 标 时 就 已 经 开 始 定 制 该 对 话 框 了 V is u a l C + + 自 动 将 你 为应 用 程 序 创 建 的 图 标 添 加 到 缺 省 A bout 对 话 框 下 图 是 我 们 的 示 例 应 用 程 序 使用 的 缺 省 A bout 对 话 框
技 巧 因 为 显 示 在 缺 省 About 对 话 框 内 的 信 息 总 是 基 于 你 提 供 给 MFC App- Wizard 的 输 入 所 以 要 给 出 尽 可 能 清 楚 的 信 息 这 样 做 将 减 小 后 续的 工 作 量 这 些 设 置 还 会 影 响 我 们 将 在 本 章 后 面 看 到 的 版 本 信 息
那 么 需 要 在 标 准 的 A bout 对 话 框 中 提 供 些 什 么 呢 缺 省 A bout 对 话 框 为你 提 供 了 一 些 灵 感 基 本 上 一 个 A bout 对 话 框 应 该 提 供 四 条 信 息 公 司 名 称版 权 信 息 产 品 名 称 和 版 本 号 如 果 提 供 了 这 样 四 个 必 要 的 项 目 应 用 程 序 的A bout 对 话 框 就 有 了 它 绝 对 应 该 拥 有 的 一 切 请 注 意 缺 省 A bout 对 话 框 提 供了 这 四 条 必 要 信 息 中 的 三 条 如 果 你 不 想 做 太 多 工 作 的 话 也 只 需 要 添 加 上公 司 名 称 即 可
当 然 你 可 能 想 将 其 它 一 些 必 要 的 信 息 提 供 给 应 用 程 序 中 的 A bout 对 话 框例 如 让 用 户 知 道 该 去 哪 里 获 得 技 术 支 持 是 很 重 要 的 添 加 电 话 号 码 和 几 个 访问 指 令 是 个 好 主 意 这 也 无 须 消 耗 太 多 的 空 间 一 些 公 司 还 添 加 了 产 品 注 册 序号 作 为 技 术 支 持 信 息 的 一 部 分 但 提 供 这 类 信 息 要 从 注 册 表 或 IN I 文 件 开 始
某 些 有 用 的 信 息 包 括 了 可 用 于 支 持 应 用 程 序 的 当 前 系 统 资 源 例 如 V is u a l C+ + 提 供 了 一 种 将 当 前 磁 盘 和 内 存 统 计 值 添 加 到 A bout 对 话 框 的 方 式 而 且 并不 需 要 你 自 己 多 做 多 少 工 作 让 我 们 看 看 如 何 才 能 在 对 话 框 中 添 加 这 种 能 力
下 面 的 过 程 帮 助 你 将 磁 盘 和 内 存 统 计 值 添 加 到 所 创 建 的 任 一 A bout 对 话 框 或
者 与 此 相 似 的 任 一 其 它 对 话 框 中
-
调
整 A bout 对 话 框 的 大 小 现 在 的 对 话 框 太 小 放 不 下 额 外 的 信 息 很明 显 你 也 不 想 把 它 做 得 太 大 因 为 A bout 对 话 框 应 该 足 够 小 以 适 应 可 能 存在 的 最 小 显 示 区 在 本 示 例 中 将 A bout 对 话 框 的 大 小 调 整 为 250*150 这 应该 足 以 显 示 磁 盘 和 内 存 统 计 值 了 也 为 版 权 和 其 它 辅 助 信 息 留 出 了 空 间
-
将
两 个 静 态 文 本 框 控 件 添 加 到 A bout 对 话 框 中 前 一 个 用 于 显 示 内 存 统计 值 后 一 个 用 于 显 示 磁 盘 统 计 值
-
使
这 两 个 控 件 的 大 小 为 150*18 将 内 存 统 计 值 静 态 文 本 框 控 件 定 位 在40 ,40 将 磁 盘 统 计 值 静 态 文 本 控 件 定 位 在 40 ,65 这 些 定 位 数 字 假 定 你 没 有为 了 适 应 更 多 的 公 司 名 称 或 产 品 信 息 而 改 变 缺 省 静 态 文 本 框 控 件 的 大 小
-
右
击 内 存 统 计 值 静 态 文 本 框 控 件 然 后 从 上 下 文 菜 单 中 选 择 P rope r tie s 属性 将 该 控 件 的 ID 字 段 改 成 ID C _ M E M O R Y 对 磁 盘 统 计 值 静 态 文 本 框 控 件做 相 同 的 处 理 但 是 在 这 个 事 件 中 将 ID 字 段 改 变 成 ID C _ D IS K 不 要 选 中 两个 控 件 的 G roup 组 框 我 们 想 把 它 们 作 为 独 立 的 静 态 文 本 框 控 件 使 用 现 在 我 们 有 地 方 放 置 信 息 了 可 以 添 加 收 集 信 息 的 代 码 了
-
使
用 P ro je c t | A d d to P ro je c t | C o m pone n ts a nd C on tro ls 显 示 C o m pone n ts a nd C on tro ls G a lle r y 对 话 框 在 L ook In 字 段 中 双 击 V is u a l C + + C o m pone n ts 你会 看 到 如 下 图 所 示 的 一 系 列 部 件
- 加
亮 S y s te m In fo fo r A bout D lg 部 件 然 后 单 击 In s e rt 插 入 V is u a l C + +
会 显 示 一 个 对 话 框 询 问 是 否 确 实 要 安 装 该 部 件
-
单
击 OK V is u a l C + + 会 显 示 另 一 个 对 话 框 告 诉 你 正 在 安 装 的 部 件 会 添加 信 息 到 A bout 对 话 框 中
-
单 击
Y e s 继 续 安 装 V is u a l C + + 完 成 S y s te m In fo fo r A bourt D lg .部 件 的 安
装
- 单 击
C lo s e 关 闭 C o m pone n ts a nd C on tro ls G a lle r y 对 话 框
此 时 好 像 什 么 事 也 没 有 发 生 V is u a l C + + 只 是 停 在 那 儿 什 么 也 不 做 除
非 你 知 道 到 哪 里 去 看 否 则 永 远 也 找 不 到 S y s te m In fo fo r A bout D lg .部 件 所 添 加的 代 码 打 开 C la ssV ie w 然 后 双 击 C A bou tD lg :: O nIn it D ia log() 函 数 你 会 在 初始 化 代 码 中 看 到 一 些 新 的 条 目 按 程 序 列 表 3 .1 所 示 进 行 修 改
程 序 列 表 3 . 1
B O O L C A b o u t D lg ::O n In itD ia lo g ( )
{
C D ia lo g ::O n In itD ia lo g ( ) ; // C G : T h is w a s a d d e d b y S y s te m In fo C o m p o m e n t.
/ / C G : F o l lo w ing b loc k w a s a d d e d by S y s te m In fo C o m pon e n t .
{
C S tr in g s tr F reeD is k S pace; C S tr in g s tr F reeM em o ry ;
C S trin g s tr F m t ;
// F i l l a v a ila b le m e m o ry
M E M O R Y S T A T U S M e m S ta t ;
M e m S ta t . dw L e ng th = s iz e o f( M E M O R Y S T A T U S ) ; G lo b a lM e m o ry S ta tu s (& M e m S ta t);
s tr F m t .L oa dS tr ing ( C G _ ID S _ P H Y S IC A L _M E M ) ;
s tr F re e M e m ory . F o rm a t( s tr F m t , M e m S ta t .d w T o ta l P hy s / 1024 L ) ;
// D is p la y th e a m o u n t o f f re e m e m o ry .
s tr F reeM em o ry = " F ree S y s te m M e m o ry :" + s tr F reeM em o ry; S e tD lg Ite m T e x t (ID C _ M E M O R Y ,s tr F re e M e m o ry );
// F i l l d is k f re e in fo rm a tio n s tru ct_d is k f ree_ t d is k f re e;
in t n D r iv e = _ g e td r iv e ( ) ; // u s e c u r re n t d e fa u lt d riv e if (_ge td iskfre e ( nD r ive , & d is kfre e ) = = 0)
{
}
e ls e
}
s tr F m t . L oa dS tr in g( C G _ID S _D IS K _ S P A C E ) ; s tr F reeD is k S p a ce .F o rm at( s tr F m t ,
( D W O R D ) d is k f re e .av ail_ c lu s te rs *
( D W O R D ) d is kfre e .s e c tors _ pe r_ c lu s te r *
( D W O R D ) d is kfre e .by te s _pe r_ s e c tor / ( D W O R D ) 1024L , n D riv e -1 + _ T ( 'A '));
s tr F re e D is k S p a c e .L o a d S tr in g ( C G_ ID S _ D IS K _ S P A C E _ U N AVA IL ) ;
// D is p la y th e a m o u n t o f f re e d isk s p a c e .
s tr F reeD is k S p a ce = F re e D is k Sp a c e : + s tr F reeD isk S p a ce; S e t D lg I te m T e x t( ID C _D IS K , s tr F re e D iskS pa c e ) ;
re tu rn T R U E ; / / C G : T h is w a s a dde d by S y s te m In fo C o m pone n t.
}
请 注 意 S y s te m In fo fo r A bout D lg .部 件 提 供 的 缺 省 代 码 只 从 缺 省 驱 动 器 中检 索 数 据 可 以 很 容 易 地 修 改 这 个 代 码 以 检 索 用 户 机 器 上 所 有 驱 动 器 的 驱 动器 空 间 信 息 你 得 到 的 内 存 及 磁 盘 空 间 字 符 串 缺 少 像 F ree D is k S p ace 这 样 的
提 示 这 一 提 示 说 明 了 A bout 对 话 框 提 供 的 是 什 么 信 息 可 惜 的 是 没 有 提 示信 息 将 给 用 户 带 来 更 多 的 疑 惑 而 不 是 帮 助 一 定 要 添 加 某 种 提 示 信 息 像 程序 列 表 3 .1 中 显 示 的 那 样 来 告 诉 用 户 数 据 的 意 义 最 后 请 注 意 缺 省 字 符 串实 际 上 由 更 为 复 杂 的 统 计 值 组 成 可 以 很 容 易 地 将 这 个 额 外 的 信 息 添 加 到 你 的A bout 对 话 框 下 面 是 这 个 代 码 产 生 的 最 终 结 果
这 个 A bout 对 话 框 并 不 提 供 用 户 所 需 要 的 一 切 但 我 们 将 在 本 章 的 下 一 节中 进 一 步 修 改 它 现 在 A bout 对 话 框 自 动 提 供 了 磁 盘 空 间 和 内 存 的 统 计 值它 还 提 供 了 程 序 名 称 版 本 和 版 权 信 息 我 们 将 在 下 一 节 看 到 你 同 样 可 以 自动 生 成 这 三 条 信 息
现 在 再 看 一 看 定 制 问 题 谈 到 定 制 这 个 话 题 你 可 以 做 许 许 多 多 的 工 作 目 前 应 用 程 序 中 的 某 些 A bout 对 话 框 本 身 就 是 个 袖 珍 型 的 应 用 程 序 它 们 或许 承 担 的 任 务 太 多 了 如 果 发 现 有 必 要 向 A bout 对 话 框 中 添 加 按 钮 和 另 外 一 些
对 话 框 时 就 应 该 考 虑 将 此 信 息 放 置 到 别 的 地 方 比 如 某 个 帮 助 文 件 中
版 本 信 息
你 或 许 未 认 真 思 索 就 跳 过 了 V is u a l C + + 自 动 提 供 的 版 本 信 息 资 源 以 前除 了 知 道 如 何 找 到 版 本 信 息 的 程 序 员 外 该 信 息 对 每 个 人 来 说 都 深 深 地 隐 藏 了起 来 问 题 在 于 使 用 W ind ow s 95 和 W ind ow s N T 4 提 供 的 E xp lo re r 界 面 你
不 能 再 回 避 版 本 信 息 了 现 在 要 显 示 应 用 程 序 提 供 的 版 本 信 息 只 需 右 击 E xp lo re r 中 的 程 序 图 标 然 后 从 上 下 文 菜 单 选 择 P rope r tie s 属 性 选 择 P rope r tie s 属性 对 话 框 的 V e rs io n 版 本 选 项 卡 会 看 到 如 下 图 所 示 的 画 面
如 你 所 见 缺 省 版 本 的 信 息 量 很 少 如 果 是 这 样 的 话 用 户 甚 至 会 不 知 道他 们 在 和 哪 一 家 公 司 打 交 道 因 为 越 来 越 多 的 用 户 开 始 关 注 P rope r tie s 属 性 对 话 框 必 须 提 供 些 什 么 所 以 对 程 序 员 来 说 在 这 里 放 入 适 当 类 型 的 信 息 就 变得 越 来 越 重 要 了
技 巧 填 写 应 用 程 序 的 版 本 信 息 并 不 是 单 向 的 也 可 以 用 这 个 信 息 填 写 应用 程 序 的 其 它 区 域 这 意 味 着 你 必 须 只 改 变 一 个 地 方 的 信 息 使 其 处于 当 前 状 态 在 本 节 中 我 们 看 看 如 何 为 About 对 话 框 使 用 这 种 技 术当 然 你 也 可 以 在 其 它 地 方 使 用 它
高 级 技 巧
在 某 些 情 况 下 你 或 许 想 修 改 版 本 信 息 资 源 中 的 文 件 专 用 信 息 例 如如 果 双 击 FILEFLAGS 文 件 标 记 条 目 会 看 到 FILEFLAGS 文 件 标 记 对 话 框 包 含 两 个 复 选 框 第 一 个 复 选 框 说 明 版 本 信 息 是 调 试 版 的 版 本信 息 还 是 发 行 版 的 版 本 信 息 第 二 个 复 选 框 说 明 该 版 本 信 息 是 否 是 程序 的 预 发 行 版 对 你 的 版 程 序 来 说 可 以 选 中 VS_FF_PRER ELEASE 复选 框 一 旦 该 程 序 能 够 正 常 发 行 那 么 你 应 该 不 选 中 这 个 复 选 框
FILEOS 条 目 是 另 一 个 提 供 定 制 机 会 的 地 方 假 定 程 序 依 赖 Windows NT 提 供 的 安 全 特 征 你 可 能 想 将 FILEOS 条 目 从 缺 省 的 VOS_WINDOW S32 改成 VOS_NT 或 VOS_NT_WIN DOWS32
修 改 应 用 程 序 时 保 持 FILEVERSIO N 文 件 版 本 和 PRODUCTVER SION 产品 版 本 域 为 最 新 也 很 重 要 使 用 这 些 区 域 有 几 个 不 同 的 方 式 最 好的 方 式 是 简 单 地 忽 略 Visual C++ 建 议 的 方 法 如 果 这 是 程 序 的 第 一个 版 本 输 入 像 1 . 0 这 样 的 简 单 数 字
让 我 们 看 一 看 示 例 应 用 程 序 的 版 本 信 息 可 以 在 R e s o u rce V iew 资 源 视 图 中 的 V e rs io n 版 本 文 件 夹 下 找 到 缺 省 信 息 缺 省 资 源 名 是VC _ V E R S ION _ IN F O 图 3 .4 显 示 了 缺 省 的 版 本 信 息 粗 实 线 上 的 条 目 通 常 反映 应 用 程 序 的 设 置 并 不 需 要 经 常 修 改 它 们 以 B lo c k H ead er 开 始 的 粗 实 线 下
图 3 .4 要修 改缺 省版 本信息 使 其 和 公司及 产品 的实际 信息 一致
可 以 双 击 任 何 一 个 文 本 条 目 来 修 改 它 们 V is u a l C + + 会 打 开 一 个 用 来 更 改 信息 的 编 辑 框 至 少 你 想 更 新 Co m p a n y N a m e 公 司 名 称 L e g a l C op y r ight 合法 版 权 和 P roduc t N a m e 产 品 名 称 字 段 我 通 常 还 添 加 一 些 信 息 到 Co m m e n ts 注 释 字 段 例 如 关 于 某 个 应 用 程 序 或 其 它 可 执 行 程 序 知 道 该 与 谁 联 系是 很 方 便 的 所 以 我 经 常 添 加 我 的 名 字 和 电 子 邮 件 地 址 到 底 向 这 个 区 域 添 加些 什 么 要 视 公 司 政 策 合 法 需 要 和 个 人 爱 好 而 定 下 面 是 在 P rope r tie s 属 性 对 话 框 中 查 看 时 我 的 已 修 改 版 本 的 信 息
既 然 已 经 花 时 间 向 应 用 程 序 中 添 加 了 版 本 信 息 那 么 充 分 发 挥 这 些 信 息 的作 用 就 显 得 尤 其 重 要 了 A bout 对 话 框 中 相 同 类 型 的 信 息 通 常 还 出 现 在 其 它 需要 版 本 信 息 的 某 些 地 方 所 以 将 两 者 结 合 起 来 是 一 个 好 主 意 这 样 就 不 会 出 现A bout 对 话 框 和 版 本 信 息 不 合 拍 的 情 形 程 序 列 表 3 .2 显 示 了 这 样 的 代 码 你 需要 将 其 添 加 到 C A bou tD lg :: O nIn it D ia log() 函 数 中 以 将 版 本 信 息 添 加 到 A bout 对
话 框 我 们 在 本 章 的 A bout 对 话 框 一 节 中 看 到 过 这 个 函 数 所 以 这 里 只 说 明 新的 代 码 — — 将 此 代 码 放 在 函 数 的 开 始 位 置
程 序 列 表 3 . 2
L P T S T R |
lp s tr F ile N a m e ; |
// N a m e o f o u r p ro g ra m . |
---|---|---|
D W O R D |
d w H a nd le ; |
/ / A p la c e h o lde r ha nd le . |
D W O R D |
d w S iz e ; |
// S iz e o f th e v e rs io n in fo rm a tio n b lo c k . |
L P V O ID |
lp B u f fe r ; |
// B u f fe r to s to re v e r s io n in fo rm a tio n b lo c k . |
L P V O ID |
lp D ata; |
/ / O n e v e rs io n in fo rm a tio n valu e. |
U IN T |
u i D a ta S iz e ; |
// S iz e o f th e v e rs io n in fo rm a tio n v a lu e . |
C s tr in g |
s tr P rodu c t ; |
/ / P ro duc t na m e a nd v e rs io n. |
C s tr in g s tr C o m p a n y ; // C o m p a n y n a m e a n d c o p y r ig h t in fo rm a tio n .
// In itia liz e o u r v a r ia b le s a n d a llo c a te m e m o ry . lp s tr F ile N a m e = " S n g l_ D o c .E X E " ;
dw H a nd le = 0 ;
u i D a ta S iz e = 80;
lp D a ta = m a llo c ( u i D a ta S iz e ) ;
// G e t th e v e r s io n in fo rm a tio n b lo c k s iz e ,
// th e n u s e it to a llo c a te a s to ra g e b u f fe r .
d w S iz e = G e tF ile V e r s io n In fo S iz e ( lp s tr F ile N a m e , & d w H a n d le ) ;
lp B u f fe r = m a llo c ( d w S iz e ) ;
// G e t th e v e r s io n in fo rm a tio n b lo c k .
G e tF ile V e r s io n In fo ( lp s tr F ile N a m e , 0 , d w S iz e , lp B u f fe r ) ;
/ / U s e th e ve rs io n in fo rm a t io n b loc k to ob ta in th e pro d uc t n a m e . V e rQ u e ry V a lu e ( lp B u ffe r ,
T E X T ( " \ \ S trin g F ile In fo \\0 4 0 9 0 4 b 0 \\P ro d u c t N a m e " ) , & lp D a ta ,
& u i D a ta S iz e ) ;
s tr P ro d u c t = LP TS TR ( lp D a ta ) ; s trP ro d u c t = s tr P ro d u c t + " \ n " ;
/ / U s e th e ve rs io n in fo rm a t io n b loc k to ob ta in th e pro d uc t v e r s io n. V e rQ u e ry V a lu e ( lp B u ffe r ,
T E X T ( " \ \ S trin g F ile In fo \\0 4 0 9 0 4 B 0 \\P ro d u c t V e rs io n " ) , & lp D a ta ,
& u i D a ta S iz e ) ;
s trP ro d u c t = s tr P ro d u c t + L P T S T R (lp D a ta ) ;
/ / D is p la y th e p rodu c t n a m e a n d ve rs io n.
S e tD lg I te m T e x t( ID C _ P R O D U C T ,s tr P ro d u c t) ;
/ / U s e th e ve rs io n in fo rm a t io n b loc k to ob ta in th e c o m p a n y na m e . V e rQ u e ry V a lu e ( lp B u ffe r ,
T E X T ( " \ \ S trin g F ile In fo \\0 4 0 9 0 4 B 0 \\C o m p a n y N a m e " ) , & lp D a ta ,
& u i D a ta S iz e ) ;
s tr C o m pa ny = L P T S T R ( lpD a ta ) ;
s tr C om p a n y = s tr C om pa ny + " \ n" ;
// U s e th e v e rs io n in fo rm a tio n b lo c k to o b ta in th e c o p y r ig h t in fo rm a tio n . V e rQ u e ry V a lu e ( lp B u ffe r ,
T E X T (" \\ S tr in g F ile In fo \\0 4 0 9 0 4 B 0 \\L e g a l C o p y r ig h t" ) , & lp D a ta ,
& u i D ata S ize);
s tr C om p a n y = s tr C om pa ny + L P T S T R ( lpD a ta ) ;
/ / D is p la y th e c o m p a n y na m e a n d c o py r ight in fo rm a t ion. S e t D lg I te m T e x t( ID C _C O M P A N Y , s tr C o m pa ny ) ;
/ / F ree th e m e m o r y w e allo ca te d . fre e ( lp B u ffe r);
f ree ( lp D ata);
这 段 代 码 比 你 一 开 始 想 像 的 要 更 容 易 理 解 一 些 实 际 上 可 以 将 整 个 过 程
分 解 成 如 下 四 个 简 单 的 步 骤
-
用 G
e t F ile V e rs ionInfoS iz e ( ) 函 数 获 得 VS _ V E R S ION _ IN F O 结 构 的 大 小
-
用
VS _ V E R S ION _ IN F O 结 构 大 小 创 建 一 个 足 以 保 持 该 结 构 的 缓 冲 区 然后 用 G e t F ile V e rs ionInfo() 函 数 获 得 它
-
一旦有了
VS _ V E R S ION _ IN F O 结构的本地副本 就用 V erQ ueryV alue()函数获得各个字符串
-
在 A
bout 对 话 框 中 显 示 字 符 串
现 在 你 已 经 很 好 地 理 解 了 程 序 的 总 流 程 让 我 们 看 看 一 些 细 节 你 想 知道 的 第 一 件 事 可 能 是 V e r Q u e ry V a lu e ( ) 函 数 调 用 中 的 下 面 一 行 字 符 串
T E X T (" \\S trin g F ile In fo \\0 4 0 9 0 4 b 0 \\P ro d u c t V e r s io n " )
该 字 符 串 的 第 一 部 分 S tr ingF ile Info 说 明 我 们 要 在 V S _V E R S IO N _IN F O 结 构中 引 用 什 么 样 的 结 构 在 处 理 图 3 .4 中 粗 实 线 下 的 信 息 时 S tr ingF ile Info 是 一个 常 量 第 二 参 数 说 明 想 使 用 信 息 的 语 言 版 本 请 注 意 图 3 .4 中 的 B lo c k H ead e r 块 标 题 条 目 说 明 了 我 们 正 使 用 英 语 美 国 在 该 条 目 的 右 侧 会 看 到 一串 8 个 数 字 刚 好 与 我 们 字 符 串 的 数 字 相 匹 配 从 这 里 获 得 V e r Q u e ry V a lu e ( ) 调用 的 数 字 最 后 该 字 符 串 的 最 后 一 部 分 是 版 本 信 息 块 中 字 符 串 的 一 部 分 在样 本 字 符 串 的 事 件 中 我 们 正 在 寻 找 P roduc t V e rs ion 字 符 串 如 果 仔 细 浏 览 程序 列 表 3 .2 中 的 示 例 代 码 你 会 注 意 到 从 一 个 V e r Q u e ry V a lu e ( ) 调 用 到 下 一 个 调用 唯 一 发 生 改 变 的 是 我 们 要 查 找 的 字 符 串
在 编 译 程 序 之 前 还 要 注 意 最 后 一 件 事 用 P ro je c t | S e ttin g s 工 程 |设 置 命 令 显 示 P ro je c t S e ttings 工 程 设 置 对 话 框 选 择 对 话 框 的 L in k 链 接 选
项 卡 我 们 要 添 加 一 个 特 殊 的 库 到 程 序 中 这 样 才 能 访 问 版 本 信 息 在 O b - je c t/ L ib ra r y M odu le s 对 象 / 库 模 块 字 段 中 添 加 一 个 名 称 为 VE R S ION .L IB 的 条目 然 后 单 击 OK
如 你 所 见 作 为 一 段 可 以 反 复 使 用 的 代 码 编 写 新 程 序 时 即 使 需 要 修 改的 话 也 不 会 改 得 太 多 你 得 到 了 一 个 能 自 动 更 新 自 身 的 A bout 对 话 框 下面 是 A bout 对 话 框 的 外 观 请 注 意 我 重 新 安 排 了 静 态 文 本 框 控 件 的 位 置 还分 别 赋 予 了 两 个 缺 省 控 件 新 的 标 识 ID C _ P R OD UC T 和 ID C_ CO M P A N Y
- 2 使 用 加 速 键 和 菜 单
菜 单 和 加 速 键 密 切 地 联 系 在 一 起 这 两 种 资 源 类 型 联 手 协 作 让 用 户 能 更容 易 地 完 成 任 务 大 家 都 知 道 菜 单 是 什 么 它 是 分 层 命 令 结 构 的 物 理 表 示 加 速 键 提 供 该 结 构 的 快 捷 方 式 以 提 高 用 户 操 作 的 速 度 例 如 要 创 建 一 个 新文 件 通 常 用 F ile | N e w 文 件 |新 建 命 令 或 CT RL - N 加 速 键 两 种 方 法 可 以产 生 相 同 的 结 果
图 3 .5 缺省 菜单 提供 了你所 期待 的标 准功能 加 速键资 源通 过你给 它赋 于的 名称与 相应 的菜 单联系 在一 起
V is u a l C + + 将 菜 单 和 加 速 键 作 为 两 种 不 同 的 资 源 存 储 图 3 .5 显 示 了 示 例 应
用 程 序 的 主 菜 单 和 相 应 的 加 速 键 注 意 有 一 点 很 有 意 思 两 种 资 源 使 用 相 同 的名 称 ID R _ M A IN F R A M E 应 该 记 住 这 一 点 因 为 该 名 称 是 将 两 种 资 源 菜 单 和
加 速 键 链 接 在 一 起 的 资 源 名
让 我 们 看 看 菜 单 和 加 速 键 是 怎 样 协 作 的 将 新 的 条 目 添 加 到 现 有 的 加 速 键资 源 中 这 一 点 很 容 易 在 A c c e le ra to r 加 速 键 窗 口 中 右 击 然 后 从 上 下 文菜 单 中 选 择 N e w A c c e le ra to r 新 加 速 键 就 会 看 到 A c c e l P ro p e r tie s 加 速 键属 性 对 话 框 如 下 图 所 示
此 时 需 要 从 下 拉 列 表 框 中 选 择 一 个 ID M e nu ID 通 常 使 用 所 需 菜 单 层 次的 组 合 来 得 到 名 称 然 后 在 名 称 前 加 上 字 符 ID 例 如 如 果 想 为 V ie w | T o o lba r视 图 |工 具 条 命 令 创 建 一 个 加 速 键 我 在 实 例 中 就 是 这 样 做 的 就 应 在 ID 字 段 中 选 择 ID _ V IE W _ T O O L B A R 也 可 以 在 AS C I I 码 和 虚 拟 键 V ir t K e y 之间 进 行 选 择 当 你 准 备 添 加 与 某 个 菜 单 命 令 相 关 的 按 键 时 只 需 单 击 N e x t K e y T y p e d 按 钮 你 会 看 到 一 个 比 较 小 的 对 话 框 告 诉 你 按 下 想 要 当 作 加 速 键 使 用的 组 合 键 在 这 个 示 例 程 序 中 我 按 下 CT RL - T 你 会 看 到 CT R L 复 选 框 中 有一 个 复 选 标 记 K e y 域 中 有 一 个 "T " 单 击 C lo s e 关 闭 方 框 结 束 添 加 加 速 键
操 作
如 果 现 在 就 编 译 并 运 行 程 序 刚 刚 添 加 的 加 速 键 即 能 正 常 工 作 事 实 上你 可 能 正 想 这 样 但 是 用 户 可 能 想 不 到 快 速 执 行 一 个 菜 单 命 令 可 以 用 加 速键 要 向 菜 单 中 添 加 加 速 键 需 要 修 改 当 前 的 菜 单
向 菜 单 命 令 中 添 加 新 的 文 本 这 一 点 很 容 易 打 开 V ie w 视 图 菜 单 然后 右 击 T oo lb a r 条 目 从 上 下 文 菜 单 选 择 P rope r t ie s 属 性 你 会 看 到 如 下 所示 的 M e nu I te m P rope r t ie s 菜 单 项 属 性 对 话 框
本 例 中 我 们 要 做 的 是 更 改 C a p tio n 标 题 域 以 指 明 新 的 加 速 键 你 可 以使 用 通 常 用 于 格 式 化 文 本 的 C 和 W indow s 格 式 化 字 符 将 C a p tio n 域 修 改 成 & T o o lb a r\tC tr l- T 告 诉 W indow s 你 想 看 到 单 词 T oo lb a r 字 母 "T " 加 上
下 划 线 然 后 是 一 个 空 格 最 后 CT RL - T 告 诉 用 户 该 菜 单 命 令 的 加 速 键 是 什 么那 么 如 果 想 添 加 新 的 菜 单 该 做 些 什 么 呢 只 要 选 择 菜 单 栏 或 现 有 菜 单 上
的 空 白 点 开 始 输 入 系 统 会 自 动 显 示 一 个 M e nu I te m P rope r t ie s 菜 单 项 属 性 对 话 框 在 本 实 例 中 我 们 将 在 工 具 条 中 添 加 一 个 Fo rm a t 菜 单 该 菜 单 只 有 一个 菜 单 项 F ont 请 记 住 输 入 & F o rm a t 和 & F o n t 这 样 每 个 菜 单 项 的 第 一 个 字 母 才
能 加 上 下 划 线 添 加 了 新 的 菜 单 项 后 将 Fo rm a t 移 到 H e lp 菜 单 左 侧 此 时的 菜 单 如 下 图 所 示
现 在 我 们 要 添 加 一 些 使 这 个 新 菜 单 项 发 挥 作 用 的 代 码 右 击 F ont 菜 单 项然 后 从 上 下 文 菜 单 中 选 择 C las s W izard 再 选 择 M e s s a g e M a p s 选 项 卡 你 会 看到 M F C C las s W izard 对 话 框 如 下 图 所 示
单 击 M e ssa g e s 列 表 中 的 C O M M AND 单 击 A d d F unc tio n 添 加 函 数 按 钮创 建 这 个 函 数 你 会 看 到 A dd M e m b e r F unc tion 添 加 成 员 函 数 对 话 框 单 击OK 接 受 缺 省 的 函 数 名 单 击 E d it C ode 编 辑 代 码 按 钮 编 辑 这 个 新 函 数 程序 列 表 3 .3 显 示 了 向 我 们 的 程 序 中 添 加 字 体 特 性 时 所 需 的 代 码 虽 然 也 可 以 将其 添 加 到 CE d i t 控 件 中 但 只 有 富 文 本 编 辑 屏 幕 C R ic hE d it 控 件 才 原 本 就 具有 这 种 能 力
程 序 列 表 3.3
vo id C M a inF ra m e : : O n F orm a t F on t( )
{
C F on t D ia log oD ia log; / / C re a te a font d ia log .
// D is p la y th e F ont c o m m on d ia lo g bo x . o D ia lo g . D o M o d a l( ) ;
}
如 你 所 见 在 我 们 的 示 例 中 添 加 处 理 字 体 的 能 力 简 直 太 容 易 了 如 果 现 在编 译 并 运 行 这 个 程 序 用 户 就 能 够 改 变 缺 省 字 体 或 选 择 文 本 并 改 变 所 选 文 本的 字 体 下 面 是 利 用 已 经 具 备 改 变 字 体 能 力 的 这 个 示 例 程 序 修 改 字 体 方 式 的 示例
技 巧 显 示 应 用 程 序 所 需 的 大 部 分 菜 单 并 不 需 要 做 什 么 艰 苦 的 努 力 你 真 正需 要 完 成 的 工 作 只 是 运 用 各 种 菜 单 项 的 准 确 I D 和 工 具 条 上 的 相 关 按钮 可 惜 的 是 许 多 特 殊 的 I D 目 前 尚 未 列 入 文 档 例 如 如 果 想 执 行字 体 对 话 框 而 不 做 任 何 程 序 设 计 要 确 保 菜 单 项 的 I D 是
ID _F OR MA T_ FO NT 同 样 地 如 果 向 应 用 程 序 中 添 加 工 具 条 按 钮 工 具条 按 钮 应 该 与 菜 单 项 使 用 相 同 的 I D 可 以 在 M FC \I NC LU DE 文 件 夹 的A F X R E S . H 文 件 中 找 到 所 有 特 殊 的 I D 无 论 它 们 是 否 已 经 列 入 文 档
- 3 使 用 工 具 条
如 果 说 加 速 键 是 提 高 程 序 访 问 速 度 的 键 盘 方 法 那 么 工 具 条 就 和 鼠 标 操 作对 应 起 来 你 会 看 到 工 具 条 不 再 仅 仅 是 附 属 品 了 它 已 经 成 为 用 户 界 面 必 不可 少 的 一 部 分 但 是 如 果 使 用 很 多 能 够 满 足 或 者 不 能 满 足 用 户 需 要 的 按 钮 填满 整 个 工 具 条 的 话 它 很 快 就 会 变 得 过 于 臃 肿 这 个 问 题 的 一 个 解 决 办 法 是创 建 多 个 工 具 条 允 许 用 户 自 己 决 定 当 前 需 要 哪 些 工 具 条
使 用 工 具 条 和 使 用 菜 单 与 加 速 键 一 样 容 易 不 过 在 这 里 必 须 创 建 工 具 条及 其 相 关 菜 单 命 令 之 间 的 链 接 缺 省 工 具 条 ID R _ M A IN F R A M E 包 括 一 些 更 为常 见 的 按 钮 比 如 打 开 文 件 或 创 建 新 文 件 时 用 到 的 按 钮
让 我 们 以 创 建 新 的 工 具 条 来 开 始 这 个 示 例 吧 — — 这 个 工 具 条 允 许 用 户 格 式化 文 本 在 R e s o u rce V iew 中 右 击 T oo lb a r 文 件 夹 然 后 从 上 下 文 相 关 菜 单 中 选择 In s e r t T oo lba r 插 入 工 具 条 V is u a l C + + 会 自 动 创 建 一 个 新 的 工 具 条 但 是它 给 出 的 名 字 ( ID R_ T O O L BA R1 ) 并 不 具 有 清 晰 的 意 义 右 击 ID R_ T O O L BA R1 条 目 然 后 从 上 下 文 菜 单 中 选 择 P rope r tie s 属 性 你 会 看 到 如 下 图 所 示 的 T oo lb a r P rope r tie s 工 具 条 属 性 对 话 框
在 ID 域 中 输 入 ID R _ F O R M A T 不 必 担 心 要 修 改 F ile N a m e 文 件 名 域
修 改 ID 域 时 它 会 自 动 修 改 完 成 修 改 后 单 击 C lo s e 关 闭 框 关 闭 T oo lb a r P rope r tie s 工 具 条 属 性 对 话 框
图 3 .6 示例 工具 条上 包括了 五个 按钮
现 在 我 们 要 向 这 个 工 具 条 中 添 加 一 些 按 钮 这 些 按 钮 将 允 许 用 户 执 行 各 种各 样 的 任 务 而 不 必 借 助 于 使 用 键 盘 或 在 菜 单 系 统 间 移 动 图 3 .6 显 示 了 我 们
将 为 本 示 例 使 用 的 样 本 工 具 条 这 些 按 钮 分 别 代 表 了 加 下 划 线 删 除 线 粗 体斜 体 和 打 开 字 体 对 话 框
向 工 具 条 上 添 加 按 钮 并 不 需 要 做 太 多 的 工 作 你 真 正 需 要 具 备 的 东 西 是 将来 要 进 行 操 作 的 位 图 双 击 下 划 线 按 钮 会 看 到 T oo lB a r P rope r t ie s 工 具 条 属性 对 话 框 如 下 所 示
如 你 所 见 我 已 经 把 ID 域 修 改 为 ID _ U NDE R L IN E 了 将 P rom pt 提 示 域 修 改 为 U nde r lin e 下 划 线 了 用 相 似 的 方 法 修 改 其 它 所 有 的 按 钮 — — ID _ S T R IK E T HR OU GH 删 除 线 ID _ B O L D 粗 体 ID _ ITA L IC 斜 体
和 ID _ F OR M A T _ F ONT 字 体 对 话 框 一 定 要 仔 细 地 输 入 所 有 的 ID 否 则在 今 后 使 用 按 钮 时 会 出 问 题 我 为 最 后 一 个 按 钮 使 用 ID _ F OR M A T _ F ONT 的 原因 是 减 少 所 需 的 代 码 编 写 数 量 使 用 这 个 ID 意 味 着 无 须 添 加 一 行 代 码 就 可以 让 这 个 按 钮 发 挥 作 用 V is u a l C + + 会 通 过 M F C 自 动 处 理 这 个 按 钮
注 要 了 解 M F C 提 供 的 其 它 标 准 I D 请 不 要 忘 了 浏 览 MFC\INCLUD E 文 件 夹
中 的 AFXRES.H 文 件
现 在 让 我 们 把 工 具 条 与 应 用 程 序 的 其 它 部 分 联 系 起 来 按 住 CT RL 键 并 双击 下 划 线 按 钮 你 会 看 到 M F C C las s W izard 类 向 导 然 后 系 统 显 示 A dd ing a C la s s 添 加 类 对 话 框 ID R_ F O RM A T 是 一 种 新 的 资 源 V is u a l C + + 不 能 确 定你 想 用 它 做 什 么 你 要 把 它 和 现 有 类 联 系 起 来 现 在 只 要 单 击 OK 接 受 缺 省设 置 V is u a l C + + 会 显 示 Se le c t C la s s 选 择 类 对 话 框 选 择 CM a in F ra m e 类
然 后 单 击 Se le c t 选 择 你 现 在 已 经 把 工 具 条 和 应 用 程 序 联 系 起 来 了
创 建 和 按 钮 相 关 的 函 数 是 很 容 易 的 单 击 M F C C la s s W iz a rd 的 O b ject ID S 列 表 中 的 按 钮 比 如 ID _ UNDE R L IN E 然 后 单 击 M e ss a g e s 消 息 列 表 中 的C O M M A N D 单 击 A dd F unc tion 添 加 函 数 按 钮 创 建 函 数 V is u a l C + + 显 示A dd M e m b e r F unc tio n 添 加 成 员 函 数 对 话 框 只 需 单 击 OK 接 受 缺 省 函 数 名最 后 你 会 看 到 一 个 成 员 函 数 列 表 如 下 图 所 示
现 在 我 们 可 以 向 程 序 中 添 加 使 按 钮 发 挥 作 用 的 代 码 了 单 击 任 一 成 员 函 数名 比 如 O n U n d e r lin e 然 后 单 击 E d i t C ode 按 钮 V is u a l C + + 会 显 示 代 码 编辑 区 你 会 看 到 我 们 刚 刚 创 建 的 函 数 的 框 架 程 序 列 表 3 .4 显 示 了 需 要 添 加 的代 码
程 序 列 表 3 . 4
vo id C M a inF ra m e : : O nB o ld()
{
C R ic h E d i t V ie w * p o V iew ; / / C reate a v a r iab le to h o ld o u r v iew .
/ / G e t th e a c t iv e v iew f ro m th e cu r ren t w in d o w .T y p ecas t i t as a
// C R ic h E d itV ie w ra th e r th a n a C V ie w , th e s ta n d a rd re tu rn v a lu e . p o V ie w = ( C R ic h E d itV ie w * ) G e tA c tiv e V ie w ( ) ;
// C h a n g e th e fo n t s e ttin g s a s n e e d e d .
poV ie w -> O nC ha r E f fe c t( C F M _ B O L D , C F E _ B O L D ) ;
}
vo id C M a inF ra m e : : O nIta lic ( )
{
C R ic h E d itV ie w * p o V ie w ; // C re a te a v a r ia b le to h o ld o u r v ie w . C H A R F O R M A T cf F o n t; / / C rea te a s tru ctu re fo r th e fo n t d a ta .
/ / G e t th e activ e v ie w f ro m th e c u r re n t w in d o w . T y p ecas t i t as a
// C R ic h E d itV ie w ra th e r th a n a C V ie w , th e s ta n d a rd re tu rn v a lu e . p o V ie w = ( C R ic h E d itV ie w * ) G e tA c tiv e V ie w ( ) ;
// G e t th e c u r re n t fo n t s e ttin g s , th e n c h a n g e th e m to I ta lic . cf F o n t = p o V iew -> G e t C har F o rm a t S electio n ( ) ;
c f F on t.d w M a sk |= C F M _ IT A L IC ; cf F o n t .d w E f fects |= C F E _ IT A L IC ;
// C h a n g e th e fo n t s e ttin g s a s n e e d e d . p o V ie w -> S et C h ar F o rm at( c f F o n t) ;
}
vo id C M a inF ra m e : : O nS tr ik e thro u g h ( )
{
C R ic h E d i t V ie w * p o V iew ; / / C reate a v a r iab le to h o ld o u r v iew .
/ / G e t th e a c t iv e v iew f ro m th e cu r ren t w in d o w . T y p ecas t i t as a
// C R ic h E d itV ie w ra th e r th a n a C V ie w , th e s ta n d a rd re tu rn v a lu e . p o V ie w = ( C R ic h E d itV ie w * ) G e tA c tiv e V ie w ( ) ;
// C h a n g e th e fo n t s e ttin g s a s n e e d e d .
poV ie w -> O nC ha r E f fe c t( C F M _ S T R IK E O U T , C F E _ S T R IK E O U T ) ;
}
vo id C M a inF ra m e : : O nU n d e r l in e ( )
{
C R ic h E d itV ie w * p o V ie w ; // C re a te a v a r ia b le to h o ld o u r v ie w .
/ / G e t th e activ e v ie w f ro m th e c u r re n t w in d o w . T y p ecas t i t as a
// C R ic h E d itV ie w ra th e r th a n a C V ie w , th e s ta n d a rd re tu rn v a lu e . p o V ie w = ( C R ic h E d itV ie w * ) G e tA c tiv e V ie w ( ) ;
// C h a n g e th e fo n t s e ttin g s a s n e e d e d .
p o V ie w -> O n C h a r E f fe c t( C F M _ U NDE R L IN E , C F E _ UNDE R L IN E ) ;
}
正 如 从 源 代 码 中 所 看 到 的 对 选 定 的 一 组 字 符 有 两 种 不 同 的 方 法 更 改 字符 的 字 体 属 性 第 一 种 方 法 要 容 易 一 些 只 需 得 到 活 动 视 图 — — 即 包 含 用 户 正编 辑 文 本 的 窗 口 部 分 一 旦 拥 有 了 这 个 视 图 就 可 以 用 名 为 O n C h ar E f fect() 的 特殊 函 数 更 改 字 体 属 性 要 使 这 个 函 数 真 正 发 挥 功 能 还 要 为 两 个 参 数 提 供 相 同的 字 体 属 性 C HAR F O R M AT 文 档 包 含 了 一 系 列 完 整 的 属 性 及 相 关 定 义
第 二 种 方 法 要 求 再 做 一 些 工 作 但 同 时 它 也 更 灵 活 这 时 必 须 获 得 活 动视 图 的 一 个 拷 贝 但 是 这 一 次 用 它 把 当 前 字 体 特 性 填 入 C HAR F O R M AT 特性 格 式 结 构 该 结 构 包 括 你 需 要 知 道 的 一 切 比 如 字 体 名 和 颜 色 以 及 字 体属 性 比 如 粗 体 和 斜 体 一 旦 获 得 已 填 好 的 C HAR F O R M AT 特 性 格 式 结 构就 在 屏 幕 上 更 改 想 修 改 的 成 员 然 后 用 S e t C ha r F orm a t( ) 函 数 做 实 际 的 更 改
在 很 多 情 况 下 你 会 想 用 我 演 示 的 第 一 种 方 法 改 变 字 体 属 性 如 粗 体 和 斜体 这 样 做 的 话 编 码 要 少 得 多 并 且 实 现 起 来 也 不 必 非 得 与 结 构 打 交 道 但是 在 进 行 更 详 细 的 屏 幕 更 改 时 可 以 使 用 C HAR F O R M AT 字 符 格 式 结 构了 解 这 一 点 对 编 程 工 作 将 会 起 到 重 要 作 用
我 们 已 经 有 了 工 具 条 和 一 些 使 其 发 挥 作 用 的 代 码 我 们 的 示 例 程 序 仍 然 缺少 一 个 重 要 的 特 征 如 果 现 在 就 运 行 它 会 看 不 到 工 具 条 最 后 一 步 是 添 加 菜单 项 和 一 些 让 工 具 条 用 起 来 更 方 便 的 代 码 我 们 从 菜 单 项 开 始 我 要 做 的 只是 用 和 讨 论 Fo rm a t 格 式 菜 单 时 一 样 的 过 程 向 V ie w 视 图 菜 单 中 添 加 一个 新 的 菜 单 项 在 M e nu I te m P rope r t ie s 菜 单 项 属 性 对 话 框 中 我 把ID _ V IE W _ F O R M A T T O O L B A R 用 作 ID 把 & F orm a t T o o lba r 用 作 标 题 把 显 示或 隐 藏 格 式 工 具 条 的 \n T o g g le F o rm a t T o o l B a r 用 作 提 示 由 于 我 们 缺 省 显 示 工 具条 所 以 你 还 要 选 中 Ch e c k e d 复 选 框
创 建 程 序 框 架 相 当 容 易 按 下 CT RL 键 并 双 击 新 的 F o rm a t T oo lba r 格 式 工具 条 菜 单 项 你 会 看 到 M F C C las s W izard M F C 类 向 导 对 话 框 V is u a l C + + 应 该 自 动 加 亮 O b ject Id s 对 象 ID 列 表 中 的 ID _ V IE W _ F O R M A T T O O L B A R 项 加 亮 M e ssa g e s 消 息 列 表 中 的 C O M M AND 选 项 然 后 单 击 A d d F unc tion
添 加 函 数 最 后 单 击 E d it C ode 编 辑 代 码 显 示 代 码 窗 口
有 三 个 地 方 需 要 添 加 工 具 条 代 码 第 一 块 代 码 出 现 在 M A IN F R A M E .H 文 件中 要 在 初 始 工 具 条 变 量 右 下 方 的 P ro te c te d 受 保 护 节 中 添 加 新 的 变 量 新的 声 明 变 量 的 代 码 如 下 所 示
C T oo l B a r m _ w ndT o o lB a r 2;
下 一 块 代 码 出 现 在 M A IN F R A M E .C P P 文 件 中 见 程 序 列 表 3 .5 这 块 代码 设 置 工 具 条 的 特 性 使 你 在 启 动 程 序 时 能 看 见 它 请 注 意 为 了 使 工 具 条 成为 可 浮 动 工 具 条 这 样 可 以 在 应 用 程 序 中 把 它 从 一 个 地 方 移 到 另 一 个 地 方 要 考 虑 进 行 一 些 特 殊 的 编 码
程 序 列 表 3 . 5
in t C M a in F ra m e ::O n C re a te ( L P C R E A T E S T R U C T lp C re a te S tru c t)
{
if ( C F ra m e W n d ::O n C re a te ( lp C re a te S tru c t) = = - 1 ) re tu rn - 1 ;
if ( ! m _ w n d T o o lB a r .C re a te ( th is ) ||
! m _ w n d To o l B a r . Lo a d To o l B a r ( ID R - M A IN F R A M E ))
{
T R A C E 0 (" F a i le d to c re a te to o lba r \n" ) ;
re tu rn - 1 ; / / fa i l to c re a te
}
if ( ! m _ w n d T o o lB a r 2 .c re a te ( th is ) ||
! m _w n d T o o l B a r 2 . L o a dT o o l B a r ( ID R _F O R M A T ) )
{
T R A C E 0 ( F a i le d to c re a te too lb a r \ n" ) ;
re tu rn - 1 ; // fa il to c re a te
}
if ( ! m _ w n d S ta tu s B a r .C re a te ( th is ) ||
! m _ w nd S ta tus B a r . Se t In d ic a to rs ( in d ic a to rs ,
s iz e o f ( in d ic a to rs )/s iz e o f ( U IN T ) ) )
{
T R A C E 0 (" F a i le d to create s ta tu s b a r \ n" ) ; re tu rn
- 1 ; // fa il to c re a te
}
/ / T ODO : R e m o v e th is if y o u d o n 't w a n t to o l t ip s o r a re s iz e a b le to o lb a r m _ w n d T o o lB a r .S e t B a r S ty le ( m _ w n d T o o lB a r .G e t B a r S ty le ( ) |
C B R S _ T OOL T IP S | C B R S _ F L Y B Y | C B R S _ S IZ E _ DYNAM IC ) ;
m _ w n dT o o l B a r 2 .Se t B a r S ty le ( m _ w n dT oo l B a r 2 .G e t B a r S ty le ( ) |
C B R S _ T OOL T IP S | C B R S _ F L Y B Y | C B R S _ S IZ E _ DYNAM IC ) ;
/ / T ODO: D e le te th e s e th re e l in e s if y o u d o n 't w a n t th e to o lb a r to
// b e d o c k a b le
m _ wn d T o o l B a r .E n a b le D o c k in g ( C B R S _ AL IG N _ ANY ); m _ w n dT o o l B a r 2 .E n a b le D o c k ing( C B R S _A L IG N _A N Y ) ; E n a b le D o c k in g( C B R S _A L IG N _A N Y ) ;
D o c k C o n tro l B a r(& m _ w n d T o o l B a r); D o c k C o n tro l B a r(& m _ w n d T o o l B a r 2 ) ;
re tu rn 0 ;
}
有 三 个 需 要 使 用 工 具 条 代 码 的 主 要 区 域 第 一 个 主 区 创 建 工 具 条 然 后 将ID R_ F O RM A T 工 具 条 加 载 进 去 如 果 这 一 过 程 失 败 那 么 在 应 用 程 序 启 动 前会 得 到 创 建 失 败 的 消 息 第 二 个 主 区 定 义 工 具 条 风 格 我 使 用 缺 省 设 置允 许 用 户 调 整 工 具 条 的 大 小 并 将 其 四 处 移 动 鼠 标 停 留 在 按 钮 上 时 还 会 显 示工 具 提 示 代 码 的 最 后 一 节 使 工 具 条 拼 接 化 D o c k in g 定 义 用 户 可 以 在 哪 里停 放 工 具 条 并 实 际 停 放 我 们 已 创 建 的 工 具 条 此 时 工 具 条 是 可 见 的 用 户可 以 将 其 四 处 移 动 并 用 C lo s e 关 闭 框 将 其 从 视 线 清 除
使 菜 单 命 令 V ie w | F o rm a t T oo lb a r 视 图 |格 式 工 具 条 发 挥 作 用 相 当 容 易程 序 列 表 3 .6 显 示 了 使 这 一 部 分 程 序 发 挥 作 用 所 需 的 代 码
程 序 列 表 3.6
vo id C M a inF ra m e : : O nV ie w F o rm a t to o lba r ( )
{
C M en u * p o M en u ; / / C reate a p o in te r to th e cu r ren t m e n u . p o M e n u = G e tM e n u ( ) ; // G e t th e m e n u .
// D e te rm in e if th e V ie w | F o rm a t T o o lb a r o p tio n is c h e c k e d . I f it
// is , th e n h id e th e fo rm a t to o lb a r a n d u n c h e c k th e o p tio n . O th e rw is e ,
// d is p la y th e to o lb a r a n d c h e c k th e m e n u ite m .
if ( poM e n u-> G e t M e n u S ta te ( ID _V IE W _ F O R M A T T O O L B A R , M F _ C H E C K E D ) )
{
s how C o n tro l B a r (& m _ w ndT oo l B a r 2 , F A L S E , F A L S E ) ;
p o M e n u -> C h e c kM e n uIte m ( ID _V IE W _ F O R M A T T O O L B A R , M F _ UNC HE C K E D ) ;
}
e ls e
{
Sh ow C o n tro l B a r (& m _ w n dT o o l B a r 2, T R U E , FA L S E ) ;
p o M e n u -> C h e c kM e n uIte m ( ID _V IE W _ F O R M A T T O O L B A R , M F _ C H E C K E D ) ;
}
}
如 你 所 见 我 们 是 从 获 得 CW n d 类 菜 单 对 象 的 拷 贝 开 始 的 当 我 们 得 到 了这 个 菜 单 对 象 后 要 判 断 当 前 用 户 是 否 选 择 了 F o rm a t T oo lb a r 格 式 工 具 条 选项 就 变 得 很 容 易 了 如 果 选 择 了 这 个 选 项 那 么 工 具 条 是 可 见 的 把S how C on tro l B a r ( ) 函 数 的 第 二 个 和 第 三 个 参 数 设 成 fa ls e 可 以 使 工 具 条 不 可 见
C h e c kM e nuIte m ( ) 允 许 你 从 V ie w | F o rm a t T o o lb a r 视 图 |格 式 工 具 条 菜 单 选 项去 掉 复 选 标 记 反 过 来 用 相 反 的 过 程 使 工 具 条 可 见 并 再 次 选 择 菜 单 选 项
继 续 下 去 再 编 译 一 次 应 用 程 序 这 样 你 才 能 熟 悉 我 们 刚 刚 添 加 的 各 种 特
征 一 定 要 试 验 所 有 的 格 式 化 选 项 和 连 接 及 隐 藏 工 具 条 的 功 能 很 明 显 这 个应 用 程 序 并 不 像 你 现 在 看 到 的 一 些 程 序 那 样 复 杂 但 它 确 实 可 以 充 分 地 使 用 资源 下 面 是 我 的 程 序 版 本 的 外 观 其 中 工 具 条 尚 未 连 接 在 一 起