|
实用技巧
用VC5 开 发 监 控 界 面 的 方 法
南 京 师 范 大 学 物 理 系
伶 俐----黄 斌----顾 敏 芬
----
[ 本 文 为 摘 要, 全 文 可 下 载,Zip 6KB]
----
VC5 开 发 工 具 提 供 了 现 成 的 窗 口、 控 制 与 工 具 条 的 制 作 手 段, 大 大 简 化 了 界 面 的 开 发
过 程, 并 且 使 得 开 发 出 的 界 面 具 有 组 态 软 件 风 格, 使 用 起 来 方 便、 灵 活、 简 单 易 学。
----
本 文 以 一 实 例 介 绍 如 何 实 现 三 个 独 立 的 分 离 窗 口: 监 视 窗 口, 控 制 窗 口 和 动 画 窗 口,
并 以 图1 中 的 进 水 和 温 度 值 传 递 为 例, 介 绍 如 何 实 现 控 制 功 能 和 不 同 窗 口 间 的 数 据 共 享,
并 介 绍 实 现 无 闪 烁 动 画 的 方 法。
----
如 图1, 将 工 作 台 分 离 成 为 三 个 窗 口, 动 画 窗 口 用 于 模 拟 锅 炉 的 进、 出 水、 升 温 的 画
面 显 示, 其 中 的 画 面 与 系 统 采 集 的 数 据 相 对 应。 控 制 窗 口 用 于 实 现 预 设 温 度 值, 调 节 水 位、
控 制 加 热、 暂 停 等 功 能。 监 视 窗 口 用 来 实 时 跟 踪 采 样 的 温 度 值, 作 出 温 度-- 时 间 曲 线。
一、 创 立 分 离 窗 口
----
要 实 现 多 窗 口 显 示, 必 须 使 用CSplitterWnd 类, 将 窗 口 分 成 三 个 子 窗 口, 然 后 将 各 个
功 能 类 与 窗 口 联 系 起 来。 在 创 建 应 用 程 序 时, 在 第 一 步 中 选 择Single Document Interface, 并
选 用 中 文 字 库, 在 第4 步 中 按 下Advanced, 选 择Use Split Window 选 项。 设 定 应 用 程 序 名
为Animation。 目 前 我 们 只 有 一 个 视 类CAnimationView, 它 将 与 动 画 窗 口 对 应, 此 外 我 们
还 要 生 成 具 有 对 话 功 能 的 监 视 窗 口( 对 应CShowView 类) 和 控 制 窗 口( 对 应 CControlView
类)。 在Resource View 中 调 出 上 下 文 菜 单 并 选 择Insert, 选 择 属 性 为IDD_FORMVIEW, 创
建 监 视 对 话 框IDD_SHOWVIEW 和 控 制 对 话 框IDD_CONTROLVIEW, 并 单 击 鼠 标 右 键 在
Properties 选 择 项 中 选 择 中 文 字 库。 然 后 编 辑IDD_CONTROLVIEW: 利 用VC5 提 供 的 控 件
生 成 器 生 成ID 名 为IDC_SETTEMPERATURE 的 文 字 编 辑 域, 并 生 成Caption 为“ 设 置 温
度 初 始 值”。 再 利 用button 生 成 器, 生 成 控 件IDC_WATERIN,IDC_CONFIRM,Caption
分 别 为“ 进 水” 和“ 确 认”。 再 利 用ClassWizard, 创 建 基 于CFormView 类 的 新 类, 分 别 为
CShowView 和CControlView 类, 并 将 它 们 与 刚 创 建 的 两 个 对 话 框 联 系。
.
.
.
----
再 转 入Animation.cpp 中, 修 改InitInstance() 函 数, 将 其 中 的m_pMainWnd- >ShowWindow
(SW_SHOW), 改 为m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); 至 此, 我 们
可 以 生 成 图1 的 界 面 框 架。
二、 动 画 显 示 窗 口 的 实 现
----
动 画 是 通 过 调 用 一 幅 幅 的 图 片 来 实 现 的, 因 此 先 将 所 需 的 画 面 载 入 资 源BITMAP 中,
并 按 顺 序 编 辑 它 们 的ID 号, 然 后 在 定 时 器 中, 每 隔 一 定 的 时 间 调 用 一 次 动 画 函 数。 第 一
步 先 生 成 定 时 器, 用ClassWizard 给CAnimationView 添 加 消 息 处 理 程 序:OnCreate() 函 数
对 应 于 消 息WM_CREATE,OnTimer() 函 数 对 应 于 消 息WM_TIMER。 编 辑 函 数OnCreate(),
生 成 每 隔0.1 秒 的 时 钟。
.
.
.
三、 控 制 窗 口 功 能 的 实 现
----
利 用ClassWizard 中 的Member Variables 标 签 为CControlView 增 加 成 员 变 量。
控件
控件ID
类型
成员
预设温度值
IDC_SETTEMPERATURE
int
m_nSetTemperature
在CControlView中增加消息处理函数:
对象
对象ID
函数
消息
进水按键
IDC_WATERIN
OnWaterIn()
BN_CLICKED
确认按键
IDC_CONFIRM
OnComfirm()
BN_CLICKED
----
下 面 以 输 入 预 设 温 度 值 和 进 水 响 应 为 例, 来 讲 述 如 何 实 现 控 制 功 能。 当 控 制 视 窗
(CControlView 类) 中 预 置 温 度 设 定 之 后, 按 下 确 认 键 即 响 应 消 息OnConfirm(), 在 监 视 视 窗
(CShowView 类) 中 的 状 态 监 测 图 中 画 一 条 预 设 温 度 的 横 线。 当 控 制 视 窗(CControlView
类) 中 按 下 进 水 键, 便 在 动 画 视 图(CAnimationView 类) 有 进 水 动 画 产 生。
----
这 时 控 制 视 图 要 向 监 视 视 图、 动 画 视 图 传 送 数 据, 但 它 们 之 间 无 法 直 接 实 现 数 据 共 享。
MFC 类 库 中CDocument 类 及 其 派 生 类 用 来 管 理 工 作 数 据, 它 能 够 读 写 和 存 储 视 图 所 要 观
察 和 处 理 的 数 据, 并 可 以 同 时 拥 有 多 个 视 图。 所 以, 此 处 用CDocument 的 派 生 类
CAnimationDoc 作 为 数 据 传 输 的 中 介, 来 实 现 不 同 视 窗 之 间 的 数 据 传 递。
----
预 置 温 度( 变 量 名 为m_nSetTemperature) 的 数 据 传 送 示 意 图 如 图2 所 示。
----
m_nSetTemperature m_nSetTemperatureDoc
.
.
.
----
最 后 在ControlView.cpp 的 开 头 包 含“AnimationDoc.h"。
然 后 转 入CShowView 中, 为 了 要 能 达 到 实 时 监 测 的 目 的, 数 据 的 接 收 要 做 在 定 时 器 中, 这
样 才 可 以 不 断 地 检 测 是 否 有 新 的 数 据 输 入。 检 测 到 温 度 设 置 标 志 后, 画 一 条 横 线。
.
.
.
----
同 样, 在CAnimationView 中, 编 辑OnTimer() 函 数 调 用 的 过 程ServicedAnimation(), 检
测 到 进 水 键 响 应 成 功 后, 调 用 进 水 动 画 例 程DrawAnimationWaterIn()。
四、 监 视 窗 口 功 能 的 实 现
----
温 度、 水 位 跟 踪 实 现 的 原 理 类 似 于 控 制 功 能, 它 实 现 的 是CAnimatinDoc 与CShowView
类 之 间 的 数 据 传 递, 当 系 统 采 样 的 温 度 与 水 位 变 化 时,CShowView 中 的m_nTemperature( 温
度 变 量) 即 随 之 变 化, 在 利 用MoveTo() 与LineTo() 函 数, 便 可 将 其 画 在 图 上。 再 把 这 些 做
在 定 时 器 当 中, 就 可 以 实 时 监 测。
参 考 文 献:
----
1、《Visual C++5 开 发 人 员 指 南》David Bennett 机 械 工 业 出 版 社
----
2、《Visual C++4 开 发 人 员 指 南》Scott Stanfield 机 械 工 业 出 版 社
----
3、《MFC 开 发 人 员 参 考 手 册》 Robert D. Thompson 机 械 工 业 出 版 社
|