使 用 V is u a l J + + 编 程
目 录
第 14 章 在 Ja va 中 编 制 动 态 H T M L 1 7 7
在 服 务 器 上 使 用 c o m .m s. w fc .h tm l 软 件 包 1 9 8
第 16 章 建 立 和 导 入 Ac t iv e X 控 件 2 5 2
建 立 |
Ac t iv e X |
控 件 |
...................................................................................... 2 5 2 |
---|---|---|---|
导 入 |
Ac t iv e X |
控 件 |
...................................................................................... 2 5 8 |
第 |
17 章 |
建 立 和 导 入 CO M 对 象 2 6 3 |
|
建 立 |
CO M 对 象 2 6 4 |
导 入 CO M 对 象 2 7 0
第 18 章 W F C 中 的 数 据 绑 定 2 7 5
简 单 数 据 绑 定 2 7 6
D a ta B inde r 组 件 2 7 8
复 杂 数 据 绑 定 2 8 0
第 19 章 使 用 J /D i rect 编 写 W ind ow s 应 用 程 序 2 8 2
消 息 框 示 例 2 8 3
J /D i re c t C a l l B u i ld e r 2 8 4
快 速 语 法 参 考 2 8 7
数 据 类 型 转 换 2 9 0
调 用 O L E A P I 函 数 3 2 1
别 名 方 法 重 命 名 ................................................................................. 3 2 7
按 序 号 链 接 3 2 8
为 整 个 类 指 定 @ d l l.im p o r t 3 2 9
VM 如 何 在 AN S I 和 U n ic ode 之 间 选 择 3 3 0
通 过 D L L 函 数 获 得 错 误 代 码 3 3 3
动 态 加 载 和 调 用 D L L 3 3 4
J /D i rect 与 原 始 本 机 接 口 比 较 3 3 6
安 全 问 题 3 3 7
错 误 信 息 3 4 3
故 障 排 除 提 示 3 4 7
第 11 章 W F C 编 程 基 础
W ind ow s F ounda t ion |
C la s se s |
fo r |
J a v a |
W F C | 是 |
与 |
R a p id A pp lic a t io n |
---|---|---|---|---|---|---|---|
D e v e lopm e n t RA D |
工 具 配 |
合 使 |
用 的 |
类 库 集 | 它 |
与 |
RA D 工 具 的 配 合 |
使 用 使 得 用 Ja va 语 言 为 M ic rosoft 平 台 建 立 快 速 有 效 的 应 用 程 序 和 组 件变 得 非 常 容 易 W F C 可 以 用 Ja va 语 言 应 用 在 W in 32 平 台 和 D y n a m ic HTM L D H T M L 对 象 模 式 中 D H T M L 是 由 In te rn e t E xp lo re r 4 .0 支 持的 一 个 W 3 C 标 准 这 就 意 味 着 可 以 使 用 Ja va 来 解 决 当 前 的 一 些 实 际 问题 同 时 你 已 经 拥 有 一 条 通 向 未 来 的 坦 途
W F C 的 目 的 是 为 Ja va 提 供 完 整 的 吸 引 人 的 组 件 和 编 程 模 式 这 是 因为 Ja va 有 一 种 在 语 言 方 面 独 特 的 优 势 使 用 这 种 新 的 编 程 模 型 来 开 发W ind ow s 和 D H T M L 的 应 用 程 序 Ja va 应 当 是 非 常 好 的 选 择
利 用 W F C 开 发 人 员 可 以 使 用 V isu a l J + + F o rm s D e s ig n e r 将 控 件 拖 放 到窗 体 上 设 置 属 性 生 成 事 件 处 理 程 序 开 发 人 员 还 可 以 很 容 易 地 从 应用 程 序 中 访 问 服 务 器 上 的 数 据 并 能 像 W ind ow s . E X E 文 件 或 In te rn e t UR L 一 样 展 开 应 用 程 序 而 且 它 们 可 以 通 过 使 用 设 计 器 或 通 过 直 接在 编 辑 器 中 输 入 代 码 的 方 法 来 编 译 自 己 的 W F C 组 件 最 后 开 发 人 员可 以 使 用 Ja va 类 访 问 DH T M L 对 象 模 型
丰 富 的 应 用 程 序 模 型 巧 妙 地 利 用 了 J /D i rect 技 术 访 问 W in 3 2 A P I 不 管怎 样 通 过 处 理 一 些 像 W ind ow s 消 息 处 理 过 程 消 息 转 储 消 息 窗
口 句 柄 等 细 节 它 会 使 编 程 更 容 易 应 用 程 序 模 型 是 开 放 式 的 因 此
有 经 验 的 W in 3 2 程 序 员 能 将 J /D i rect 和 W F C 的 类 结 合 在 一 起 在 W in32
平 台 中 安 装 任 何 有 效 的 功 能
如 果 你 正 找 有 关 使 用 V isu a l J + + 来 开 发 W F C 应 用 程 序 的 快 捷 方 便 的 介绍 说 明 那 么 应 该 花 费 一 些 事 件 浏 览 本 书 第 1 章 中 的 使 用 W F C 创 建W ind ow s 应 用 程 序 一 节 它 能 够 一 步 步 地 教 你 建 立 和 运 行 简 单 的 W F C 应 用 程 序
使 用 控 件 和 模 板 开 始
W F C 组 件 模 型 中 的 一 个 功 能 就 是 V isu a l J + + 开 发 环 境 提 供 常 用 的 大 部 分组 件 窗 体 菜 单 和 对 话 框 这 些 组 件 通 常 可 以 满 足 需 要 或 者 用 户可 以 创 建 自 己 的 控 件 因 为 V isu a l J +
- 提 供 了 在 W in 3 2 环 境 中 常 用 的 控件 所 以 对 于 V isu a l J +
- 设 计 环 境 中 可 用 的 可 视 组 件 你 会 感 到 非 常熟 悉
V isu a l J + + 开 发 环 境 与 W F C 类 紧 密 集 成 因 此 大 部 分 使 用 控 件 窗 体和 菜 单 的 方 法 都 可 以 在 U s in g V is u a l J + + 中 找 到
使 用 窗 体 初 步
在 W F C 编 程 中 多 数 应 用 程 序 的 窗 口 作 为 窗 体 显 示 无 论 是 想 要 一 个单 独 的 叠 加 图 形 图 形 组 件 如 主 应 用 程 序 窗 口 或 对 话 框 都 可 以 使
用 窗 体 窗 体 像 一 个 容 纳 控 件 的 容 器 可 以 使 用 户 以 可 视 的 方 式 编 写 应用 程 序 窗 体 具 有 自 己 的 属 性 这 些 属 性 可 以 在 P rope r t ie s 窗 口 中 设 定从 语 法 上 来 说 窗 体 是 c o m .m s. w fc .u i . F o rm 类 中 分 出 的 一 个 Ja va 类
Fo rm s 类 展 开 c o m .m s. w fc .u i . C o n t ro l 类 窗 体 中 的 控 件 也 是 如 此 控 件封 装 了 一 个 W in 3 2 窗 口
当 建 立 新 的 项 目 时 并 且 从 N e w P ro je c t 对 话 框 中 选 择 了 W ind ow s A p p lic a tio n 之 后 会 自 动 创 建 一 个 窗 体 用 户 通 过 在 P ro je c t 菜 单 中 选择 A dd Ite m 添 加 项 或 A dd F o rm 添 加 窗 体 来 添 加 其 他 的 窗 体
- 旦 窗 体 已 经 在 项 目 中 创 建 用 户 可 以 在 设 计 模 式 中 或 在 Te x t 编 辑 器中 观 察 它 通 过 从 P ro je c t E x p lore r 中 窗 体 的 快 捷 菜 单 中 选 择 V ie w D e s ig n e r 查 看 设 计 器 可 以 使 用 F o rm s D e sig n e r 来 改 变 窗 体 的 大 小和 设 置 窗 体 的 属 性 每 个 窗 体 都 属 于 一 个 看 不 见 的 包 含 应 用 程 序 主 线程 的 A p p lic a tio n 对 象 窗 体 和 控 件 体 现 了 可 视 的 W ind ow s 组 件 这 种可 视 窗 口 和 非 可 视 窗 口 的 集 成 完 全 由 W F C 结 构 处 理
当 用 户 在 新 的 窗 体 上 打 开 Te x t 编 辑 器 时 会 产 生 一 个 基 于 模 板 的 类它 包 含 必 要 的 Fo rm 类 语 法 包 括 一 个 构 造 器 和 一 个 带 有 实 例 化 窗 体 代
码 的 m a in ( ) 方 法 当 在 设 计 模 式 下 添 加 控 件 设 计 属 性 等 时 Fo rm s D e s ig n e r 插 入 并 修 改 类 中 相 应 的 部 分 参 阅 本 书 第 2 章 中 创 建 窗 体
- 节 来
了 解 如 何 在 项 目 中 添 加 窗 体
添 加 控 件
在 添 加 控 件 时 先 将 控 件 从 工 具 箱 中 拖 放 到 窗 体 上 调 整 好 大 小 然 后
在 P rope r t ie s 窗 口 中 设 置 属 性 在 V isu a l J + + 中 Ac t iv e X 和 W F C 控 件都 可 以 拖 放 到 窗 体 上 参 阅 第 2 章 中 的 添 加 控 件 的 窗 体 一 节 来 了 解如 何 将 控 件 从 工 具 箱 中 添 加 到 窗 体 上
W F C 控 件 可 分 为 三 类 在 使 用 时 这 三 种 控 件 没 有 区 别
-
In
t rin s ic c o n tro ls 内 在 控 件 基 本 的 W ind ow s 控 件 如 按 钮 复 选框 编 辑 框 和 列 表 框 等
-
C
o m m on c on tro ls 公 共 控 件 可 以 在 c o m c t l 32 .d ll 中 找 到 的 W in 3 2 公 共 控 件 这 些 控 件 包 括 动 画 工 具 栏 选 项 卡 状 态 栏 和 T re e 查看 控 件 等
-
W F C c on tro ls W F C 控 件 特 别 为 W F C 框 架 编 写 的 定 制 控 件
所 有 现 有 的 W F C 控 件 都 是 可 以 在 c o m .m s. w fc .u i 软 件 包 中 找 到 的 Ja va
类
如 果 愿 意 的 话 可 以 W F C 软 件 包 创 建 自 己 的 控 件 要 么 展 开 已 有 的 控件 或 者 编 写 自 己 的 窗 体 并 将 其 添 加 到 工 具 箱 中 利 用 W F C 组 件 模型 可 以 使 控 件 的 属 性 和 事 件 很 容 易 地 显 示 出 来 使 控 件 可 以 与 V isu a l J + + F o rm s D e sig n e r 紧 密 合 作
添 加 菜 单
菜 单 可 以 通 过 与 控 件 相 似 的 方 式 来 安 装 可 以 像 控 件 一 样 出 现 在 工 具 箱中 从 工 具 箱 中 拖 动 M a in M e n u 控 件 放 到 窗 体 上 来 添 加 菜 单 但 菜 单 放到 窗 体 上 之 后 可 以 通 过 输 入 的 方 式 在 Fo rm s D e s ig n e r 中 添 加 子 菜 单 和
菜 单 项 每 个 菜 单 项 具 有 一 个 事 件 处 理 程 序 与 代 码 的 开 发 阶 段 相 联 系应 用 控 件 在 以 可 视 方 式 创 建 菜 单 时 菜 单 和 菜 单 选 项 的 所 有 实 现 代 码都 可 以 自 动 创 建 请 参 阅 本 书 的 第 2 章 中 创 建 窗 体 菜 单 一 节 来 获得 如 何 将 菜 单 添 加 到 窗 体 上 的 更 多 信 息
添 加 代 码
F o rm s D e sig n e r 帮 助 建 立 初 始 的 窗 体 类 并 提 供 许 多 像 事 件 处 理 程 序 这样 的 骨 架 代 码 但 是 有 些 时 候 需 要 编 写 代 码 来 使 程 序 执 行
当 某 一 事 件 从 窗 体 上 的 用 户 界 面 元 素 触 发 时 例 如 单 击 一 个 控 件 便 调用 事 件 处 理 程 序 F o rm s D e sig n e r 可 以 为 用 户 建 立 骨 架 代 码 这 样 通常 在 事 件 发 生 时 只 需 要 填 充 要 运 行 的 代 码 即 可 W F C 组 件 模 型 在 所有 事 件 处 理 程 序 的 基 础 V isu a l J + + 编 译 器 中 使 用 了 一 种 新 的 de le ga te 关键 字 当 使 用 F o rm s D e sig n e r 将 事 件 处 理 程 序 挂 起 时 这 些 委 托 是 透 明的 在 更 高 级 的 方 案 中 可 以 直 接 使 用 它 们 例 如 源 于 自 己 的 事 件 由 于它 们 基 本 上 与 其 他 语 言 中 的 功 能 指 针 一 样 所 以 在 很 多 方 面 它 们 是 有 用的
除 了 控 件 和 事 件 处 理 程 序 外 W F C 库 中 其 他 许 多 部 分 也 是 很 有 用 的
-
G ra ph ic s supp ort 图 形 支 持 在 c o m .m s. w fc .u i 软 件 包 中 的 几 个 类包 括 用 来 提 供 访 问 W ind ow s 图 形 服 务 的 G ra ph ic s 类
-
D
yna m ic H T M L support 动 态 HTM L 支 持 c o m .m s. w fc .h tm l 软 件包 提 供 由 In te rn e t E xp lore r 4 .0 或 更 高 版 本 访 问 到 DH T M L 对 象 模
型 的 工 具
-
D a ta b ind ing s upport 数 据 绑 定 支 持 W F C 被 设 计 用 来 使 用 A c tiv e X D a ta O b je c ts AD O Ac t iv e X 数 据 对 象 组 件 来 支 持 简 单 和 复 杂 的 数据 绑 定 使 用 D a ta B inde r 组 件 用 户 可 以 从 一 个 记 录 集 中 绑 定 字 段 到任 何 W F C 组 件 的 属 性 上 W F C 还 提 供 其 他 的 复 杂 绑 定 组 件 用 来 直 接作 用 于 记 录 集
-
Loc
a l iz a t io n support 本 地 化 支 持 W F C 让 用 户 存 储 资 源 元 素 如字 符 串 字 体 和 位 图 到 资 源 文 件 中 而 且 这 个 资 源 文 件 符 合 特 定 的本 地 化 特 征 使 用 户 可 以 轻 松 地 进 行 本 地 化 代 码 操 作 这 样 就 可 以 简化 将 用 户 界 面 转 化 为 多 种 语 言 的 操 作
-
D i re c t W in32 A P I s upport 直 接 W in3 2 A P I 支 持 由 V isu a l J + + 提供 的 J /D i rect 技 术 允 许 用 户 从 Ja va 代 码 中 调 用 任 何 动 态 链 接 库 D L L W F C 建 立 在 J /D i rect 对 W in 3 2 库 的 调 用 层 上 在
c o m .m s. w fc .W in 3 2 和 c o m .m s. w fc .O L E 3 2 软 件 包 中 的 工 具 因 此如 果 用 户 习 惯 了 标 准 的 W ind ow s 编 程 并 想 要 直 接 访 问 这 些 库 W F C 提 供 了 基 本 的 元 素 如 设 备 上 下 文 和 窗 口 句 柄 来 给 用 户 提 供 最 终 的控 件 这 些 在 一 些 特 殊 的 应 用 程 序 中 是 必 须 的 大 部 分 程 序 员 会 发 现W F C 的 服 务 是 充 足 的
简 单 的 预 演
这 一 部 分 简 要 概 括 了 一 个 简 单 的 V isu a l J + + 应 用 程 序 这 个 程 序 以
W ind ow s N o te pa d 应 用 程 序 为 基 础 建 立 起 来 名 为 M y N o te p a d M y N o te p a d 是 一 个 Te x t 编 辑 器 它 的 F ile 菜 单 包 括 N e w O p e n Sa v e
Sa v e A s 和 Ex i t 菜 单 项 它 包 括 了 编 辑 器 的 大 部 分 基 本 功 能 如 允 许 用户 打 开 文 件 进 行 编 辑 然 后 将 其 存 储 到 相 同 或 不 同 的 文 件 中 等
注 意 这 些 语 法 与 使 用 V isu a l J + + A p p lic a t ion W iz a rd 生 成 的 Jp a d 应 用程 序 很 相 似 但 是 M y N o te p a d 并 不 是 使 用 A p p lic a tio n W iz a rd 建 立 的
它 是 专 门 用 来 清 楚 地 演 示 几 个 基 本 概 念 的 当 用 户 创 建 了 M y N o te p a d 之 后 由 A p p lic a tio n W iz a rd 生 成 的 代 码 将 更 容 易 理 解 因 为 它 们 使 用了 许 多 共 同 的 原 理
M y N o te p a d 本 质 上 是 由 带 有 编 辑 控 件 和 菜 单 组 成 的 单 独 的 窗 体 M y N o te pa d .ja v a 另 一 个 窗 体 N e wD ia lo g . ja v a 是 一 个 模 态 对 话 框 在 用 户 打 开 新 文 件 或 关 闭 当 前 文 件 时 它 提 示 用 户 进 行 保 存 在 本 章
的 最 后 列 出 了 所 有 这 些 文 件 的 完 整 代 码
该 应 用 程 序 是 利 用 V isu a l J + + F o rm s D e sig n e r 和 Te x t 编 辑 器 来 设 计 和 编码 的 许 多 代 码 是 由 设 计 器 自 动 生 成 的 在 这 里 指 出 了 Fo rm s D e s ig n e r 的 功 能 通 过 设 计 器 创 建 该 应 用 程 序 自 动 生 成 的 代 码 和 W F C 应 用 程 序编 程 的 几 个 基 本 概 念 它 特 别 介 绍 了
-
使 用 F o rm s D e sig n e r 来 创 建 应 用 程 序 窗 体
-
如 何 开 始 和 终 止 应 用 程 序
-
剖 析 了 V isu a l J + + F o rm s 模 板
-
如 何 处 理 事 件
-
如 何 打 开 模 态 对 话 框 和 检 索 用 户 的 结 果
-
如 何 使 用 O p e n F i le D ia lo g 和 S a v e F ile D ia lo g 类 来 处 理 文 件
-
如 何 使 用 用 于 文 件 输 入 /输 出 I/ O 的 F ile 流 类
这 个 简 单 的 预 演 结 尾 附 有
-
简 单 预 演 摘 要
-
代 码 列 表
使 用 V is ual J + + 创 建 应 用 程 序
这 一 部 分 的 内 容 将 介 绍 在 V isu a l J + + 中 创 建 M y N o te p a d 应 用 程 序 的 步骤 在 进 入 设 计 器 为 这 些 步 骤 生 成 的 代 码 之 前 先 浏 览 一 下 这 些 步 骤 是很 有 好 处 的
- 创 建 主 窗 体
可 以 使 用 第 一 次 打 开 V isu a l J + + 时 出 现 的 N e w P ro je c t 新 项 目 对 话框 或 是 从 F ile 菜 单 中 选 择 N e w P ro je c t 命 令 来 创 建 主 窗 体 选 择W ind ow s A pp lic a t io n 图 标 输 入 应 用 程 序 的 名 字 在 这 里 指M y N o te p a d 并 且 选 择 O p e n V isu a l J + + 使 用 该 名 字 创 建 一 个 项 目该 项 目 默 认 包 含 一 个 名 为 Fo rm 1 . ja v a 的 窗 体 在 后 面 的 步 骤 中 将 要 把它 改 名 为 M y N o te p a d
- 添 加 控 件 和 菜 单 到 窗 体 中
V isu a l J + + F o rm s D e s ig n e r 使 得 安 排 窗 体 内 容 非 常 容 易 要 在 设 计 模式 中 打 开 该 窗 体 在 P ro ject E x p lo rer 中 选 择 Fo rm 1 . ja v a 然 后 从 V ie w 菜 单 中 选 择 D e s ig n e r 设 计 器 或 者 从 快 捷 菜 单 中 选 择 V ie w D e s ig n e r 查 看 设 计 器 当 窗 体 显 示 时 用 户 可 以 从 工 具 箱 中 添 加 控 件 要
访 问 在 工 具 箱 中 的 W F C 控 件 可 以 在 T oo lbox 选 项 卡 上 单 击 或 者从 V ie w 菜 单 中 选 择 T oo lbox 然 后 在 工 具 箱 中 单 击 W F C Co n tro l W F C 控 件 按 钮 来 显 示 这 些 控 件
对 于 这 个 例 子 来 说 一 个 编 辑 控 件 已 经 从 工 具 箱 中 添 加 到 窗 体 上
添 加 菜 单 同 样 也 很 容 易 从 工 具 箱 中 拖 动 M ia n M e n u 控 件 到 窗 体 上并 且 将 它 放 到 一 个 地 方 然 后 在 第 一 个 框 中 开 始 输 入 并 在 该 框 的 下面 或 右 边 继 续 添 加 菜 单 项
需 要 注 意 的 是 可 以 通 过 在 某 个 字 符 前 面 输 入 一 个 & 符 号 来 在 该菜 单 上 创 建 一 个 快 速 访 问 键 该 字 符 在 菜 单 上 变 为 下 划 线 显 示
- 在 窗 体 和 控 件 上 设 置 属 性
使 用 P rope r t ie s 窗 口 设 置 属 性 在 这 种 情 况 下 为 了 方 便 起 见 许 多属 性 设 置 为 默 认 值 下 面 列 出 的 在 编 辑 控 件 上 的 属 性 被 改 变 了
m u l t il in e ( 多 行 ) 属 性 设 置 为 真 do c 文 档 属 性 设 置 为 F ill 填 充
sc ro llB a rs 滚 动 条 属 性 设 置 为 V e rtic a l 垂 直 及 fo n t n a m e 字 体名 属 性 设 置 为 F ixe ds y s 用 来 更 好 地 模 仿 N o te p a d 在 窗 体 和 控 件中 可 能 还 有 用 户 想 要 设 置 的 其 他 属 性
用 户 可 能 需 要 重 新 命 名 一 些 组 件 来 使 得 标 题 更 容 易 理 解 选 择 窗 体 或控 件 并 设 置 名 称 属 性 来 重 新 命 名 它 们 在 M y N o te p a d 中 更 改 下
面 的 名 称 |
||
---|---|---|
默认 名 |
新 名 |
|
Ed i t1 M a in M e n u 1 |
E d i tB o x M e n u |
|
M e nu Item 1 |
F i leM e n u |
|
M e nu Item 2 |
F i leM e n u N ew |
|
M e nu Item 3 |
F i leM e n u O p e n |
|
M e nu Item 4 |
F i leM e n u S av e |
|
M e nu Item 5 |
F i leM e n u S av eA s |
|
M e nu Item 6 |
F i leM e n u E x i t |
|
M e nu Item 7 |
H e lp M e n u |
|
M e n u Ite m 8 |
H e lp M e nuA b o ut |
|
4. 改 变 fo rm 1 .ja v a |
的 名 称 |
用 户 可 能 想 要 使 主 窗 体 的 名 称 不 是 Fo rm 1 . ja v a 可 以 从 P ro je c t E xp lore r 中 选 择 Fo rm 1 . ja v a 右 击 并 且 从 快 捷 菜 单 中 选 择 R e n a m e 重 命 名 然 后 键 入 新 的 名 称 在 这 里 为 M y N o te pa d .ja v a 这 样 重 命 名 操 作就 完 成 了
如 果 改 变 名 称 记 住 必 须 将 源 代 码 中 出 现 的 所 有 Fo rm 1 改 变 为M y N o te p a d 要 这 样 做 首 先 应 该 选 择 F o rm s D e sig n e r 然 后 通 过 从快 捷 菜 单 中 选 择 V ie w C ode 查 看 代 码 来 打 开 源 代 码 文 件 从 Ed i t
菜 单 中 选 择 F ind a nd re p la c e 查 找 和 替 换 命 令 并 且 用 新 名 称 替换 Fo rm 1 的 所 有 实 例 例 如 将 Fo rm 1 替 换 为 M y N o te p a d
5. 创 建 对 话 框
N e wD ia lo g 对 话 框 就 是 在 项 目 中 的 另 外 一 个 窗 体 从 P ro ject 菜 单 中选 择 A dd F o rm 在 A dd Ite m 对 话 框 中 选 择 Fo rm 输 入 新 窗 体 的 名 字
在 这 里 为 N e wD ia lo g . ja v a 并 单 击 O p e n 来 创 建 另 外 的 窗 体
在 这 种 情 况 下 添 加 了 三 个 按 钮 它 们 分 别 命 名 为 Y e s B u tto n No B u t to n 和 C a n c e l B u tto n 并 具 有 适 当 的 标 签 & Y e s & N o 和 & C an ce l 按钮 控 件 有 一 个 d ia log R e su l t 属 性 在 模 态 对 话 框 中 使 用 该 按 钮 时 这个 属 性 是 很 有 用 的 例 如 如 果 Y e s B u tto n 控 件 的 d ia log R e su l t 属 性设 置 为 Y e s 并 且 当 用 户 单 击 该 按 钮 时 对 话 框 关 闭 并 且 返 回D ia lo g R e s u l t 值 Y e s 在 这 种 情 况 下 d ia log R e su l t 属 性 设 置 为 下 面 列出 的 值
控件 d ia log r e s u lt 属性
Y e s B u t to n Y e s
N o b u t to n No
Ca n c e lB u tto n Ca n c e l
有 一 点 需 要 注 意 Fo rm s 类 有 一 个 ac cep tb u t to n 属 性 用 来 检 测 当 用户 按 下 EN TER 键 时 单 击 了 哪 一 个 按 钮 在 这 种 情 况 下 ac cep t B u t to n 属 性 设 置 到 Y e s B u tto n 控 件 Fo rm 类 还 有 一 个 ca n c el B u t to n 属 性 用来 检 测 当 用 户 按 下 ES C 键 时 单 击 了 哪 一 个 按 钮 在 这 种 情 况 下 该
属 性 设 置 到 C a n c e l B u tto n 控 件
同 样 按 钮 标 签 中 的 & 符 号 用 来 映 射 每 个 按 钮 的 特 定 键 例 如 由 于Y e s B u tto n 按 钮 的 标 签 是 & Y e s 所 以 按 Y 键 便 相 当 于 单 击 此 按钮
随 后 添 加 两 个 附 加 的 标 签 控 件 用 来 显 示 该 对 话 框 的 消 息 文 本 最 后P ic ture B ox 控 件 添 加 到 窗 体 中 控 件 的 图 像 属 性 设 置 为 一 个 带 有 惊 叹号 的 位 图
因 为 窗 体 中 添 加 了 一 个 图 像 所 以 当 保 存 窗 体 时 V isu a l J +
- 自 动创 建 一 个 资 源 文 件 称 为 N e wD ia lo g . re s o u rc e s 并 且 将 图 像 放 到 该文 件 中 资 源 文 件 提 供 了 一 种 机 制 来 在 不 同 的 语 言 环 境 中 本 地 化 窗体 虽 然 在 这 种 情 况 下 它 大 部 分 用 于 进 行 打 包 用 户 还 可 以 设 置 窗体 的 本 地 化 属 性 为 真 以 便 使 资 源 文 件 添 加 到 项 目 中 在 这 种 情 况 下包 括 字 符 串 在 内 的 所 有 资 源 都 添 加 到 资 源 文 件 中
启 动 和 终 止 应 用 程 序
c o m .m s. w fc .a p p 软 件 包 包 括 静 态 的 A p p lic a tio n 类 用 来 管 理 所 有 的W in 3 2 窗 口 处 理 如 注 册 实 例 化 处 理 消 息 循 环 等 等 创 建 的 主 应 用程 序 窗 口 的 过 程 是 调 用 A p p lic a tio n .ru n 方 法 并 将 其 传 递 到 Fo rm 派生 出 的 对 象 中 这 个 对 象 构 成 了 窗 口 的 可 视 化 外 观 这 些 调 用 发 生 在 由V isu a l J + + 生 成 的 基 于 Fo rm 模 板 类 的 m a in ( ) 方 法 中 对 于 M y N o te p a d 应 用 程 序 将 生 成 下 面 的 代 码
p u b lic s ta tic v o id m a in ( S t r in g a rg s [ ] )
{
A p p lica tio n .r u n ( n e w M y N o tep a d ( ) ) ;
}
默 认 情 况 下 由 V isu a l J + + 模 板 创 建 的 基 本 应 用 程 序 使 用 在 应 用 程 序 右上 角 的 W ind ow s 退 出 按 钮 X 来 关 闭 但 是 用 户 可 以 在 代 码 中 的 任何 位 置 退 出 该 应 用 程 序 这 只 要 调 用 A p p lic a tio n .e x it 方 法 即 可 例 如当 单 击 F ile 菜 单 上 的 Ex i t 时 应 用 程 序 关 闭
P riv a te v o id F ile M e n u E x it_ c l ic k ( O b je c t se n d e r , E v e n t e )
{
// C a ll th e n e w file h a n d ler to in v o k e N e w D ia lo g
// to a s k if u s er w a n ts to s a v e c u r r en t d a ta th is .F ileM e n u N e w _ click (s en d er, e);
A p p lic a tio n .e x it()
}
上 面 介 绍 了 应 用 程 序 运 行 时 调 用 的 代 码 用 户 如 何 运 行 应 用 程 序 是 值 得一 提 的 V isu a l J + + 有 丰 富 的 配 置 特 性 其 中 一 个 就 是 用 来 创 建 W ind ow s 可 执 行 文 件 .e x e 允 许 用 户 以 与 其 他 W ind ow s 应 用 程 序 类 似 的 风 格运 行 自 己 的 W F C 应 用 程 序 假 定 用 户 的 计 算 机 上 已 经 安 装 了 W F C 类W F C 类 包 含 在 能 够 重 新 分 布 的 V irtu a l M a c h in e fo r J a v a 中
V is ual J + + 窗 体 模 板 的 剖 析
基 本 的 W F C 窗 体 是 一 个 公 共 类 使 用 默 认 的 构 造 器 和 in it F o rm 方 法 展开 FO R M 类 当 实 例 化 Fo rm 类 时 类 构 造 器 调 用 in it F o rm 方 法 Fo rm s D e s ig n e r 将 用 于 初 始 化 窗 体 和 控 件 属 性 的 所 有 代 码 放 入 in it F o rm 方 法中 应 用 程 序 的 其 他 代 码 在 构 造 器 中 调 用 in it F o rm 的 后 面 在 M y N o te p a d 应 用 程 序 中 应 用 程 序 名 就 放 在 这 里 虽 然 它 可 能 已 经 放 在 窗 体 的P rope r t ie s 窗 口 中 用 于 M y N o te p a d 应 用 程 序 的 构 造 器 是
pub lic M y N o te pa d()
{
/ / R equ ir ed f o r V is u al J + + F o r m D es igner s u pp o r t in it F o r m ( ) ;
th is .s et B o un d s ( 1 00, 10 0, 30 0 , 30 0 ) ;
th is .s et T ex t (" U n title d - M y N o tep a d " ) ;
}
对 于 所 有 类 主 体 中 添 加 的 控 件 V isu a l J + + F o rm s D e s ig n e r 在 in it F o rm
方 法 前 面 添 加 声 明 例 如 这 就 构 成 M y N o te pa d .ja v a 窗 体 对 象 的 声 明
/* *
-
N O T E : T h e f o l low in g c o de is r equ ir e d b y th e V is u a l J + + F o r m s
-
D es ig n er. It ca n b e m o d if ie d u s in g th e F o r m ed ito r . D o n o t
-
m o d if y it u s in g th e T ext e d it o r .
* /
C on ta ine r c o m pone n ts = ne w C on ta ine r();
M a in M en u M e nu = n e w M a in M e nu();
M enu Ite m F i le M en u = ne w M enu Ite m ( ) ;
M en u Ite m F i le M enu N e w = ne w M enu Ite m ( ) ; M enu Ite m F i le M en u O p en = ne w M e n u It e m ( ) ; M enu Ite m F i le M en u Sa ve = ne w M e n u It e m ( ) ;
M enu Ite m F i le M en u Sa ve A s = ne w M e n u It e m ( ) ; M en u Ite m F i le M enu Ex it = ne w M enu Ite m ( ) ;
M en u Ite m H e lp M e n u = n e w M e n u It e m ( ) ;
M enu Ite m H e lp M e n u A b o u t = ne w M enu Ite m ( ) ; E d it e d itb o x = n e w E d it ( ) ;
p r iv a te v o id in i t F o rm ( )
{
. . .
V isu a l J + + F o rm s D e sig n e r 创 建 此 声 明 代 码 和 在 in it F o rm 方 法 中 的 代 码这 些 代 码 设 置 窗 体 的 属 性 并 且 将 控 件 放 置 到 窗 体 上 处 理 事 件 的 基 础也 与 F o rm s D e sig n e r 紧 密 集 成 它 可 以 生 成 在 in it F o rm 方 法 中 映 射 的 事件 处 理 程 序
在 in it F o rm 方 法 中 的 头 两 个 语 句 用 来 示 范 F o rm s D e sig n e r 如 何 设 置 对 象的 属 性 在 这 里 是 将 菜 单 项 的 Te x t 属 性 设 置 为 & N e w 和 使 用 对 象的 Ad d O n C l ic k 方 法 来 为 对 象 建 立 单 击 事 件 处 理 程 序
p r iv a te v o id in i t F o rm ( )
{
f i le M e n u N ew . se t T e x t ("& N ew ");
File M enu N e w .a d d O n C l ick ( ne w E v e n th a n d ler( th is .F i le M enu N e w _ c li c k ) ) ;
处 理 事 件
M y N o te p a d 应 用 程 序 中 的 多 数 代 码 出 现 在 事 件 处 理 程 序 方 法 中 它 们 在单 击 菜 单 项 时 调 用 F o rm s D e sig n e r 通 过 窗 体 上 控 件 生 成 的 事 件 使 得用 户 可 以 很 容 易 地 创 建 骨 架 事 件 处 理 程 序 例 如 要 添 加 一 个 菜 单 单 击事 件 的 处 理 程 序 方 法 用 户 只 需 在 窗 体 上 双 击 该 菜 单 项 当 直 接 在 按 钮或 菜 单 项 上 双 击 时 会 产 生 单 击 事 件 处 理 程 序 也 可 以 使 用 在 P rope r t ie s 窗 口 中 的 E v e n ts 事 件 选 项 卡 来 轻 松 地 创 建 处 理 程 序 的 骨 架 代 码
F o rm s D e sig n e r 然 后 添 加 骨 架 事 件 处 理 方 法 在 其 中 可 以 添 加 代 码 窗
体 的 类 和 插 入 用 于 在 in it F o rm 中 适 当 M e n u Ite m 类 的
M e nu Ite m . a ddO nC l ic k 调 用
例 如 单 击 名 为 F ile M e n u N e w 的 菜 单 项 时 在 in it F o rm 中 添 加 下 面 的代 码 并 且 在 类 中 添 加 调 用 F i le M e n u N e w _ c l ic k 的 方 法
F i le M e nuN e w . a d d O n C l ic k( ne w E v e n t H a nd le r ( th is . F i le M e nuN e w _ c l ic k ) );
M e nu Ite m . a ddO nC l ic k 方 法 带 有 一 个 E v en t H an d le r 对 象 E v en t H an d le r 对 象 是 在 单 击 菜 单 项 时 使 用 调 用 方 法 的 引 用 创 建 的 本 来 M e nu Ite m 对 象 监 视 鼠 标 单 击 并 当 事 件 发 生 时 调 用 每 个 事 件 处 理 程 序 添 加 到 其中
所 有 事 件 处 理 对 象 都 是 委 托 在 它 们 之 间 不 同 的 是 它 们 传 递 到 处 理 程序 的 事 件 对 象 E v en t H an d le r 委 托 传 递 一 个 E v e n t 对 象 该 对 象 包 含 有关 该 事 件 的 信 息 但 是 例 如 K e yE ve n t H a n d le r 传 递 K e yE ve n t 对 象该 对 象 扩 展 键 按 下 和 键 释 放 的 事 件 K e yE ve n t 包 含 一 个 附 加 的 字 段 指
定 UN IC OD E 字 符 以 及 它 是 否 与 CT R L SH I F T 或 A L T 键 组 合 使 用 多 数 W F C 程 序 员 不 需 要 知 道 多 少 有 关 委 托 的 知 识 因 为 事 件 处 理 程 序已 经 存 在 于 W F C 用 于 事 件 的 软 件 包 中 并 且 大 部 分 要 添 加 的 代 码 已 经由 F o rm s D e sig n e r 生 成
下 面 就 是 在 M y N o te p a d 应 用 程 序 中 的 事 件 处 理 程 序 用 来 控 制 这 些 特殊 菜 单 项 的 选 择
p r iv a te v o id F i le M e n u N e w _ click ( O b je ct s e n d er, E v en t e)
{
/ / If ed it co ntro l co ntains t ex t , ch eck if it s h ou ld b e sav e d
if ( ed itb o x .g e t T ex t(). le n g th () ! = 0 ) {
/ / O p en N e w D ia lo g class as a m o d a l d ialog
in t res u lt = n e w N e w D ia log ( ) . s h ow D ia log ( th is ) ;
/ / R e t r iev e r es u lt
/ / If Y es b u t ton w a s c l ick e d op en S a v e A s d ialog b o x if ( r es u lt = = D ia log R es u lt . Y ES )
th is .F ileM e n u S a v eA s _ c li c k ( s e n d er, e);
/ / If N o b u t to n w a s c l ick e d clea r ed it contro l a nd set t it le els e if ( r es u lt = = D ialogR es u lt .N O ) {
ed itbo x .s e t T ex t (“” );
th is .s e t T ex t (“ U n tit led – M y N o tep a d ” );
}
}
}
当 然 F o rm s D e sig n e r 只 创 建 骨 架 事 件 处 理 程 序 打 开 定 制 模 态 对 话 框的 代 码 还 需 要 手 工 添 加
实 现 模 态 对 话 框
在 M y N o te p a d 应 用 程 序 中 用 户 单 击 在 F ile 菜 单 上 的 N e w 命 令 时 在该 事 件 处 理 程 序 中 的 代 码 检 测 是 否 在 编 辑 控 件 中 有 文 本 如 果 有 它 将打 开 一 个 模 态 对 话 框 显 示 询 问 用 户 是 否 保 存 该 文 本 的 消 息 如 果 用 户
单 击 Y e s 按 钮 则 调 用 M y N o te pa d. F i le M e nuS a v e A s_ c l ic k 方 法 该 方法 允 许 用 户 选 择 文 件 并 且 存 储 当 前 文 本 如 果 用 户 单 击 No 编 辑 控件 被 清 除 并 且 在 主 窗 体 上 方 的 标 题 显 示 变 为 U n title d - M y N o te p a d
在 F i le M e n u N e w _ c l ic k 方 法 中 该 对 话 框 的 请 求 和 检 索 结 果 是 在 下 面 这一 行 中 完 成 的
in t re su lt = n e w N e w D ia lo g ( ) .s h o w D ia lo g ( th is ) ;
当 打 开 模 态 对 话 框 时 对 话 框 结 果 值 从 对 话 窗 体 中 设 置 D ia lo g R e s u l t 类 中 包 含 用 于 此 目 的 的 整 型 常 量 但 是 可 以 返 回 任 何 一 个 整 数 在 这 种情 况 下 使 用 按 钮 的 d ia log R e su l t 属 性 该 属 性 可 以 设 置 D ia lo g R e s u l t 值
作 为 例 子 单 击 ye s B u tto n 控 件 设 置 D ia lo g R e s u l t 为 Y e s 当 对 话 框 关闭 时 该 结 果 从 S how D ia log 方 法 返 回 到 调 用 的 类 中 由 sh o wD ia lo g 返回 的 整 数 结 果 随 后 用 来 检 测 下 一 步 的 动 作
N e wD ia lo g . ja v a 窗 体 使 用 同 主 应 用 程 序 窗 体 一 样 的 Fo rm 模 板 作 为 一个 新 的 窗 体 而 创 建 注 意 主 方 法 不 需 要 模 态 对 话 框 并 且 在 本 例 中 删除 将 其 留 下 来 不 会 导 致 错 误 但 也 不 是 良 好 的 编 程 风 格 还 有 要删 除 与 该 方 法 无 关 的 模 板 注 释
使 用 消 息 框 作 为 模 态 对 话 框
在 简 单 的 情 况 下 用 户 还 可 以 使 用 消 息 框 来 代 替 定 制 模 态 对 话 框 He lp 菜 单 上 A bout M y N o te pa d 菜 单 项 的 单 击 事 件 处 理 程 序 使 用 如 下 所 示 的M e ss a g e B o x 对 象
priv a te v o id H e lp M e nuA bou t_c l ic k ( O b je c t se nde r , E v e n t e )
{
m essage B o x .sho w (" V ers io n: V is u a l J+ + 6 .0 " , " M yN otep ad" ) ;
}
实 现 文 件 对 话 框 和 文 件 输 入 /输 出
在 这 个 应 用 程 序 中 我 们 所 关 心 的 其 余 代 码 有 用 来 操 作 文 件 输 入 / 输 出和 使 用 F ile O p e n 和 F ile S a v e 对 话 框 的 代 码 它 示 范 了 W F C 类 如 何 简化 了 定 位 打 开 读 取 和 写 入 文 件 的 操 作 下 面 简 要 介 绍 W F C 类 如 何做 这 些 工 作
在 W F C 类 层 次 中 co m .m s . w fc .u i . O p en F i le D ialo g 和
c o m .m s. w fc .u i . S a v e F i le D ia lo g 类 都 扩 展 c o m .m s. w fc .u i . F i le D ia lo g
F ile D ia lo g 扩 展 C o m m onD ia lo g 它 是 用 于 W in 3 2 公 用 对 话 AP I 的 打 包所 有 公 用 对 话 使 用 如 se tT i tle 和 se tF ilte r 这 样 的 属 性 来 设 置 并 且 通 过调 用 show D ia log 方 法 来 运 行 这 些 对 话 框 允 许 用 户 为 打 开 或 保 存 的 文件 选 择 文 件 名
c o m .m s. w fc .io 软 件 包 包 含 基 于 流 的 输 入 /输 出 类 扩 展 D a ta S t re a m 的 F ile
类 包 含 用 于 文 件 输 入 /输 出 的 方 法 在 M y N o te p a d 应 用 程 序 的 情 况 中需 要 所 有 这 些 来 打 开 文 件 将 它 们 都 读 入 到 编 辑 控 件 中 或 者 将 编 辑 控件 中 的 内 容 写 到 文 件 中 和 关 闭 文 件
在 M y N o te p a d 应 用 程 序 中 所 有 的 输 入 /输 出 和 文 件 对 话 代 码 都 在 F ile
菜 单 上 的 O p e n Sa v e 和 Sa v e A s 的 事 件 处 理 方 法 中 我 们 将 只 注 意 其
中 的 O p e n 菜 单 事 件 处 理 程 序 因 为 它 封 装 了 公 用 对 话 和 F ile 输 入 /输 出的 功 能 用 于 F ile M e n u O p e n _ c l ic k 的 代 码 为
p r iv a te v o id F i le M e n u O p en _ c l ick ( O b je ct se n d e r , E v e n t e)
{
/ / C rea t e a n O p en F ile d ia lo g b o x
O p en file D ia lo g ofd = n e w O p e n F i le D ialog()
/ / S e t u p filt ers a n d o p tio n s
o fd .s etD efa u lt E x t(" T ex t D o cs ( * .tx t)|* .tx t |A ll F i les ( * .* ) |* .* " ) ;
o fd .s etD efa u lt E x t(" tx t" );
/ / R u n th e O p en File d ia lo g bo x in t O K = ofd.sho w D ialog();
/ / C h e ck r es u lt of d ia lo g b o x a f ter it c los es if ( O K = = D ialogR es u lt .O K ) {
/ / R etriev e th e f i len a m e e n ter e d f i le N a m e = o f d . g e t F ile N a m e();
/ / O p en a F ile s trea m o n th a t f il e n a m e c u rr en tD o c = F ile.o p e n ( file N a m e);
/ / R etriev e th e le n g th o f th e f il e
in t ilength = (int)curr e n t D o c . g e t L en g th();
/ / R ea d in A N S I ch a ra c t ers to ed it b u ffer
e d itb o x .s etT ex t ( c u rr en tD o c .r ea d S t rin g C h a r s A n s i( ile n g th ));
/ / C lo s e th e f i le h a n d le
c u rr en tD o c.c lo s e(); f i le O p e n = t ru e ;
/ / S e t th e a p p lica t io n ’ s ca p t io n
t h is .s et T ex t ( F ile .g e t N a m e( file N a m e) + " - M y N o tep a d " );
}
}
当 单 击 在 F ile 菜 单 上 的 O p e n 命 令 时 将 调 用 F i le M e nuO pe n_c l ic k 事 件处 理 方 法 代 码 中 的 前 三 行 创 建 一 个 O p e n F i le D ia lo g 对 象 并 且 设 置 对话 框 使 用 的 过 滤 器 和 扩 展 名 当 手 工 添 加 这 些 行 时 用 户 可 以 使 用 Fo rm s D e s ig n e r 做 同 样 的 事 情 方 法 是 添 加 一 个 O p en f i le d ialo g 对 象 到 窗 体
并 且 设 置 它 的 属 性 此 时 初 始 化 代 码 放 置 到 in it F o rm 方 法 中
最 后 调 用 O p e n F i le D ia log . show D ia log 方 法 来 打 开 对 话 框 当 对 话 框 关闭 时 如 果 用 户 单 击 O K 按 钮 方 法 返 回 一 个 等 于 D ia lo g R e s u l t . O K 的整 数 如 果 用 户 单 击 C a n c e l 按 钮 则 返 回 D ia lo g R e s u l t . C a n c e l 如 果 单击 了 O K 按 钮 则 文 件 名 从 O p e n F i le D ia lo g 对 象 中 接 收 并 将 其 传 递 到F ile . o p e n 方 法 中 该 方 法 返 回 一 个 打 开 的 F ile 流 这 个 F ile 流 是 在 该文 件 上 以 读 写 访 问 方 式 打 开 的 F ile . o p e n 是 一 个 实 用 程 序 函 数 在 使 用下 面 的 构 造 器 创 建 F ile 对 象 时 它 也 可 以 做 同 样 的 事 情
F ile ( f i le N a m e , F i le.O P E N , F i le A c c es s .R E A D W R IT E F ile S h a r e . N O N E ) ;
简 单 预 演 摘 要
这 样 简 短 的 教 程 不 可 能 覆 盖 每 个 应 用 程 序 概 念 即 使 是 对 M y N o te p a d 这 样 简 单 的 应 用 程 序 但 是 事 件 处 理 程 序 使 用 对 话 框 操 作 和 简 单 的文 件 输 入 / 输 出 的 概 念 却 是 多 数 应 用 程 序 所 公 用 的 并 且 是 它 们 的 主 要问 题
在 这 个 预 演 中 我 们 没 有 涉 及 Sa v e 和 Sa v e A s 菜 单 项 事 件 处 理 程 序 的代 码 但 是 这 些 代 码 使 用 同 样 的 原 理 这 将 在 其 他 地 方 讨 论 所 以当 看 到 列 表 时 不 要 感 到 惊 奇
除 了 ja v a . la n g 之 外 在 该 应 用 程 序 中 使 用 的 其 他 标 准 Ja va 软 件 包 没 有太 大 的 用 处 诸 如 c o m .m s. w fc .io 和 co m . m s . w fc .u i 这 样 的 软 件 包 用 来 访问 W ind ow s A P I 的 基 本 功 能 当 用 户 知 道 目 标 环 境 将 是 W in 3 2 操 作 系统 时 这 将 提 供 相 当 好 的 性 能 和 可 用 性
要 记 住 M y N o te p a d 应 用 程 序 是 作 为 一 个 示 范 工 具 来 编 写 的 为 了 要 保持 它 的 短 小 并 突 出 要 点 它 没 有 提 供 更 多 的 错 误 检 查 或 像 N o te p a d 和JP a d 那 样 多 的 特 性 但 是 随 着 这 次 简 要 介 绍 的 结 束 用 户 应 该 知 道使 用 V isu a l J + + 和 W F C 创 建 自 己 的 应 用 程 序 的 方 法
代 码 列 表
下 面 列 出 的 代 码 提 供 了 M y N o te p a d 应 用 程 序 中 的 两 个 基 于 窗 体 的 类
M y N o tepad . ja v a
/* ** ** ** * * ** * * ** ** ** ** * * ** * * ** ** ** ** * * ** * * ** ** ** ** * * ** ** ** ** ** ** * * ** ** ** ** M y N o t ep a d. ja va
T h is s a m p le is p ro v id ed a s a c o m p a n io n to th e In tro d u ctio n to W F C
p rogram m in g to p ic in th e V isual J+ + do cu m en tatio n.R ead th e sectio n
title d M y N o t ep a d S a m p le W a lk th ro u g h in c o n ju n c t io n w it h th is s a m p le.
** ** ** ** * * ** * * ** ** ** ** * * ** * * ** ** ** ** * * ** ** ** ** ** ** * * ** ** ** ** * * ** * * ** ** ** */
im po r t c o m . m s . w f c .a pp.*; im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.io .* ;
pub lic c la ss M y N o te pa d e x te nds F o rm
{
p r iv a te F ile c u r r en tD o c ; // th e I/ O file s t rea m
p r iv a te S trin g f ile N a m e ; //th e m o s t r e c en tly -u s ed f il e n a m e p r iv a te b o o lea n f i le O p en = fa ls e ; / / s e t t ru e a fter f ile o p en e d
pu b lic M y N o t epa d ( )
{
/ / R eq u ir ed f o r V isua l J+ + F o rm s D esign er sup p ort in it F o r m ( ) ;
th is .s e t B o u n d s ( 1 00, 10 0 , 30 0 , 30 0);
th is .s e t T ex t (“ U n t itled – M y N o tep a d ” ) ;
}
p r iv a te v o id H e lp M en u A b o u t_ click ( O b je ct s e n d er, E v en t e)
{
M essage B o x .sho w (" V ers io n: V isua l J+ + 6 .0 " , " M yN otep a d " ) ;
}
p r iv a te v o id F i le M e n u N e w _ click ( O b je ct s e n d er, E v en t e)
{
/ / If edit con t ro l co n tains t ex t , ch eck if it shou ld b e sav e d if ( e d itb ox .g e t T ex t ( ) .l en gth() != 0 ) {
// O p en N e w D ia lo g c la s s a s a m o d a l d ia lo g
in t r es u lt = ne w n e w D ia lo g ( ) . s h ow D ia lo g ( th is ) ;
/ / R etrie v e r es u lt
/ / If Y es bu t to n w a s c li c ked o p e n S a ve A s d ia lo g bo x if ( r es ult = = D ialogR es u lt .Y E S )
t h is .F i le M en u S a ve A s _click ( s ender, e);
// If N o b u tto n w a s c lic k ed c lea r e d it co n tro l a n d s e t tit le els e if ( r es u lt = = D ia lo g R es u lt .N O ) {
ed itbo x .s e t T ex t (" " ) ;
th is .s e t T ex t (" U n t it le d – M y N o t ep a d " ) ;
}
}
}
priv a te v o id F i le M e nu O p e n_c l ic k ( O b je c t se nde r , E v e n t e )
{
/ / C rea te a n O p en F ile d ia lo g b o x
O p en File D ia log o fd = ne w O p e n F i le D ia lo g ( ) ;
/ / S e t up f ilt ers and op t io n s
o fd .s e t F ilt er(" T ex t D o cs ( * .tx t)|* .tx t|A l l F iles ( *.* ) |* .*" ); ofd.s e t D efau lt E x t (" tx t" );
// R u n th e O p en F ile d ia lo g b o x in t O K = o f d.s h o w D ialog ( ) ;
/ / C h eck resu lt of dia lo g b o x after it c loses if ( O K = = D ia lo g R es u lt .O K ) {
// R etriev e th e filen a m e e n ter e d f ile N a m e = o fd .get F i le N am e();
// O p en a F ile s t rea m o n th a t filen a m e cu rr e n t D o c = F ile. o p e n (fileN a m e);
// R etrie v e le n g th o f f ile
in t ilen g th = ( in t ) c u rr en tD o c.g e t L en g th ();
/ / R ead in A N S I chara c ters to edit b u f f er
ed itb o x .s etT ex t( cu r r e n t D o c .r ea d S tr in g C h a rs A n s i(ilen g th ) ) ;
// C lo s e th e f ile h a n d le cu r r e n tD o c .clo s e();
file O p en = t ru e;
// S e t th e a p p li ca tio n ’ s ca p t io n
th is .s et T ex t(F ile. g etN a m e(f ile N a m e)+ " – M y N o t ep a d ");
}
}
p r iv a te v o id F i le M e n u S a v e _ c l ic k ( O b je ct s e n d er, E v en t e)
{
/ / If th er e has b een a file op en ed or sav ed if ( f i le O p en ){
/ / O p en th e c u rr en t file a g a in
cu rr e n tD o c = F ile .o p en ( f il e N a m e);
/ / W r it e ed it co n t ro l c o n t en ts to f i le
cu r r e n t D oc . w r it e Strin g C h a r s A n s i( e d itbo x .get T ex t ( ) ) ;
/ / C los e f ile han d le cu rr e n tD o c .clo s e();
}
els e
th is .F ileM e n u S a v eA s _ c li c k ( s e n d er, e);
}
priv a te v o id F i le M e nu S a v e A s_c l ic k ( O b je c t se nde r , E v e n t e )
{
S a ve F i le D ia log s fd = n e w Sa ve File D ia lo g ( ) ;
// S e t th e o p tio n s
s fd .s et F ile N a m e ( f i leN a m e);
sfd .set T it le(" S a v e T ex t F il e" ) ;
s fd .s etF ilt er(" T ex t D o cs ( * .tx t)|* .tx t|A l l F iles ( *.* ) |* .*" ); sfd .set D efau lt E x t (" tx t" );
// R u n th e d ia lo g b o x
in t r es u lt = s fd .s h o w D ia lo g ( ) ;
if ( r es u lt = = D ia lo g R es u lt.O K ) {
// R e t r ie v e th e f ile n a m e en t er ed in th e d ia lo g b o x f ile N a m e = s fd .g e t F ile N a m e();
/ / O p en a F il e s t rea m w ith a b il it y to cr ea t e a f ile if n e ed e d
cu rr e n t D o c = n e w F ile( file N a m e , F ile M o d e .O P E N _ O R _ C R E A T E ) ;
// W r it e th e c o n t en ts o f th e e d it c o n tro l to th e f ile
cu r r ent D o c . w r it e S t r in g C h arsA nsi( editb o x .g e t T ex t ( ) ) ;
// C lo s e th e f il e h a n d le cu r r e n tD o c . clo s e();
f ile O p en = tru e ;
// S e t th e a p p ’ s ca p t io n u s in g th e filen a m e m in u s its p a th th is .s et T ex t(F ile. g e t N a m e(f il e N a m e) + "
- M y N o t ep a d " );
}
}
p riv a te v o id F ile M e n u E x it_ c l ic k ( O b je c t se n d e r , E v e n t e )
{
}
/* *
// C a ll th e n e w file h a n d ler to in v o k e N e w D ia lo g
// to a s k if u s er w a n ts to s a v e c u r r en t d a ta th is .F ileM e n u N e w _ click (s en d er, e);
A p p lica t io n . ex it ( ) ;
-
N O T E : T h e f o l low in g c o de is r equ ir e d b y th e V is u a l J + + F o r m s
-
D esig n er. It ca n b e m o d if ied usin g th e F o r m ed itor. D o not
-
m o d if y it u s in g th e T ext e d it o r .
*/
C on ta ine r c o m pone n ts = ne w C on ta ine r();
M a in M en u M e nu = n e w M a in M e nu();
M enu Ite m F i le M en u = ne w M enu Ite m ( ) ;
M en u Ite m F i le M enu N e w = ne w M enu Ite m ( ) ; M enu Ite m F i le M en u O p en = ne w M e n u It e m ( ) ; M enu Ite m F i le M en u Sa ve = ne w M e n u It e m ( ) ;
M enu Ite m F i le M en u Sa ve A s = ne w M e n u It e m ( ) ;
M en u Ite m F i le M enu Ex it = ne w M enu Ite m ( ) ; M en u Ite m H e lp M e n u = n e w M e n u It e m ( ) ;
M enu Ite m H e lp M e n u A b o u t = ne w M enu Ite m ( ) ; E d it e d itb o x = n e w E d it ( ) ;
p r iv a te v o id in i t F o rm ( )
{
F ile M e n u N e w .s e t T ex t("& N e w ");
F ile M e nu N e w .a ddO n C lick ( n e w E v en t H a n d ler( this .F il e M e nu N e w _ c l ick));
F ile M e n u O p en .s et T ex t(" & O p en " );
F ile M e n u O p en .a d d O n C l ick ( n e w E v e n tH a n d ler(th is .F ile M en u O p en c lic k ) ) ;
F ile M e n u S a v e .s et T ex t(" & S a v e" );
F ile M e n u S a v e .a d d O n C l ick ( n e w E v e n tH a n d ler(th is .F ile M en u S a v e_ c lic k ));
F ile M e n u S a v e A s .s e t T ex t (" Sa v e & A s " ) ; F ile M e nu S a v e A s .a d d O n C l ick(n e w
E v en t H a n d ler(th is .F ile M e n u S a v e A s _ c lic k ) ) ;
F ile M e n u E x it .s e t T ex t(" E& x it ");
F ile M e nu E x it .a ddO n C lick ( n e w E v en t H a n d ler( this .F il e M e nu E x it_ c l ick ) ) ;
F ile M e nu .s e t M e nu It em s( n e w M e nu It em [ ] {
F i le M en u N e w , F i le M en u O p en ,
F i le M en u S a v e ,
F i le M en u S a v e A s , F i le M en u E x it} ) ;
F ile M e n u .s et T ex t(" & F il e" );
H e lp M e nu A b ou t .s e t T ex t (" & A b ou t M y N o t ep a d… " ) ; H e lp M e nu A b ou t .a d d O nC lick( n ew
E v ent H an dler( th is .H e lp M e nu A b out_ c lick ) ) ;
H e lp M e n u .s e t M enu Ite m s ( ne w M enu Ite m [ ] {
H e lp M en u A b o u t} ) ; H e lp M e n u .s e t T ext(" & H e lp" ) ;
M en u .s e t M e n u It e m s ( n e w M e n u It e m [ ] {
F i le M en u ,
H e lp M en u } ) ;
th is .s et T ex t (" M y N o tep a d " ) ; th is .s et V is ib le( fa ls e);
th is .s et A u to S ca leB a s eS iz e( 1 3 ) ;
th is .s et C lie n t S iz e(n e w P o in t(3 0 2 ,3 1 4 )); th is .s et M e nu( M e nu ) ;
ed itb o x .set D o c k( C o ntro l D o c k.F IL L ) ;
ed itbo x .s e t F o n t ( ne w Fon t (" F ix ed s ys " , 8 .0f,
F o n t S iz e .P O IN T S ,F o n t W e ig h t .N O R M A L ,fa ls e ,fa ls e,fa ls e,
C h aract er S e t .D E F A U L T , 0 ) ) ;
ed itb o x .s e t S iz e( ne w Po in t ( 30 2 ,31 4 ) ) ; ed itbo x .s e t T a b In dex( 1);
ed itb o x .s e t T ex t (" " ) ;
ed itbo x .s e t M u lt i line( t ru e);
ed itb o x .s e t S cr o l lB a rs ( S cr o l lB a rs .V E R T IC A L ) ;
th is .s et N e w C ontro ls ( n ew C ontro l[ ] {
ed itb o x } ) ;
}
/* *
- T h e m a in en t r y p o in t f o r th e a p p li ca t io n .
*
-
@ p aram args A r ra y of p a ra m e ters p a s s ed to th e ap p
licatio n
-
via th e co m m a nd lin e .
*/
p u b lic s ta tic v o id m a in ( S t r in g a rg s [ ] )
{
A pplica t io n .ru n ( ne w M y N o t epa d ( ) ) ;
}
}
N e w D ia lo g .ja v a
/* ** ** ** * * ** * * ** ** ** ** * * ** * * ** ** ** ** * * ** * * ** ** ** ** * * ** ** ** ** ** ** * * ** ** * Ne wD ia lo g .ja v a
T h is s a m p le is p ro v id ed a s a c o m p a n io n to th e In tro d u ctio n to W F C
P ro g ra m m in g to p ic in th e V is u a l J + + d o cu m e n ta t io n .R ea d th e s e ctio n
title d M y N o t ep a d S a m p le W a lk th ro u g h in c o n ju n c t io n w it h th is s a m p le.
T h is fo rm re pre s e n ts a s im p le m oda l d ia log box.
** ** ** ** * * ** * * ** ** ** ** * * ** * * ** ** ** ** * * ** ** ** ** ** ** * * ** ** ** ** * * ** * * ** ** */
im po r t c o m . m s . w f c .a pp.*; im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u i.* ;
pub lic c la ss N e w D ia lo g e x te nds F o rm
{
p u b lic N e w D ia lo g ( )
{
/ / R eq u ir ed for V is u a l J+ + F o rm s D esig n er s u p p o r t in it F o r m ( ) ;
}
/* *
-
N O T E : T h e f o l low in g c o de is r equ ir e d b y th e V is u a l J + + F o r m s
-
D es ig n er. It ca n b e m o d if ie d u s in g th e F o r m ed ito r . D o n o t
-
m o d if y it u s in g th e T ext e d it o r .
*/
C on ta ine r c o m pone n ts = ne w C on ta ine r();
L a bel la b e l1 = ne w L a b el(); L a bel la ble 2 = ne w L a b el();
B u t ton yesB utto n = n e w B u t ton(); B u t ton n o B u t ton = n e w B u t to n ( ) ;
B u t to n ca n c e lB u tto n = n e w B u tto n ( ) ;
P ictu reB o x p ictu r eB o x 1 = n e w P ictu r eB o x ();
p r iv a te v o id in i t F o rm ( )
{
/ / N O T E : T h is fo rm is storin g reso urce in f o r m atio n in a n
// ex tern a l f il e . D o n o t m o d if y th e s trin g p a ra m eter to a n y
/ / res o u r c es .get O b je c t ( ) function ca l l. F o r ex am ple, d o n o t
/ / m o d if y " foo l_ lo ca t ion " in th e fo llow in g lin e o f code
/ / ev en if th e n a m e o f th e F o o o b je ct ch a n g es :
/ / fo o l.s et L o ca t io n ((P o in t)r es o u r c es . g et O b je ct(fo o l_ lo ca t io n " ));
IR es o u r c eM a n a g er r es o u r c es = n e w
R esource M a nag er( th is , " N ew D ia lo g " ) ;
la b el1 .s e t L o ca t io n ( n e w P o in t ( 9 0 ,2 0 ) ); la b el1 .s e t S iz e( n e w P o in t ( 2 1 0 ,2 0 ) );
la b el1 .s e t T a b In d ex ( 0 ) ;
la b el1 .s e t T a b S to p ( fa ls e);
la bel1 .s e t T ex t(" T h e t ext in th e f i le m a y h a ve ch a n ge d " .) ;
la b el2 .s e t L o ca t io n ( n e w P o in t ( 9 0 ,4 0 ) ); la b e l2 .s e t S ize( n e w P o in t ( 190 ,20));
la b el2 .s e t T a b In d ex ( 1 ) ;
la b el2 .s e t T a b S to p ( fa ls e);
la bel2 .s e t T ex t(" D o y o u w a n t to s a ve th e c h a n g es ? " ) ;
yesB utto n .s e t L o catio n( n e w P o in t ( 2 0 ,9 0 ) ) ; yesB utto n .s e t S iz e( n e w P o in t ( 8 0 ,3 0 ) );
y es B u t to n .s e t T a b In dex( 2);
yesB utto n .s e t T ex t (" & Y es " ) ;
yesB utto n .s e t D ia logR es u lt ( D ia lo g R esult.Y E S ) ;
noB utton.set L o catio n( n e w P o in t ( 1 1 0 ,9 0 ) ); noB utton.set S iz e( n e w P o in t ( 8 0 ,3 0 ) );
noB utton.set T ab In d ex ( 3 ) ; noB utton.set T ex t (" & N o " ) ;
noB utton.set D ia lo g R es u lt ( D ia lo g R esult. N O ) ; ca nc e lB u t to n .s e t L o ca t ion ( n e w Po in t ( 20 0 ,90 ) );
ca n celB u t ton .s e t S iz e(n ew P o in t ( 8 0 ,3 0 ) ); ca n c e lB u t to n .s et T a b In d ex ( 4 ) ;
ca n celB u t ton .s e t T ex t (" & C an cel" ) ;
ca n celB u t ton .s e t D ialog R esu lt ( D ia lo gR es u lt .C A N C E L ) ;
th is .s et T ex t (" M y N o tep a d " ) ;
th is .s et A ccep t B u t ton(yesB utton); th is .s et A u to S ca leB a s eS iz e( 1 3 ) ;
th is .s et C a n c e lB u tto n ( ca n c e lB u t to n );
th is .s et C lie n t S iz e(n e w P o in t(2 9 7 ,1 3 6 ));
p ictu r e B o x 1 .s et L oca t io n ( ne w P o in t ( 2 0 ,2 0)); p ictu r e B o x 1 .s et S iz e( ne w P o in t ( 5 0 ,5 0 ));
p ictu r e B o x 1 .s et T a b In dex( 5);
p icture B ox 1 .set T ab S top ( fa lse); p icture B ox 1 .set T ex t (" ");
p ictu r e B o x 1 .s et Im a ge(( B itm a p ) r es o u r c es .get O b je c t ( " p ictu r eB o x 1 _ im a g e" ));
th is .s et N e w C ontro ls ( n ew C ontro l [ ] {
p ic tu r e B o x 1 , ca n c e lB u t to n , n o B u t to n ,
y es B u t to n ,
la b e l2 ,
la b e l1 } ) ;
}
}
第 12 章 W F C 编 程 概 念
W ind ow s F ounda t ion C la sse s fo r J a v a W F C 提 供 了 一 种 Ja va 软 件 包 的框 架 这 个 软 件 包 支 持 面 向 W ind ow s 操 作 系 统 和 D y n a m ic H T M L 对 象模 型 的 组 件 W F C 与 V isu a l J + + 开 发 环 境 紧 密 集 成 并 提 供 一 整 套 用 Ja va 编 写 的 W ind ow s 控 件 使 用 这 种 紧 密 的 集 成 和 支 持 如 In te lliS e n se Fo rm s D e s ig n e r A p p lic a tio n W iz a rd 和 O b je c t B ro w se r 的 特 性 建 立 W ind ow s 的 Ja va 应 用 程 序 会 更 加 容 易 当 能 够 熟 练 应 用 这 些 V isu a l J+ + 的 特 性 创建 应 用 程 序 时 你 可 能 会 想 了 解 组 成 W F C 软 件 包 和 类 的 结 构 背 后 的 结构 和 逻 辑
这 一 章 的 目 的 是 为 W F C 软 件 包 和 类 提 供 一 个 概 念 性 的 框 架 并 且 解 释一 些 基 本 的 W F C 模 型 很 多 软 件 包 是 组 件 模 型 的 技 术 并 且 经 常 被 热衷 于 使 用 W F C 控 件 的 开 发 人 员 所 忽 略 其 他 软 件 包 可 以 很 容 易 地 通 过V isu a l J + + F o rm s D e sig n e r 访 问 当 开 始 研 究 W F C 的 库 时 你 就 会 想 知道 对 于 特 定 的 应 用 程 序 来 说 哪 些 软 件 包 和 库 是 重 要 的
本 章 包 括 下 列 内 容
-
W
F C 软 件 包 高 度 概 括 了 组 成 W F C 的 主 软 件 包
-
使 用 W F C 的 可 视 组 件 工 作 描 述 了 控 件 窗 体 和 W F C 中 的 图 形对 象 包 括 下 列 内 容
-
W ind ow s 可 视 组 件
-
D yn a m ic H T M L 可 视 组 件
-
-
在
W F C 中 处 理 事 件 描 述 了 处 理 事 件 的 委 托 的 作 用
-
本 地 化 应 用 程 序 描 述 了 V isu a l J + + 和 W F C 在 各 种 语 言 中 用 于 本地 化 应 用 程 序 的 支 持 和 方 法
-
使 用 W F C 应 用 程 序 服 务 描 述 了 一 些 主 要 的 应 用 程 序 的 特 点 及 下列 一 些 内 容
-
启 动 和 退 出 应 用 程 序
-
处 理 应 用 程 序 事 件
-
访 问 系 统 信 息
-
执 行 剪 贴 板 和 拖 放 操 作
-
-
使 用 W F C 和 Ja va 线 程 描 述 了 W F C 的 线 程 模 型 并 介 绍 了 如 下几 方 面 的 内 容
-
混 合 Ja va 和 W in 3 2 的 线 程 模 型
-
创 建 和 退 出 线 程
-
使 用 线 程 存 储 器
-
使 用 线 程 异 常
-
W F C 软 件 包
W F C 的 基 础 是 W ind ow s 和 D y n a m ic H T M L W F C 源 于 W in3 2 W indow s
编 程 模 型 它 能 使 用 户 通 过 使 用 Ja va 来 编 译 基 于 W ind ow s 的 应 用 程 序
这 些 应 用 程 序 利 用 了 W ind ow s 用 户 界 面 的 控 件 事 件 和 系 统 服 务 功 能W F C 也 源 于 D y n a m ic H T M L 模 型 它 可 以 使 用 户 直 接 从 Ja va 中 利 用D yn a m ic H T M L 的 功 能 来 创 建 客 户 和 服 务 器 的 HT M L 页
这 些 技 术 的 中 心 是 本 机 动 态 链 接 库 DL L s 它 提 供 了 W F C 基 础 的 核心 AP I 由 于 使 用 了 两 种 不 同 的 技 术 J A c tiv e X 工 具 和 J/ D ire c t 因 此这 些 库 对 Ja va 语 言 是 有 效 的 如 果 D L L 代 表 了 CO M / A c t iv e X 组 件
J A c tiv e X 将 创 建 映 射 CO M 对 象 到 Ja va 对 象 的 打 包 类 如 果 D L L 不 是基 于 CO M 的 J /D i rect 直 接 调 用 到 D LL , 并 配 置 Ja va 和 D L L 本 机 语 言 C 或 C+ + 语 言 之 间 的 数 据 类 型 这 两 种 技 术 都 利 用 了 JV C 编 译 器
和 M ic ro so f t V i r tu a l M a c h in e fo r Ja v a 的 内 建 支 持 和 协 作
了 解 这 些 是 很 重 要 的 因 为 几 个 软 件 包 都 是 由 CO M 打 包 类 由 J A c tiv e X 产 生 或 J /D i rect 类 组 成 这 些 类 具 有 直 接 映 射 基 本 AP I 的 方 法 在 W F C R e fe re n c e 中 没 有 说 明 它 们 因 为 通 常 它 们 不 能 直 接 访 问 但 是 对 于 其他 软 件 包 它 们 是 作 为 支 持 类 来 讨 论 的
在 W F C 中 不 包 括 本 机 的 AP I 支 持 软 件 包 有 七 个 主 要 的 软 件 包
软件 包 |
说 明 | ||
---|---|---|---|
c o m .m s .w fc .a p p |
封装 |
W in d o w s 应用 程序 操 作 的基 类 |
V isu a l J+ + 窗体 |
组 件 模板 使 用 这些 类的 服 务 除了 基本 的 W in d o w s 信息处 理 结 构 外 有适 合 W in d o w s 特点 的支 持 如剪 贴板 注册 表 线程 窗口 句柄 和 系 统 信 息等
c o m .m s .w fc .c o re 组 件 模型 的基 类 这 个 软 件 包 支 持 包 容 器 事件 异
常 属性 以 及 与 V isu a l J+ + 特 征 相 互 操 作 的 基 础 设
施 如 Fo rm s D e s ign e r
c o m .m s .w fc .d a ta 允 许 数 据 访 问 和 数 据 绑 定 的 Ac t iv e Da ta O b je c t
AD O Ja v a 类 该软 件包 还 包 括 c o m .m s .w fc .d a ta .u i
该软 件 包 提 供 了 W F C 中数 据绑 定 控 件的 基类
c o m .m s .w fc .h tm l 用来 实 现 Ja v a 中的 D yn a m ic H T M L 类 这些 类 同 时
提 供 了客 户 端 和服 务器 端 的 支持
c o m .m s .w fc .io 用 来 访问 数据 流 实 现 完 整 的 数 据 包 用 于 读写串 行
流 文件 访 问 和在 数据 流 的 不同 类型 之间 映 射
c o m .m s .w fc .u i 与 W F C 一 起 装 载 的 控 件 的 核 心 类 这 些 类 还 提 供 了
对 W in d o w s G ra p h ic s A P I 的访 问
c o m .m s .w fc .u til 用 于 各种 排序 窗体 实 现 哈 希 表 等 的 各 种 窗 体 的 实 用
程序 类
下 面 是 W F C 中 核 心 本 地 AP I 支 持 类
软件 包 说 明
c o m .m s .w fc .a x |
提供 了 适 用 于 |
Ac t iv e X 接口 的 |
Ja v a 打包 类 |
|
---|---|---|---|---|
c o m .m s .w fc .h tm l.o m |
提供 了 适 用 于 |
D yn a m ic H T M L |
对象 模型 的 |
Ja v a 打包 类 |
c o m .m s .w fc .o le 3 2 |
提供 了 适 用 于 |
OL E 服务 的 Ja va 打包 类 |
||
c o m .m s .w fc .w in 3 2 |
提供 了 适 用 于 |
W in 3 2 A P I 的 Ja v a 打包 类 |
使 用 W F C 的 可 视 组 件
虽 然 W F C 中 的 W in 3 2 可 视 组 件 和 D y n a m ic H T M L D H T M L 应 用 程
序 之 间 存 在 着 一 些 差 别 但 其 间 存 在 着 很 多 相 似 的 地 方 这 些 相 似 性 使得 W F C 和 组 件 模 型 能 非 常 容 易 地 服 务 于 上 述 两 种 应 用 程 序 比 如 W in 3 2 和 D H T M L 模 型 都 包 含 基 本 的 控 件 类 型 如 编 辑 框 复 选 框 按 钮 单选 框 和 组 合 框 等 在 W in 3 2 中 最 常 用 的 控 件 中 会 有 一 个 D H T M L 控件 以 Dh 开 头 , 而 且 名 字 相 同 如 c o m .m s. w fc .u i . E d it 类 有 对 应 的c o m .m s . w fc .h tm l.D h E d it 类 字 体 颜 色 常 量 和 大 多 数 事 件 类 型 也 在
W in 3 2 |
和 D H T M L 模 型 中 共 享 |
|||||
---|---|---|---|---|---|---|
当 然 |
每 一 种 模 型 也 存 在 着 特 殊 的 组 件 |
如 |
D H T M L |
的 表 或 |
W in32 |
组 |
件 的 列 表 查 看 控 件
可 能 W F C W in 3 2 和 D H T M L 组 件 之 间 最 明 显 的 差 别 就 在 于 D H T M L 组 件 在 Fo r m s D e sig n er 中 是 无 效 的 这 就 意 味 着 用 户 必 须 在 代 码 编 辑器 中 创 建 添 加 和 修 改 D H T M L 元 素 但 是 在 两 种 方 式 中 最 根 本 的Ja v a 代 码 看 起 来 是 非 常 相 似 的
W in dow s 可 视 组 件
W F C 框 架 来 源 于 它 的 可 视 组 件 W F C 与 V isu a l J + + 这 种 可 视 化 开 发 工具 的 集 成 并 位 于 适 用 于 W ind ow s 操 作 系 统 的 W in3 2 A P I 的 顶 端 W F C 中 支 持 可 视 组 件 的 主 要 软 件 包 是 c o m .m s. w fc .u i W F C 中 大 部 分 可 视 元素 的 基 类 是 c o m .m s. w fc .u i . C o n t ro l 大 部 分 W F C 控 件 扩 展 这 个 类 包括 Fo rm 类 它 是 控 件 的 可 视 包 容 器
控 件 类
控 件 类 中 包 含 控 制 W in 3 2 窗 口 所 有 必 需 的 基 本 属 性 方 法 和 逻 辑 这些 方 法 可 分 类 如 下
-
用
于 设 置 和 检 索 控 件 的 属 性 如 显 示 的 大 小 和 客 户 矩 形 前 景 色 背景 色 相 关 的 刷 子 光 标 文 本 字 体 位 置 等 的 方 法 这 些 方 法 具有 以 se t 或 ge t 开 头 的 名 字 如 se t B ru sh 和 Ge t B ru sh
-
事
件 方 法 对 于 控 件 产 生 的 每 个 事 件 在 控 件 中 可 以 完 成 三 个 方 法 例 如 对 于 移 动 事 件 有 一 个 用 来 触 发 事 件 的 onM o v e 方 法 一 个 将事 件 处 理 程 序 分 配 给 移 动 事 件 的 a ddO nM ov e 方 法 和 一 个 删 除 事 件 处理 程 序 的 re m o ve O n M o ve 方 法 C on tro l 对 象 处 理 大 部 分 的 基 本 控 件事 件
-
处 理 控 件 父 / 子 关 系 的 方 法 如 添 加 方 法 添 加 一 个 子 控 件 并 且
a ssig n P a re n t 和 ge t P a re n t 分 配 并 检 索 父 控 件 还 有 一 些 方 法 用 来 处 理子 控 件 的 数 组
- 影 响 布 局 z- 次 序 绘 制 和 输 入 控 件 焦 点 的 方 法 如 brin g T o F ront
se ndT oB a c k upda te Z O rd e r P e rfo rm L a yo u t 焦 点 显 示 隐 藏 更新 无 效 crea te G rap h ic s 和 c re a te W ind ow G ra ph ic s
- 低
级 事 件 处 理 方 法 在 W in 3 2 级 W ind ow s 从 系 统 中 接 收 消 息 在控 件 类 中 每 一 个 输 入 到 控 件 的 消 息 都 有 一 个 保 护 的 进 程 方 法 例 如proc e ss C m d K e y proc e ss C m d K e y E v e nt 或 proc e ss D ia logK e y 如 果扩 展 了 基 类 的 控 件 试 图 超 越 它 们 进 行 特 殊 处 理 这 些 方 法 是 非 常 重 要
的
- 关 系 到 窗 口 处 理 消 息 和 线 程 启 动 的 方 法 这 些 方 法 对 于 编 制 过 W in 3 2
应 用 程 序 的 程 序 员 来 说 是 非 常 有 用 的 如 c re a te H a nd le
de s t ro y H a nd le g e t R ecrea t in g H an d le fro m H a n d le f rom C h ildH a n d le 都 涉 及 到 窗 口 句 柄 se n d M e s sa g e 和 re fle c t M e ssa g e 允 许 控 件 访 问 到 基本 的 窗 口 消 息 有 关 线 程 启 动 方 法 的 详 细 内 容 见 本 章 后 面 的 使 用W F C 和 Ja va
控 件 类 扩 展 c o m .m s . w fc .c ore . C o m pone nt 类 它 是 所 有 W F C 组 件 的 基 类
使 用 窗 体
窗 体 是 应 用 程 序 或 是 与 应 用 程 序 相 关 的 定 制 对 话 框 的 主 要 可 视 元 素
c o m .m s. w fc .u i . F o rm 类 是 在 W F C 中 提 供 窗 体 的 基 础
V isu a l J + + F o rm s D e sig n e r 启 动 时 带 有 V isu a l J + + 窗 体 模 板 它 提 供 类扩 展 c o m .m s. w fc .u i . F o rm 并 且 帮 助 用 户 在 窗 体 上 设 置 属 性 并 将 控 件添 加 到 窗 体 上 Fo rm 派 生 类 添 加 窗 体 中 没 有 找 到 的 m a in 方 法 当c o m .m s . w fc .a pp .A pp lic a tio n .ru n 方 法 从 主 方 法 中 调 用 并 传 递 新 的 基 于Fo rm 的 类 代 码 已 经 在 模 板 中 存 在 时 该 窗 体 运 行 更 多 信 息 见 本章 后 面 的 使 用 W F C 应 用 程 序 服 务 中 的 启 动 和 退 出 应 用 程 序 部分 基 于 Fo rm 的 类 作 为 一 个 模 态 对 话 框 来 使 用 可 以 通 过 调 用F o rm . sh o w D ia lo g 方 法 来 打 开 sh o wD ia lo g 也 运 行 基 于c o m .m s . w fc .u i . C o m m on- D ia log 框 类 的 模 态 对 话 框 基 于 窗 体 的 非 模
态 定 制 对 话 框 可 以 通 过 调 用 窗 体 的 显 示 方 法 来 打 开 该 方 法 使 得 窗 体 可见
Fo rm s 类 扩 展 c o m .m s. w fc .u i . C o n t ro l 所 以 它 具 有 所 有 的 C on tro l 方 法 加上 很 多 自 己 用 来 处 理 任 务 的 方 法 就 像 一 个 控 件 的 包 容 器 和 窗 口
这 些 包 含 的 方 法 用 来
-
添 加 和 删 除 用 于 激 活 关 闭 结 束 使 无 效 inpu t L a n g C ha ng e input L a n g C h a n g e - R e que s t M D IC h ild A c tiv a te m e n u C o m p le te m e nuS ta r t 和 ow ne dF orm 事 件 的 处 理 程 序
-
设 置 窗 体 的 窗 口 属 性 如 设 置 窗 体 的 初 始 大 小 或 可 视 状 态 开 始 位 置
和 边 界 样 式 或 者 用 来 检 测 窗 体 是 否 有 自 动 滚 动 条 控 制 框 或 最 小 化框 以 及 窗 体 图 标 是 否 在 任 务 栏 上
-
确
定 菜 单 控 件 或 其 他 放 在 窗 体 上 的 窗 体 的 关 系 如 设 置 主 菜 单 安排 控 件 支 持 多 文 档 界 面 M D I 窗 体 或 确 定 窗 体 是 否 接 收 所 有 的控 件 键 击 事 件
-
当
窗 体 作 为 模 态 对 话 框 使 用 时 设 置 属 性 并 且 当 窗 体 在 应 用 程 序 中时 运 行 和 检 索 对 话 框 中 的 结 果 它 包 括 的 方 法 用 来 设 置 对 话 框 上 的A ccep t C a n c e l 和 He lp 按 钮 启 动 对 话 框 和 设 置 并 检 索 由 模 态 对话 框 返 回 的 对 话 结 果 值
所 列 出 方 法 并 不 全 面 但 是 可 以 全 面 了 解 什 么 是 窗 体 的 概 念 在
c o m .m s. w fc .u i 软 件 包 中 的 其 他 类 扩 展 窗 体 并 且 它 是 U s e r C on tro l 类
U s e r C on tro l 是 用 来 创 建 自 己 复 合 的 基 于 Fo rm 的 控 件 用 户 可 以 将 其 安
装 到 工 具 箱 中
W F C 控 件 一 览
所 有 可 视 的 W F C 控 件 都 在 c o m .m s. w fc .u i 软 件 包 中 在 该 软 件 包 中 有 240 多 个 类 决 定 要 使 用 哪 个 类 是 很 困 难 的 幸 运 的 是 类 划 分 如 下 几 个 主要 的 分 类
-
在 V isu a l J + + 工 具 箱 中 并 且 直 接 扩 展 c o m . m s . w fc .u i C o n tro l 类 或 基 本上 源 于 C on tro l 类 的 是 控 件 的 类
-
在 V isu a l J + + 工 具 箱 中 并 且 使 用 C o m m o n D ia lo g 作 为 基 类 包 括
C o m m onD ia lo g 类 自 身 的 是 控 件 的 类 C o m m o n D ia lo g 打 包 W in 3 2 C o m m onD ia lo g A P I
-
包 含 控 件 使 用 的 常 数 值 的 类 这 些 类 都 扩 展 c o m . m s . w fc .c ore .E num
-
表 示 事 件 并 扩 展 co m .m s . w fc .c o re .E v en t 或 是 事 件 处 理 程 序 类 委 托的 类
-
表 示 内 置 W ind ow s 图 形 对 象 如 刷 子 位 图 颜 色 字 体 画 笔调 色 板 图 标 区 域 和 图 像 等 的 类 有 关 如 何 使 用 这 些 对 象 的 消 息见 下 一 部 分 访 问 图 形 服 务
-
像
C on tro l 一 样 扩 展 co m .m s . w fc .c o re .C o m p o n en t 但 是 不 需 要 C on tro l 的 可 视 运 行 时 间 开 销 的 类 例 如 C o lu m n H e ad er M e n u 和 扩 展 它 的M a in M e n u C o n tex t M en u 和 M e nu Ite m Re b a r B a n d S tatu s B a r P an el T oo l T ip 和 Im a g e L is t 和 扩 展 它 的 Im a g e L i stS tre a m e r
-
用 来 打 包 其 他 W ind ow s 接 口 的 混 合 类 这 些 类 包 括 打 包 W ind ow s H e lp
引 擎 的 He lp 打 包 浏 览 器 的 H T M L C on tro l 和 打 包 W ind ow s 消 息 框 的
M e ss a g e B o x 等 等
下 面 列 出 的 c o m .m s. w fc .u i 类 直 接 扩 展 C on tro l 在 说 明 中 列 出 了 扩 展 这些 类 的 控 件
类 |
说 明 |
|||
---|---|---|---|---|
An im a t io n |
封 装 W in d o w s |
动 画 控 件 |
是 |
用 于 播 放 A u d io - V id e o |
In te r le a v e d ( A V I) 动 画 文件 的 矩 形控 件
Ax H o s t 打包 Ac t iv e X 控件 并且 将该 控 件 作为 W F C 控件 公布
Bu tto n 封装 W in d o w s 按钮 控件
Ch e c k b o x 封 装 W in d o w s 复选 框 控 件 该 控 件 是 一 个 用 来 选 择 或 清除选 项 的 标识 选 中 和放 弃选 中 的 标 签 框
C o m b oB ox 封装 W in d o w s 组合 框控 件
D a ta T im e P ic k e r 封 装 W in d o w s 日期 和 时 间拾 取器 控 件 该 控 件 允 许 用 户指 定 日期 和 时 间消 息
Ed i t 封 装 W in d o w s 编辑 控 件 该 控 件 是 一 个 矩 形 控 件 用 户可 以 在其 中 输 入文 本
Fo rm 表 示 基本 的 顶 层窗 口
G ro upB o x 封装 组 框 控 件 该控 件 是 包 含 其他 控件 的 矩 形 框
La b e l 封 装 W in d o w s 标签 控 件 该 控 件 显 示 用 户 不 能 编 辑 的 文本串
L is tB o x 封 装 W in d o w s 列表 框 控 件 该 控 件 显 示 用 户 可 以 在 其 中
选 择 一 个 或 多 个 项 的 列 表 L is t Ite m 在 该 类 中 使 用
Ch e c k e d L is tB o x 控件 扩展 该 类
L is t V ie w 封 装 W in d o w s 列表 查 看 控件 该 控 件 显 示 一 个 项 目 集每 个 都由 一 个 图标 来 自 图像 列表 和一 个 标签组 成
M D IC lie n t 表示 包 含 M D I 子窗 口的 窗 口
M o n th C a le n d a r 封 装 W in d o w s 月历 控 件 该 控 件 提 供 一 个 简 单 的 月 历 界面 在其 中 用 户可 以选 择 日 期
Pa n e l 表 示 可 用 来 作 为 其 他 控 件 上 层 的 可 视 的 包 容 器 Ta b P a ge
类扩 展 Pa n e l
P ic tu re B o x 封 装 用来 包 含 位图 的 W in d ow s P ic tru e B ox 控件
P ro g re s s B a r 封装 W in d ow s P rog re ss B a r 控件 该 控 件 通 过 移 动 一 个 条来 动 态显 示 操 作的 进程
R a d ioB utto n 封 装 W in d o w s 单选 或 选 项 按 钮 控 件 该 控 件 显 示 可以 被 选择 和 清 除的 选项
Re b a r 封装 重 条 re b a r 控 件 该 控 件 在 可 移 动 可重 新 设 置大小 的 边界 情 况 下包 含其 他 控 件 该类 使用 Re b a r B a n d
R ic h E d i t 封装 W in d o w s R ic h E d it 控件
Sc ro llB a r 表 示 用于 滚 动 条控 件的 基 类 H S c ro llB a r 和 VS c ro llB a r 扩展 Sc ro llB a r
Sp li t te r 封装 拆分 条控 件 该 控 件 允 许用 户在 运行时 重新 设 置 停 靠控件 的 大 小
S ta tu s B a r 封装 W in d o w s 状态 栏控 件 该类 使用 S ta tus B a r P anel
Ta b B a s e 定义 包含 T a b 类控 件的 公用功 能的 基类 Ta b C o n tro l 使用 Ta b P a ge 和 Ta b S tr ip 使用 Ta b Ite m 扩 展该类
T oo lB a r 封装 T oo lB a r 定制 控件 该类 使 用 T o o lba r B u tto n
T rac k B ar 封 装 W in d o w s 轨迹 条 控 件 也就 是 滑 块 控 件 该 控 件包 含 一个 用 来 在范 围中 选 择 值的 滑块
T re e V ie w 封装 W in d o w s 树形 视图 控 件 该类 使 用 T re e N o d e Up D o w n 封 装 上下 箭 头 控件 有 些 情况 下称 为 微 调控 件
访 问 图 形 服 务
在 W F C 环 境 中 应 用 程 序 通 过 使 用 G ra ph ic s 对 象 执 行 图 形 操 作 这 些对 象 封 装 了 W ind ow s 操 作 系 统 本 身 的 绘 图 能 力 这 些 对 象 对 于 一 般 的绘 图 操 作 提 供 了 灵 活 的 支 持 包 括 显 示 图 像 和 图 标 还 有 画 线 画 多 边形 及 输 入 文 本 等
图 形 对 象 通 过 打 包 W ind ow s 设 备 上 下 文 来 执 行 它 的 工 作 W in d o w s 设备 上 下 文 是 定 义 系 统 图 形 对 象 关 联 的 属 性 以 及 影 响 设 备 输 出 的 图 形 模式 的 系 统 数 据 结 构 因 为 用 户 可 以 检 索 作 为 G ra ph ic s 对 象 基 础 的 设 备上 下 文 所 以 可 以 将 W in 3 2 绘 图 程 序 与 G ra ph ic s 对 象 合 作 使 用
所 有 扩 展 c on tro l 对 象 的 W F C 对 象 都 支 持 通 过 crea te G rap h ic s 方 法 创 建G ra ph ic s 对 象 另 外 所 有 扩 展 Im a g e 对 象 的 对 象 如 B itm a p Ic o n 和M e ta f i le 都 支 持 通 过 g e tG ra p h ic s 方 法 创 建 和 检 索 它 们 关 联 的 G ra ph ic s 对 象
有 关 如 何 使 用 对 象 的 消 息 见 本 书 第 15 章
动 态 HT M L 可 视 组 件
D yn a m ic H T M L 元 素 构 成 在 W F C 中 第 二 个 可 视 组 件 集 合 在c o m .m s. w fc .h tm l 中 的 该 控 件 基 于 D yn a m ic H T M L 对 象 模 型 在c o m .m s. w fc .h tm l 中 的 类 用 来 创 建 新 的 元 素 并 且 还 用 来 绑 定 到 在 HTM L 页 上 已 有 的 元 素 这 些 组 件 可 以 在 客 户 的 浏 览 器 或 是 服 务 器 上 创 建 和 操作 服 务 器 将 它 们 发 送 到 客 户 浏 览 器 该 对 象 模 型 存 在 于 几 个 平 台 上因 此 尽 管 用 户 界 面 看 起 来 有 些 相 似 这 是 因 为 按 钮 列 表 框 单 选 框等 等 标 准 设 置 在 两 端 都 预 先 发 送 了 但 从 根 本 上 来 说 该 对 象 模 型 并 非源 于 W in 3 2
W F C 控 件 的 这 两 种 设 置 W in 3 2 和 D y n a m ic H T M L 有 一 些 相 似 因为 它 们 最 终 都 是 源 于 c o m .m s . w fc .c ore . C o m pone nt 组 件 是 可 放 于 包 容 器中 的 元 素 并 且 支 持 Ic om pone nt 接 口 该 接 口 具 有 存 放 组 件 的 方 法 对 于 使 用 W F C 的 多 数 编 程 人 员 并 不 怎 么 关 心 组 件 与 包 容 器 是 如 何 关联 的 但 是 因 为 c o m .m s. w fc .h tm l 和 c o m .m s. w fc .u i 的 元 素 都 以 组 件 为基 础 它 们 的 特 性 也 类 似 例 如 使 用 ad d 方 法 将 所 有 组 件 添 加 到 它 们的 父 包 容 器 中
要 更 好 地 理 解 如 何 使 用 c o m .m s. w fc .h tm l 软 件 包 见 本 书 第 14 章
处 理 W F C 事 件
C on tro l 基 类 和 扩 展 它 的 类 如 按 钮 和 编 辑 框 会 遇 到 如 c lic k ke y P re ss
m ouse M ov e D ra g D ro p 和 其 他 标 准 的 W in d o w s 事 件 用 户 可 使 用 委 托在 应 用 程 序 中 操 纵 事 件 用 户 不 需 要 十 分 清 楚 地 理 解 委 托 就 可 以 在 应用 程 序 中 编 写 事 件 处 理 程 序 但 是 如 果 正 在 创 建 控 件 使 用 其 他 触 发事 件 的 应 用 程 序 或 者 使 用 带 有 W F C 组 件 的 线 程 时 理 解 如 何 创 建 和使 用 委 托 是 非 常 有 用 的 如 果 想 要 理 解 通 过 F o rm s D e sig n e r 创 建 Ja va 代 码 的 细 节 它 也 是 很 有 用 的 这 一 部 分 提 供 了 一 些 有 关 委 托 的 背 景 资料 然 后 介 绍 处 理 事 件 的 实 际 情 况
什 么 是 委 托 委 托 声 明 定 义 一 个 扩 展 c o m .m s. la n g . D e le g a te 的 类 JV C 编 译 器 也 将 委 托 d e le g a te 作 为 一 个 关 键 字 来 识 别 提 供 创 建 基 于 委托 的 类 的 快 捷 方 式 委 托 实 例 可 以 调 用 有 关 对 象 的 方 法 并 且 传 递 数 据到 该 方 法 更 重 要 的 是 委 托 与 它 引 用 的 对 象 隔 离 开 来 并 且 不 需 要 知道 有 关 它 的 任 何 事 情 那 么 对 于 匿 名 调 用 来 说 它 是 很 理 想 的 在 其 他 语 言 中 这 种 功 能 是 作 为 函 数 指 针 来 实 现 的 但 是 与 函 数 指 针 不同 的 是 委 托 是 面 向 对 象 的 类 型 安 全 的 和 可 靠 的
在 W F C 中 委 托 经 常 用 于 将 事 件 绑 定 到 处 理 程 序 方 法 如 将 按 钮 控 件上 的 单 击 事 件 绑 定 到 类 的 处 理 程 序 方 法 但 事 件 发 生 时 控 件 调 用 委 托传 递 给 它 一 些 事 件 消 息 委 托 依 次 调 用 已 注 册 的 处 理 程 序 方 法 并 且 将事 件 数 据 传 递 给 它 们 用 户 还 可 以 使 用 委 托 来 将 一 个 事 件 绑 定 到 多 个 方法 上 叫 做 m u l t ic a s t in g 当 事 件 发 生 时 列 表 中 的 每 个 委 托 按 着 它们 添 加 的 顺 序 被 调 用 反 过 来 说 不 同 事 件 的 委 托 也 可 以 分 配 给 同 一 个处 理 程 序 方 法 例 如 工 具 栏 按 钮 和 菜 单 项 都 可 以 调 用 同 一 个 处 理 程序
要 使 用 在 应 用 程 序 中 的 事 件 当 用 于 某 个 特 殊 控 件 的 事 件 发 生 时 用 户使 用 委 托 来 为 通 知 进 行 注 册 要 进 行 注 册 应 该 调 用 控 件 的A d d O n < ev en t> 方 法 这 里 的 <e v e n t> 是 所 要 处 理 的 事 件 名 称 例 如 要为 一 个 按 钮 的 单 击 事 件 注 册 应 该 调 用 该 按 钮 对 象 的 a ddO nC l ic k 方 法
a ddO n< e v e n t> 方 法 用 一 个 委 托 的 实 例 作 为 参 数 通 常 这 是 与 特 定 事 件数 据 相 关 联 的 现 有 W F C 委 托 在 a ddO n< e v e n t> 调 用 中 委 托 实 例 由 方法 的 引 用 来 创 建 该 方 法 就 是 要 绑 定 事 件 的 方 法 下 面 的 例 子 显 示 了 如何 将 事 件 处 理 程 序 b tnO K _ C l ic k 在 当 前 类 中 绑 定 到 名 为 b tnO K 的 按 钮 单 击 事 件 中
B u t to n b tnO K = ne w B u t ton ( ) ;
b tnO K . a ddO n M ouse C l ic k ( ne w E v e n t H a nd le r ( th is . b tn O K _C l ic k));
对 于 多 数 事 件 来 说 用 户 可 以 创 建 并 传 递 一 个 普 通 的 E v en t H an d le r 委 托的 实 例 该 委 托 将 传 递 一 个 普 通 的 ev e n t 对 象 但 是 当 某 些 事 件 包 括附 加 的 事 件 指 定 的 消 息 时 它 们 使 用 特 殊 的 事 件 处 理 程 序 类 例 如典 型 的 鼠 标 移 动 事 件 包 括 鼠 标 光 标 位 置 要 得 到 这 种 消 息 类 型 用 户 创建 一 个 M ous e E v e nt H a nd le r 类 的 实 例 该 类 传 递 一 个 M ous e E v e nt 对 象到 处 理 程 序 键 盘 事 件 需 要 K e yE ve n t H a n d le r 来 得 到 有 关 SH IF T 键 状 态的 消 息 等 等 该 处 理 程 序 传 递 一 个 K e yE ve n t 对 象
所 有 的 W F C 处 理 程 序 委 托 类 扩 展 c o m .m s. la n g . D e le g a te 它 们 中 的 大 多数 在 c o m .m s. w fc .u i 软 件 包 中 并 且 以 E v en t H an d le r 字 符 结 尾 所 有 的W F C 事 件 扩 展 co m .m s . w fc .c o re .E v en t 以 E v e n t 字 符 结 尾 并 且 可 以 在
c o m .m s. w fc .u i 软 件 包 中 找 到 它 们
提 示 在 Forms Desi gner 中 用 户 可 以 使 用 Properties 窗 口 中 的Events 视 图 来 绑 定 事 件 到 指 定 的 方 法 上 Forms Desi gner 然 后 为用 户 创 建 适 当 的 addOn<even t> 方 法 和 骨 架 处 理 程 序
当 委 托 调 用 处 理 程 序 时 它 传 递 两 个 参 数 第 一 个 参 数 是 引 起 该 事 件 的对 象 引 用 第 二 个 参 数 是 包 含 该 事 件 信 息 的 事 件 对 象 在 前 面 的 例 子 中该 委 托 的 处 理 程 序 看 起 来 应 该 如 下 所 示
priv a te v o id b tnO K _ C l ic k( O b je c t s ourc e , E v e n t e ) {
if ( S ource in s tan ceof b u t to n) {
S t r in g b u t tonN a m e = ( ( b u t to n) so ur ce).g e t T ex t ( ) ;
M es s a ge B o x .s h o w ( " Y o u c li c ked b u t to n " + bu t to n N a m e;
}
}
如 果 使 用 常 规 E v en t H an d le r 类 来 绑 定 到 方 法 中 应 用 程 序 中 的 E v e n t 对象 将 不 包 含 任 何 重 要 的 消 息 但 是 事 件 可 用 额 外 的 信 息 用 户 可 以 从具 体 的 事 件 对 象 中 将 其 抽 取 出 来 下 面 列 出 的 是 用 于 鼠 标 移 动 事 件 的 委托 和 处 理 程 序 的 代 码 M ous e E v e nt 对 象 公 布 了 允 许 用 户 得 到 鼠 标 位 置的 属 性
// T h is is th e re q u e s t fo r n o t if ic a tio n
B u t ton b tnT es t = n e w B u t ton();
/ / N o te th at th e ad dO n < ev en t> m e th od uses th e M o us e E vent H a nd ler clas s
b tnT es t .addO nM ou s e M o v e( n e w M ous e E v ent H a nd ler( th is .b tn T est M ouse M ov e));
// T h is is th e ha nd le r fo r th e m ous e m o v e m e nt e v e n t
p r iv a te v o id b tn T es t M o u s eM o v e( O b je ct s o u r c e , M o u s e E v en t e) { ed it 1 .s e t T ex t ( e.x + , + e. y);
}
如 果 想 要 为 用 于 同 样 控 件 的 多 控 件 或 多 事 件 来 处 理 事 件 需 要 为 每 一 个控 件 / 事 件 的 组 合 请 求 一 个 单 独 的 通 知 多 个 通 知 可 以 指 定 同 一 处 理 程序 例 如 工 具 栏 上 的 所 有 按 钮 为 它 们 的 单 击 事 件 可 能 调 用 同 一 个 处 理程 序 用 户 可 以 使 用 源 对 象 传 递 到 事 件 处 理 程 序 来 得 到 单 击 了 哪 个 按钮 的 详 细 情 况 通 常 用 户 将 传 递 到 处 理 程 序 中 的 对 象 放 入 适 当 的 类 中以 便 能 够 从 适 当 的 类 中 调 用 方 法
下 面 的 例 子 显 示 了 为 工 具 栏 定 义 按 钮 为 它 们 的 单 击 事 件 请 求 通 知 以及 处 理 方 法 的 代 码
p r iv a te v o id in i t E v en t H a n d lers() {
B u t ton b u t tonN ew = n e w B u t to n(); B u t ton b u t tonS av e = n e w B u t ton(); B u t ton b u t tonE x it = n e w B u t to n();
// A ll e v e n t s a re r o u t ed to th e s a m e h a n d ler
b u t to nN e w .a dd O n C lic k( n e w M o u s e E v e nt H a n d ler( th is .too lb a r C li c k ) ) ; b u t to n S av e.ad dO nC l ick ( n e w M o useE v e nt H a n d ler( th is .too lb ar C lic k) ) ;
b u tto n E x it.a d d O n C lic k ( n e w M o u s e E v en t H a n d ler( th is .to o lb a r C lick ) ;
}
/ / co m m o n ev e n t h a n d ler
p r iv a te v o id to o lb a rC l ick ( O b je ct s o u r c e , E v en t e){ S t r ing b u t to n N a m e ;
if ( s o u r c e in s ta n c eo f B u t to n ) {
b u t ton na m e = n e w S t r ing(( B u t to n ) sou r ce).g e t T ex t ( ) ) ;
M es s a ge B o x .s how ( " Y o u c li c ked b u t to n " + bu t to n N a m e);
}
}
本 机 化 应 用 程 序
W F C 和 V isu a l J + + D e sig n e r 为 开 发 使 用 多 种 语 言 的 应 用 程 序 提 供 了 简便 的 方 法 W F C 应 用 程 序 能 够 以 几 种 本 地 化 语 言 版 本 创 建 版 本 之 间的 唯 一 不 同 是 一 个 二 进 制 资 源 文 件 每 个 资 源 文 件 的 命 名 约 定 都 指 出 它所 支 持 的 语 言 并 且 根 据 用 户 的 本 地 化 设 置 可 以 加 载 正 确 的 资 源理 解 本 地 化 概 念 有 两 部 分 设 计 时 实 现 和 运 行 时 支 持 V isu a l J + + 要 进行 本 地 化 就 要 识 别 可 视 元 素 窗 体 和 控 件 的 某 些 属 性 在 设 计 时
V isu a l J + + 用 来 将 这 些 本 地 化 属 性 放 入 一 个 二 进 制 资 源 文 件 中 例 如控 件 的 文 本 字 体 和 大 小 可 以 在 两 种 语 言 版 本 中 改 变 在 运 行 时 当 加载 应 用 程 序 时 系 统 在 确 定 用 户 的 位 置 时 加 载 与 客 户 线 程 对 应 的 资 源
要 创 建 应 用 程 序 的 本 地 化 版 本 使 用 V isu a l J + + 来 设 计 可 视 布 局 并 将窗 体 的 本 地 化 属 性 设 置 为 真 然 后 保 存 该 窗 体 V isu a l J + + 自 动 创 建 一个 二 进 制 资 源 文 件 并 将 所 有 的 本 地 化 属 性 与 它 关 联 起 来
当 窗 体 的 本 地 化 属 性 设 置 为 真 时 V isu a l J + + 总 是 将 资 源 保 存 到 名 为fo rm .re s o u rc e s 的 单 一 资 源 文 件 中 这 里 的 fo rm 是 主 窗 体 的 名 称 例 如F o rm 1 .re s ourc e s 所 创 建 的 每 个 版 本 都 将 保 存 到 该 资 源 文 件 名 当 创建 每 个 新 版 本 之 后 用 户 使 用 W ind ow s E xp lore r 或 M S - D O S 命 令 将 该资 源 文 件 复 制 一 份 并 且 将 其 名 称 重 命 名 为 带 有 标 准 W ind ow s 本 地 后缀 的 适 当 的 本 地 语 言 名 例 如 对 于 日 本 版 本 来 说 是F o m r 1_ jpn_ jpn .re s ourc e s 第 一 个 本 地 后 缀 指 定 了 主 要 的 语 言 第 二个 后 缀 指 定 了 次 要 的 语 言
重 点 在 布 局 并 保 存 任 何 本 地 化 版 本 之 前 一 定 要 使 用 新 名 保 存 原始 布 局 这 将 是 用 户 的 主 .resources 文 件
例 如 假 定 用 户 想 要 为 主 窗 体 名 为 Z ippo .ja v a 的 应 用 程 序 创 建 美 国 英 语 法 语 和 日 语 版 本 还 假 定 用 户 使 用 英 语 版 本 开 始 尽 管 这 不 是 必 须 的 首 先 按 英 语 布 局 窗 体 并 将 本 地 化 属 性 设 置 为 真 当 保 存 该 窗 体 时
便 创 建 了 文 件 Z ippo .re sourc e 现 在 使 用 W ind ow s E xp lore r 或 M D - D O S 命 令 复 制 Z ippo .re sourc e 并 将 复 制 的 文 件 重 命 名 为Z ippo_e nu_e nu .re sourc e s en u 是 用 于 美 国 英 语 的 本 地 后 缀 它 是 按 照 主要 的 和 次 要 的 语 言 指 定 的
接 下 来 在 V isu a l J + + D e s ig n e r 中 改 变 默 认 的 语 言 为 法 语 并 且 在 法
语 中 使 用 属 性 本 地 化 来 布 局 控 件 当 结 束 时 再 次 保 存 窗 体 覆 盖 z ippo .re souc e s 的 以 前 版 本 再 次 复 制 Z ippo .re sourc e s 并 且 将 其 改 名 为Z ippo _fra _fra . re sourc e s
要 测 试 这 些 版 本 在 C on tro l P a ne l 控 制 面 板 中 的 R e g io n a l S e ttin g s
区 域 设 置 对 话 框 中 此 时 选 择 区 域 为 F ren ch ( S ta n d a rd ) 不 需 要 重新 启 动 计 算 机 区 域 将 在 本 地 线 程 上 改 变
使 用 W F C 应 用 程 序 服 务
c o m .m s. w fc .a p p 软 件 包 包 含 了 许 多 提 供 W F C 应 用 程 序 服 务 的 类 这 些操 作 的 大 多 数 属 于 A p p lic a tio n 对 象 自 身 这 些 操 作 主 要 用 来 创 建 线 程启 动 应 用 程 序 处 理 应 用 程 序 事 件 等 等 因 为 理 解 Ja va 线 程 是 很 重 要的 所 以 在 本 章 后 面 的 用 W F C 使 用 Ja va 线 程 一 节 中 将 专 门 讨 论这 一 点
作 为 应 用 程 序 服 务 限 定 的 其 他 操 作 与 W in 3 2 操 作 系 统 提 供 的 操 作 相 关这 些 操 作 包 括 在 其 他 操 作 之 间 访 问 W ind ow s 注 册 表 访 问 剪 贴 板 数 据和 检 索 系 统 消 息 等
启 动 和 退 出 应 用 程 序
A p p lic a tio n .ru n 方 法 启 动 W F C 应 用 程 序 它 通 常 放 在 基 于 窗 体 的 类 的主 方 法 中 该 方 法 用 来 构 造 主 应 用 程 序 窗 体 A p p lic a tio n .ru n 具 有 不 带
参 数 或 带 有 一 个 参 数 的 重 载 方 法 这 一 个 参 数 指 定 表 示 应 用 程 序 主 窗 口的 窗 体 类 例 如 下 面 就 是 该 调 用 的 一 个 典 型 窗 体
p u b lic s ta tic v o id m a in ( S trin g a rg s [ ] )
{
A p p lica t io n .r u n ( n e w M y M a in W in d o w ());
}
如 果 窗 体 传 递 到 运 行 方 法 中 窗 体 的 可 视 属 性 自 动 设 置 为 真 并 且onC lo se d 事 件 处 理 程 序 添 加 到 该 窗 体 中 当 窗 体 关 闭 时 onC lo se d 事 件处 理 程 序 调 用 a pp lic a t ion .e x i tT h re a d 方 法 如 果 没 有 传 递 窗 体 则 应 用程 序 会 一 直 运 行 直 到 调 用 A p p lic a tio n .e x it 关 闭 应 用 程 序 上 的 所 有 线程 和 窗 口 或 运 行 到 调 用 ex i t T h re a d 只 关 闭 应 用 程 序 的 当 前 线 程
处 理 应 用 程 序 事 件
用 户 使 用 A p p lic a tio n 对 象 为 5 个 不 同 的 事 件 指 定 事 件 处 理 程 序 这 5
个 事 件 在 应 用 程 序 的 上 下 文 中 发 生 它 们 是 a pp lic a t io n E x it id le
se ttin g C h a n g e s y s te m S hu tdow n 和 th re a d E x c e p tio n 可 以 调 用 下 面 的
a ddO n 方 法 来 为 这 些 事 件 定 义 事 件 处 理 程 序
应 用 程序 方法 说 明
a d d O n A p p lic a tio n E x it 指 定 当 应 用 程 序 退 出 时 调 用 的 处 理 程 序 用 户 可 以
在 这 里清 除 不 会由 垃圾 收 集 释放 的应 用程 序 资 源 要
强 制 应 用 程 序 不 退 出 需 为 窗 体 的 关 闭 事 件 指 定 一个处 理 程 序
a d dO n Id le 指 定 当 应 用 程 序 的 消 息 队 列 空 闲 时 调 用 的 处 理 程序 例如 执行 后 台 操作 或应 用 程 序 清 除
a d dO n S e t ting c h a n ge 指 定 当用 户 改 变窗 口设 置 时 调用 的处 理程 序
a d dO n S y s te m S h u td ow n 指 定 用 户 启 动 系 统 关 闭 之 前 立 即 调 用 的 处 理 程 序
这 提 供了 一 个 保存 数据 的 时 机
a d dO n T h re a d E x c e p t io n 指 定 当已 经 废 弃未 捕获 的 Ja v a 异常 时调 用 的 处理 程
序 允 许 应 用 程 序 完 美 地 处 理 该 异 常 该 事 件 处 理程 序 获 取 c o m .m s .w fc .a pp .T h re a dE x c e p t io n E v e n t 对象 该对 象 中 有一 个用 来 表 示废 弃该 异常 的 字 段
所 有 这 些 a ddO n 方 法 都 有 一 个 相 对 的 re m o v e O n 方 法 用 来 删 除该 事 件 处 理 程 序
访 问 系 统 信 息
W in 3 2 系 统 包 含 了 大 量 的 可 以 被 W F C 应 用 程 序 和 组 件 访 问 的 信 息 这些 访 问 多 数 是 通 过 在 c o m .m s. w fc .a p p 软 件 包 中 的 类 进 行 的 这 些 消 息 多数 存 储 在 W ind ow s 的 注 册 表 中 并 且 通 过 Re g is t r y K e y 和 Re g is t r y 类 来访 问 其 他 系 统 消 息 如 W ind ow s 显 示 元 素 的 大 小 操 作 系 统 设 置网 络 可 用 性 和 硬 件 性 能 等 使 用 c o m .m s. w fc .a p p . S y s te m In fo m a t io n 类 中的 静 态 方 法 来 访 问 使 用 c o m .m s. w fc .a p p . T im e 类 可 以 利 用 系 统 时 间
这 一 部 分 概 括 了 W F C 应 用 程 序 访 问 系 统 信 息 的 方 式
W in dow s 注 册 表 信 息
c o m .m s. w fc .a p p 软 件 包 中 的 R e g is t ry K e y 类 包 含 访 问 W indow s 系 统 注 册表 的 方 法 使 用 在 该 类 中 的 方 法 来 创 建 并 删 除 子 键 获 得 当 前 键 的 子 键数 量 和 名 称 以 及 检 索 设 置 和 删 除 分 配 到 子 键 的 值
c o m .m s. w fc .a p p . R e g is try 类 包 含 容 纳 表 示 注 册 表 根 键 的 Re g is t r y K e y 对 象的 字 段 以 HK EY _ 起 始 根 R e g is t ry K e y 对 象 还 可 以 使 用 ge t B a s e K e y 方 法 例 示 方 法 可 以 在 任 何 R e g is t r y K e y 对 象 上 调 用 用 来 列 举 和 操 作在 根 对 象 下 面 的 子 键 树 中 的 键 和 键 值 例 如 下 面 的 代 码 得 到 一 个 在HK EY _ C UR RE N T _ U S E R 键 下 的 su b K e y 名 数 组 和 数 组 中 的 名 称 号
in t subK e y C oun t;
S trin g [ ] s u b K e y N a m es ;
S u b K e y Na m es = R eg is t ry .C URR E NT_ U S E R . g e t S u b K ey N a m es ( ) ;
S u b K e y C ount = R e g is t r y .C U R R E N T _U S E R . g e t S ub K e y C oun t();
同 样 可 以 检 索 任 何 子 键 或 设 置 给 予 它 的 路 径 和 子 键 值 名 并 且 可 以检 索 数 据 或 设 置 给 予 它 的 值 名 下 面 的 例 子 显 示 了 检 索 V isu a l S tud io 中最 近 使 用 的 文 件 名 并 在 一 个 编 辑 框 中 显 示 它 们
S t r in g p a th ; // H o ld s th e p a th n a m e .
S trin g [ ] v a lu e N a m es ; / / H o ld s a rra y o f M R U file n a m es in th e k e y .
in t va lu e C ou n t ; / / T h e n u m b er of M R U f i le na m es in valu eN a m es .
pa th = ne w S t r ing (" S o f t w a re\\M icr osoft\\ V is ua lS tu d io \\6 .0 \\F ile M R U L is t" ); R eg is t r y K e y sub K ey = registry.C U R R E N T _ U S E R .g e t S ub K e y( p a th ) ;
// G e t th e file n a m es a n d th e n u m b er o f f ile n a m es . valu eN a m es = sub K ey. g e t V a lu eN a m es ( ) ;
valu e C ou n t = sub K ey. g e t V a lu e C o unt(); if ( v a lue C o un t > 0 )
fo r ( in t I = 0 ; I < v a lu e C o u n t ; ++ i){
// G e t th e v a lu e , w h ich is th e a ctu a l f i le n a m e .
S t r in g v a lu e = n e w S trin g ( ( S t r in g ) s u b K e y . g et V a lu e(v a lu eN a m es [i]));
// C o n ca te n a te th e n a m e( " 1 " , " 2 " , e tc .) w ith th e f il e n a m e v a lu e . Strin g v a lS t r in g = ne w String ( v a lue N a m es [ i] + " " + v a lu e);
// A d d th is to th e e d it b o x .
e d it 1 .s etT ex t ( e d it 1 .g etT ex t()+ v a lS trin g + " \r \n " ) ;
}
用 户 还 可 以 使 用 crea te S u b K e y 方 法 创 建 新 键 并 使 用 Se t V a lu e 方 法 在这 些 键 中 设 置 值
位 置 信 息
位 置 信 息 提 供 了 在 用 户 的 计 算 机 上 设 置 的 语 言 和 区 域 设 置 的 详 细 资 料系 统 中 存 储 有 许 多 有 关 语 言 和 区 域 的 特 性 包 括 字 符 集 国 际 电 话 代 码
货 币 信 息 如 何 显 示 使 用 哪 种 日 历 度 量 系 统 等 等
这 些 信 息 一 般 使 用 在 C on tro l P a ne l 中 的 R e gio n a l S e t tin gs 对 话 框 来 设置 但 也 可 以 利 用 程 序 来 设 置 在 W F C 中 提 供 这 种 访 问 的 有
co m .m s . w fc .a p p . L o cale 类 中 的 方 法 以 及 与 Loc a le 方 法 相 关 的 包 含 字 段常 量 的 许 多 Loc a l 子 类 有 关 设 置 和 检 索 这 些 信 息 的 细 节 见 Loc a le 类中 的 方 法
时 间 信 息
时 间 是 另 外 的 一 种 系 统 信 息 c o m .m s. w fc .a p p . T im e 类 提 供 了 一 个 具 有许 多 功 能 的 T im e 对 象 包 括 捕 获 系 统 时 间 默 认 的 构 造 器 使 用 系 统 日期 和 时 间 创 建 一 个 T im e 对 象 除 了 检 索 系 统 时 间 之 外 T im e 对 象 可 以做 许 多 其 他 事 情 如 比 较 D a te 和 T im e 对 象 将 时 间 转 换 为 各 种 格 式以 及 为 以 后 的 检 索 来 存 储 T im e 对 象 等
T im e 对 象 一 旦 创 建 就 不 能 改 变 但 是 T im e 类 提 供 了 许 多 方 法 以 使用 偏 移 时 间 来 创 建 新 对 象 如 A d d S e c onds a ddM inu te s a ddH ours
a ddD a ys 和 ad d Y ears 还 有 许 多 用 来 检 索 某 种 T im e 对 象 属 性 的 方 法如 秒 分 钟 小 时 和 天 等 等
在 W F C 中 T im e 对 象 从 公 元 100 年 1 月 1 日 开 始 以 千 万 分 之 一 秒 为单 位 来 存 储 时 间 可 以 存 储 的 最 大 值 为 公 元 10000 年 12 月 31 日 转 换W F C T im e 对 象 到 其 他 格 式 如 S tr in g s V a r ia n ts S Y S TEM T IM E 等 可 能 导 致 精 度 的 丢 失 并 且 不 是 所 有 的 格 式 都 可 以 存 储 这 么 大 范 围 的值
不 要 将 T im e 类 与 其 他 调 用 T im e r 的 c o m .m s. w fc .a p p 类 混 为 一 谈 T im e r 实 际 上 是 一 个 控 件 它 不 在 c o m .m s. w fc .u i 软 件 包 中 的 原 因 是 它 没 有 用户 界 面
执 行 剪 贴 板 和 拖 放 操 作
在 W F C 中 拖 放 操 作 是 基 于 W in 3 2 O L E 模 型 的 这 种 模 型 实 现 用于 复 制 或 粘 贴 数 据 的 快 捷 方 式 当 使 用 剪 贴 板 时 必 须 执 行 几 个 步 骤选 择 数 据 从 上 下 文 菜 单 中 选 择 Cu t 或 Co p y 移 动 到 目 标 文 件 窗 口或 应 用 程 序 中 然 后 从 上 下 文 菜 单 中 选 择 Pa s te 数 据 的 来 源 称 为 源而 目 的 地 称 为 目 标
拖 放 特 性 不 使 用 上 下 文 菜 单 它 按 下 鼠 标 左 键 来 捕 获 在 源 中 选 中 的 数据 然 后 在 目 标 中 放 开 鼠 标 按 钮 将 其 放 入 拖 放 操 作 可 以 传 输 任 何 能 放置 到 剪 贴 板 中 的 数 据 因 此 用 于 拖 放 数 据 的 格 式 与 它 们 放 入 到 剪 贴 板时 的 数 据 格 式 相 同 例 如 数 据 格 式 指 定 这 些 数 据 是 否 为 文 本 位 图
HTM L .w a v 等 等 c o m .m s. w fc .a p p . D a ta F o rm a ts 类 包 含 适 合 于 每 个 剪贴 板 格 式 的 字 段 这 些 字 段 名 如 C F _ TEX T 直 接 来 源 于 W in 3 2 常 量名
剪 贴 板 或 拖 放 操 作 的 数 据 存 储 在 c o m .m s. w fc .a p p 中 名 为 D a ta O b je c t 的类 中 该 类 实 现 ID ataO b je c t 接 口 ID ataO b je c e 为 设 置 和 检 索 数 据 在数 据 对 象 中 得 到 数 据 格 式 的 列 表 和 查 询 已 有 的 特 殊 数 据 格 式 定 义 方 法要 使 程 序 实 现 将 数 据 放 入 剪 贴 板 或 从 剪 贴 板 中 检 索 数 据 的 操 作 需 使 用 c o m .m s . w fc .a pp .C lipboa rd 中 的 静 态 方 法 C lip b o a rd . se t D a taO b ject 从 剪
贴 板 中 返 回 ID ataO b je c t 目 标 位 置 必 须 确 保 可 以 使 用 在 剪 贴 板 中 数 据的 格 式 要 做 到 这 一 点 它 应 该 使 用 ID ataO b je c t .g e t D ata P re se n t 方 法 查询 数 据 对 象 传 递 可 以 接 受 的 数 据 格 式 如 果 数 据 类 型 可 以 接 受 则g e t D a taP re se n t 返 回 真
实 现 放 入 源
对 于 任 何 W F C 控 件 组 件 基 于 c o m .m s. w fc .u i . C o n t ro l 调 用C on tro l .doD ra g D ro p 方 法 来 开 始 该 操 作 这 些 是 响 应 用 户 按 下 左 键 移 动鼠 标 的 典 型 操 作 因 此 代 码 放 置 到 m ouse M ov e 事 件 处 理 程 序 中 该程 序 检 查 M ous e E v e nt 对 象 查 看 鼠 标 左 键 是 否 被 按 下 指 示 拖 动 操 作 的开 始 例 如 下 面 是 一 个 用 于 包 含 文 件 名 的 列 表 框 控 件 的 事 件 处 理 程 序
priv a te v o id l is t F i le s_ m ouse M ov e ( O b je c t s ourc e , M ouse E v e nt e )
{
/ / if th e left b u t to n is d o w n , d o th e d ra g / d ro p
if( this .g e t M o u se B u t tons()= = M o u s eB utto n. L E F T )
{
S trin g d a ta = (s tr in g ) l is t F iles .g etS e le c te d Ite m ();
lis t F iles .d o D ra g D r o p ( d a ta , D ra g D r o p E f f e c t.A L L ) ;
}
}
doD ra g D ro p 方 法 带 有 要 转 换 的 数 据 和 co m .m s . w fc .u i . D rag D ro p E f fect 对象 对 于 拖 放 操 作 的 模 式 D rag D ro p E f fect 类 包 含 下 面 使 用 位 运 算 符 OR
组 合 的 常 量
D r agD r o p E ffe c t 方法 说明
CO P Y 指 定 在传 递 之 后数 据将 不 从 源中 删除
M O V E 指 定 在传 递 之 后数 据将 从 源 中删 除
SC R O L L 指 定 在传 递 之 后数 据在 目 标 中滚 动
AL L 指定 在传 递之 后数据 将 从 源 中 删 除 并且 在 目 标中滚动 从 本 质上 来说 是 CO P Y |M O V E |S C RO L L
NONE 指 定 没有 执 行 操作
在 拖 放 操 作 中 接 收 数 据 的 目 标 检 索 包 含 D rag D ro p E f fect 对 象 的 dra g D rop
事 件 所 以 它 可 以 很 容 易 地 确 定 该 操 作 的 目 的
实 现 放 入 目 标
拖 放 操 作 的 放 入 部 分 作 为 事 件 处 理 C on tro l 类 为 拖 放 事 件 dra g D rop dra g E n te r dra g L e a v e 和 d rag O v er 提 供 事 件 处 理 程 序 的 基 础 可 以 使用 下 面 的 方 法 来 指 定 这 些 事 件 的 处 理 程 序
C o n tr o l 方法 |
说明 |
|
---|---|---|
a d d O n D ra g D ro p |
为 拖 入 控 件或 窗 口 的数 据 指 定一 个 处 理程 序放开 时 |
当鼠 标 左 键 |
a d dO n D ra g E n te r 当 光 标第 一 次 进入 窗口 时 为 放入 数据 指定 一 个处理 程序
add O n D ra gL e a v e 当 光 标离 开 窗 口时 为放 入 数 据指 定一 个处 理 程 序
add O n D ra gO ve r 当 光 标拖 过 窗 口时 为放 入 数 据指 定一 个处 理 程 序
所 有 这 些 a ddO n 方 法 都 有 与 之 相 对 的 re m o v e O n 方 法 用 来 删 除该 事 件 处 理 程 序 当 在 W F C 中 使 用 所 有 的 事 件 处 理 程 序 a ddO n 和re m o v e O n 时 这 些 方 法 获 取 一 个 用 处 理 程 序 方 法 的 名 称 创 建 的 委 托 在此 情 况 中 为 D rag E v en t H a n d ler 例 如 下 面 的 一 行 添 加 tx t F i le _dra g D rop 方 法 作 为 一 个 dra g D rop 事 件 处 理 程 序
tx t F i le .a ddO nD ra g D rop( ne w D ra g E v e n t H a nd le r ( th is .tx t F i le _dra g D rop));
对 于 所 有 的 拖 放 事 件 dra g D rop 事 件 是 最 常 处 理 的 不 管 处 理 这 些 事 件中 的 哪 个 处 理 程 序 中 的 代 码 必 须 至 少 做 三 件 事 首 先 它 必 须 确 定 是否 可 以 接 收 这 个 数 据 格 式 如 果 可 以 它 必 须 复 制 数 据 并 且 可 以 选 择显 示 它 或 者 提 供 一 些 用 户 界 面 的 反 馈 表 示 数 据 已 经 放 入
所 有 数 据 和 信 息 都 传 递 到 D rag E v en t 事 件 中 这 包 含 了 一 个 数 据 字 段 和一 个 效 果 字 段 D rag E v en t . d a ta 字 段 包 含 一 个 支 持 ID ataO b je c t 的 对 象 该 对 象 中 有 用 来 检 索 数 据 和 数 据 格 式 及 用 来 查 询 特 殊 格 式 存 在 的 方 法因 此 处 理 程 序 必 须 首 先 以 它 将 接 受 的 格 式 调 用D rag E v en t . d a ta . g e t D a ta P resen t 方 法 然 后 确 定 是 否 它 带 有 数 据 类 型 如果 有 它 可 以 随 后 调 用 D rag E v en t . d a ta . g e t D a ta 方 法 传 递 到 该 数 据 类型 并 且 检 索 数 据 数 据 如 何 显 示 取 决 于 该 控 件 下 面 的 例 子 说 明 了 一个 编 辑 控 件 dra g D rop 事 件 处 理 程 序 来 显 示 放 入 其 中 的 文 本 数 据
P r iv ate v o id tx t F i le_ d rag D ro p ( O b je ct s o u rce , D rag E v en t e)
{
/ / If t ex t is in th e o b je ct, w r it e it in to th e ed it co n t ro l.
if (e.d ata. g e t D ataP res ent( D ataF o r m a ts .C F _ T E X T ) )
{
S t r ing file n a m e= ( S t r ing ) e . d ata.g e t D ata( D a ta F o rm ats .C F _ T E X T ) ; tx t F ile.s e t T ex t ( f ile n a m e);
}
}
使 用 具 有 W F C 的 Java 线 程
Ja va 是 一 个 自 由 线 程 的 环 境 这 也 就 意 味 着 任 何 对 象 在 任 何 时 间 及 任 何线 程 中 都 可 以 调 用 任 何 其 他 对 象 在 编 写 对 象 时 一 定 要 注 意 这 些 方 法是 不 可 分 的 a to m ic 而 且 是 线 程 安 全 的
有 几 种 类 从 自 由 线 程 中 可 以 得 到 好 处 并 且 W F C 提 供 了 锁 定 代 码 来 使得 这 些 对 象 具 有 线 程 安 全 性 这 些 类 如 下 所 示
-
c o m .m s . w fc .c ore . C o m pone nt
-
co m .m s . w fc .c o re .C o n tain e r
-
c o m .m s . w fc .C o m pone n t M a na g e r
-
co m .w fc . u i .B ru sh
-
c o m .w fc . u i .F ont
-
co m .w fc . u i .P en
另 一 方 面 任 何 源 于 c o m . m s . w fc .u i . C o n tro l 的 对 象 都 是 公 寓 式 线 程
ap artm en t -th read e d 因 为 W in 3 2 窗 口 依 赖 于 每 个 控 件 加 之 在c o m .m s. w fc .u i 软 件 包 中 的 多 数 控 件 是 非 同 步 的 所 以 它 们 也 可 以 视为 公 寓 式 线 程 同 样 c o m .m s. w fc .io co m . m s . w fc .h tm l 和 c o m .m s. w fc .u t i l 软 件 包 也 不 是 线 程 安 全 的
混 合 Ja v a 和 W in 3 2 线 程 模 型
W F C 从 Ja va 对 象 中 访 问 本 机 W in 3 2 结 构 如 窗 口 W in 3 2 窗 口 管 理器 是 公 寓 式 线 程 并 且 W ind ow s 根 据 需 要 自 动 从 一 个 线 程 到 另 外 一 个线 程 进 行 调 度 当 一 个 自 由 线 程 对 象 调 用 到 一 个 公 寓 式 线 程 对 象 中 时 该 调 用 必 须 调 度 到 该 对 象 的 公 寓 中 这 就 是 说 当 公 寓 式 线 程 处 理 该 请求 时 该 自 由 线 程 在 一 段 时 间 中 被 阻 塞 所 有 从 自 由 线 程 对 象 到 公 寓 的调 用 均 将 阻 塞 直 到 公 寓 调 用 释 放 为 止 因 此 这 样 就 会 导 致 死 锁
那 么 具 有 自 由 线 程 的 Ja va 对 象 应 该 使 用 W F C 控 件 吗 当 线 程 转 换 发生 时 不 是 将 其 隐 藏 起 来 W F C 认 为 请 求 该 转 换 是 程 序 员 的 责 任 程序 员 可 以 设 计 一 个 阻 止 死 锁 的 方 法 通 过 在 控 件 线 程 上 调 用 一 个 委 托委 托 再 依 次 调 用 其 中 指 定 的 方 法 就 可 以 解 决 这 个 问 题
要 在 创 建 控 件 窗 口 句 柄 和 包 含 信 息 循 环 的 线 程 上 执 行 给 出 的 委 托 从 要求 的 控 件 中 使 用 C on tro l .in v oke 或 c on tro l .in v oke A s y n c 方 法 使 用 控 件自 己 的 线 程 是 很 重 要 的 以 防 止 万 一 该 控 件 因 为 各 种 原 因 要 重 建 它 的 窗口 句 柄 in v oke A s y n c 方 法 导 致 线 程 来 调 用 回 调 方 法 而 不 等 待 回 应 在这 两 种 情 况 下 调 用 线 程 上 的 所 有 异 常 都 传 递 到 自 己 的 控 件 上
创 建 和 退 出 线 程
自 由 线 程 可 以 使 用 实 现 ja v a . la n g . R unna b le 接 口 的 标 准 Ja v a 方 法 来 创 建本 例 显 示 了 实 现 R unna b le 和 获 取 两 个 控 件 跟 踪 条 和 标 签 作 为 参 数到 它 的 构 造 器 的 类 从 线 程 的 运 行 方 法 中 它 通 过 调 用 跟 踪 条 的in v oke A s y n c 方 法 来 转 换 到 跟 踪 条 线 程 In v oke A s y n c 传 递 t D ele g ate 委托 一 个 c o m .m s . a p p .M e thod Inv oke r 的 实 例 指 定 名 为 tC a llB a c k 的 回调 方 法 在 该 方 法 内 控 件 的 线 程 可 以 安 全 地 操 作 控 件 的 属 性 此 时 是改 变 跟 踪 条 的 记 号 样 式 这 将 导 致 重 新 创 建 任 务 栏 窗 口 句 柄 如 果 线 程在 这 里 没 有 按 演 示 的 那 样 转 换 跟 踪 条 将 在 新 的 线 程 上 重 新 创 建 而 不是 包 含 信 息 循 环 的 线 程 在 此 时 控 件 跟 踪 条 将 接 收 任 何 新 消 息 并 且不 能 响 应
im port c o m . m s . w fc .a pp .* ;
im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u i.* ;
/* *
-
R u n n a b le is th e in t erfa c e y o u n e e d to im p le m en t to m a k e a n e w
-
ja v a th r ea d
*/
p u b lic c lass R u n n ab le C lass im p lem ents R u n n ab le
{
f in a l in t S L E E P = 5 0 0 ;
La b e l l;
T rack B ar tb ;
/* *
* T h is is th e th r ea d fo r o u r c la s s .
*/
T h read th r ead;
/* *
-
M a k es a sp ecia l d e legat e so W F C ca n ca l l it f ro m th e co ntro l’ s
-
th r ea d .
*/
M e th o d In v o k er t D eleg at e = n e w M e th o d In vo k er( t C allb ack);
/* *
-
M a ke a n e w J a v a th r ea d ; te ll it to b eg in r u nn in g v ia th e
-
s ta rt() m eth o d .
*/
p u b lic R u n n a b leC la s s (T ra ck B a r tb , L a b e l 1 )
{
th is .1 = 1 ;
th is .tb = tb ;
th r ead = n e w T h read( this, R u nnab le C la ss th read ) ; th r ea d .s ta rt();
}
pub lic v o id run()
{
w h ile (tru e)
{
/ * *
* C a ll th e s p e cif ied m eth o d fro m th e la b e l’ s th r ea d .
* /
tb .in v ok eA s yn c ( t C a l lb ack); t r y
{
T h r ea d .s le ep ( S L E E P ) ;
}
ca t ch ( In t erru p te d E x c ep t io n e)
{
}
}
}
in t nC ount = 0;
in t n T ic k S t yles [] = { T ic k S t yle .B O T H ,
T ic k S t y le .B O T T O M R IG H T ,
/* *
T ic k S t y le .N O N E ,
T ic k S t y le .T O P L E F T } ;
- T h is cod e is ex ecu te d o n th e t rackb a r ’ s th read .
*/
p r iv ate vo id t C allb ack ( )
{
in t n Ind ex = n C ou n t % (nT ick S t yles .len gth);
l.s et T ex t (" h e llo f r o m t C allB a c k : " + nC o u nt); tb .s et T ick S t yle ( n T ick S t y les [n In d ex ] ) ;
nC o unt+ + ;
in t nV a lue = tb .g e t V a lu e();
if (n V a lu e > = tb .g e t M a x im u m ()) tb .s e t V a lu e( 0 ) ;
els e
}
tb .s e t V a lu e ( n V a lu e + 1 ) ;
pub lic v o id s topT hre a d ( )
{
th rea d .s to p ();
}
}
在 这 种 情 况 下 退 出 线 程 只 是 停 止 运 行 该 线 程 的 方 法 在 本 例 中 当 处理 创 建 R unna b le C la ss s 对 象 的 Fo rm 类 时 它 调 用 对 象 的 s topT hre a d 方法 下 面 的 代 码 段 演 示 了 这 一 点
…
im po r t R u nn a b le C la s s ;
p u b lic c la ss S im p le R u n n a b le e x te n d s F o rm
{
/* *
* T h is is th e class th at im p lem en ts th e R u n n ab le in terface.
*/
R u n n ab le C lass ru n n ab le C lass;
pu b lic Sim p le R u nn a b le()
{
/ / R eq u ir ed for V isua l J + + F o r m s D esign er sup p ort. in it F o r m ( ) ;
ru n n ab le C lass = n e w R u n n ab le C lass ( tb , 1 ) ;
}
pu b lic vo id d is p o s e()
{
ru n n a b le C la s s .s to p T h rea d (); s u per .d is p o s e();
co m p onen t s .d is p o s e();
}
C o n tainer co m p o n en ts = n e w C ontain er(); E d it e D es cr ip t io n = n e w E d it();
T rack B ar tb = n e w T ra ckB ar(); L a bel l = ne w L a b e l ( ) ;
p riv a te v o id in it F o r m ( )
{
/ / C o d e to in it ia liz e th e co n tro ls o m itte d …
}
p u b lic s ta tic v o id m a in ( S t r in g a rg s [ ] )
{
A pplica t io n .ru n ( ne w Sim p le R u nn a b le());
}
}
另 一 种 方 法 是 创 建 一 个 新 的 应 用 程 序 线 程 而 不 必 实 现 J a v a R u nna b le 接 口 或 是 展 开 ja va . la n g.T h re a d 用 户 可 以 使 用 A p p lic a tio n .c re a te T h re a d 方 法 crea te T h read 方 法 用 一 个 委 托 作 为 参 数 M e thod Inv oke r 经 常 使 用 但 是 可 以 使 用 任 何 委 托 在 这 种 情 况 下 在 一 个 类 中 可 以 包 含 所 有 的
逻 辑 通 常 这 个 类 是 应 用 程 序 基 于 Fo rm 的 类 下 面 的 代 码 段 说 明 了 它们 的 工 作 方 式
im port c o m . m s . w fc .a pp .* ;
im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u i.* ;
pu b lic c la s s Sim p le A ppT h rea d ex te n d s Fo r m
{
f in a l in t S L E E P = 7 0 0 ; T h read th r ead;
/ / S p ecif y th e th r ea d co n tex t to ru n a m e th o d o n .
M e th od Inv o k er cb D e leg a t e = ne w M e th o d In v o k er( cd T h r d C a l lba c k ) ;
pu b lic Sim p le A ppT h rea d ( )
{
in it F o r m ( ) ;
/ * *
-
C r ea t es a n e w th r ead an d ru ns th e m e th o d In vo k er m e th o d
-
o n th e n e w th read . T h e retu rn ed th rea d o b ject is n eed
ed
-
so w e ca n stop th e th rea d w h en th is form is clos ed (dis p o sed).
-
N o t e th a t th r ea d .s ta rt() is ca ll e d a u to m a tica
lly.
* /
t h read = A p p li ca t io n . cr ea te T h r ea d ( n e w M e th od Inv o k e r ( th is .m e th o d In vo ker));
}
priv a te v o id m e th o d In vo ker()
{
w h ile (tru e)
{
/ / cb T h rd C a llb a ck is ca l led o n th e ch e c k b o x ’ s th rea d . cb .in v o k e ( cb D e leg a t e);
t r y
{
T h r ea d .s le ep ( S LE EP ) ;
}
ca tc h ( In terr u p ted E x c ep t io n e)
{
}
}
}
in t nC ount = 0;
/* *
-
T h r ea d ca l lb ack th at sets ch eck b o x alig n m en t p ro p ert y .
-
T h is cod e is to b e ex ecu te d on th e ch eck b o x ’ s th rea d .
*/
p r iv a te v o id cb T h rd C a llb a ck ()
{
cb .s e t T ex t (" th r ea d C a llb a ck lo o p :" + n C o u n t+ + ) ; if ( n C o u n t % 2 = = 0)
cb .s et T ex t A lig n ( L eft R ig h t A l ig n m en t . L E F T ) ;
els e
}
cb .s et T ex t A lig n ( L eft R ig h t A l ig n m en t .R IG H T ) ;
pu b lic vo id d is p o s e()
{
th r ea d .s to p ( ) ;
s u per .d is p o s e();
co m p onen t s .d is p o s e();
}
priv a te v o id c b S u sp e nd_c l ic k ( O b je c t se nde r , E v e n t e )
{
if ( cbS u s pen d .g e t C h e c k ed ( ) )
{
cb S u s p en d .s e t T ex t (" p res s to res u m e t h rea d " ) ; th rea d .s u s p en d ( ) ;
}
els e
{
cb S u s p en d .s e t T ex t (" p res s to s u s p en d th rea d " ) ; th rea d .r es u m e();
}
}
C on ta ine r c o m pone n ts = ne w C on ta ine r();
C h eck B o x cb S u sp end = n e w C h eckB ox ( ) ; Ch e c k Bo x cb = n e w Ch e c k Bo x ( ) ;
p r iv a te v o id in i t F o rm ( )
{
/ / C o d e to in it ia liz e th e co n tro ls h er e…
}
p u b lic s ta tic v o id m a in ( S trin g a rg s [ ] )
{
A pplica t io n .ru n ( ne w Sim p le A p p T h rea d ( ) ) ;
}
}
这 就 是 通 过 从 窗 体 的 处 理 方 法 中 调 用 线 程 的 停 止 方 法 来 中 止 的 线 程 该线 程 不 在 一 个 单 独 的 类 中 所 以 它 的 方 法 可 以 直 接 从 基 于 Fo rm 的 类中 调 用
A p p lic a tio n 类 还 包 含 A p p lic a tio n .e x itT h re a d 方 法 该 方 法 关 闭 线 程 的 消
息 循 环 并 关 闭 在 线 程 上 的 所 有 窗 口 注 意 它 并 不 中 止 或 退 出 线 程 本身 与 之 形 成 对 比 的 是 A p p lic a tio n .e x it 关 闭 在 所 有 线 程 上 的 消 息 循环 并 关 闭 所 有 窗 口
使 用 线 程 存 储 器
W F C A p p lic a tio n 类 提 供 对 T h re ad L o cal S to rag e T L S 线 程 局 部 存 储 器 的 支 持 每 个 线 程 可 以 线 程 特 定 的 数 据 存 储 分 配 一 个 内 存 位 置 调 用A pp lic a t ion .a llo c T h re a d S tora g e 返 回 一 个 该 内 存 位 置 的 索 引 要 在 TL S 中 设 置 一 个 值 使 用 该 索 引 和 想 要 设 置 的 值 来 调 用A p p lic a tio n .s e tT h re a d S to ra g e 要 检 索 该 值 需 调 用A pp lic a t ion .g e t T hre a dS to ra g e 记 住 要 调 用 A pp lic a t ion .f re e .T hre a d- 确良 S to ra g e 来 释 放 所 有 已 分 配 的 线 程 存 储 器
使 用 线 程 异 常
c o m .m s. w fc .a p p 类 提 供 一 个 Th re a d Ex c e p t io n D ia lo g 类 当 在 线 程 中 发 生没 有 处 理 的 程 序 异 常 时 它 自 动 显 示 用 户 可 以 通 过 使 用A pp lic a t ion .a ddO nT hre a dE x c e p tion 方 法 指 定 自 己 的 线 程 异 常 处 理 程 序 来得 到 对 异 常 的 控 制 a ddO nT hre a d E x c e p tion 方 法 带 有 一 个T h re a d E x c e p tionE v e n t H a nd le r 委 托 它 是 由 事 件 处 理 程 序 方 法 和T h re a d E x c e p tionE v e nt 类 构 成 的
通 常 线 程 异 常 事 件 处 理 程 序 查 询 T h re a d E x c e p tionE v e nt 对 象 的 异 常 字
段 传 递 它 来 确 定 所 要 采 取 下 一 个 动 作 从 这 些 线 程 异 常 处 理 程 序 中用 户 可 以 使 用 与 其 他 W F C 对 话 框 同 样 的 方 法 来 运 行Th re a d E x c e p tio n D ia lo g 并 检 索 对 话 结 果 使 用 F o rm . sh o w . D ia lo g 方 法 来启 动 对 话 框 并 且 与 c o m .m s. w fc .u i . D ia lo g R e su l t 类 字 段 比 较 返 回 的 结果
第 13 章 W F C 控 件 开 发
与 在 V isu a l B a sic W e b 页 和 其 他 支 持 标 准 Ac t iv e X 控 件 的 主 应 用 程 序中 一 样 利 用 V isu a l J + + 和 W F C 可 以 创 建 能 在 Ja va 应 用 程 序 中 使 用的 控 件 W F C 提 供 合 并 多 数 控 件 功 能 的 类 包 括 设 计 和 实 现 属 性 的 工具 处 理 和 调 用 事 件 等 等
V isu a l J + + 还 包 括 创 建 合 成 控 件 的 可 视 工 具 合 成 控 件 是 由 多 个 可 视 元素 构 成 的 控 件 如 复 选 框 和 列 表 框 利 用 可 视 工 具 可 以 设 计 控 件 的 布局 生 成 可 以 根 据 实 现 控 件 全 部 功 能 进 行 修 正 的 适 当 代 码
创 建 控 件 的 详 细 细 节 参 见 下 列 列 表 的 有 关 部 分
有关 信 息 参见
W F C 中的 控件 技 术 使 用 代码 编写 控 件 编 写 W F C 控件
使 用 可视 工 具 创建 合成 控 件 创建 合成 W F C 控件
编 写 W F C 控 件
W F C 提 供 一 个 丰 富 的 框 架 结 构 来 开 发 自 定 义 控 件 下 图 显 示 W F C 中 可视 控 件 的 基 本 类 层 次
c o m .m s. w fc .u i . C o n t ro l 类 是 所 有 控 件 的 基 类 它 可 以 提 供 控 件 的 多 数 功能
注 意 对 合 成 控 件 来 说 其 他 控 件 和 事 务 逻 辑 组 合 创 建 的 控 件 使 用 的 基 本 W F C 软 件 包 是 com.ms.wfc .ui 可 以 使 用 可 视 工 具 设
计 合 成 控 件 更 多 信 息 参 见 本 章 后 面 的 创 建 合 成 W F C 控 件
编 写 控 件 时 可 以 扩 展 基 本 C on tro l 类 然 后 增 加 需 要 的 成 员 合 成 控件 是 通 过 扩 展 U s e r C on tro l 在 可 视 设 计 器 中 创 建 的 也 可 以 根 据 需 要超 越 从 C on tro l 类 继 承 的 成 员 下 面 提 供 有 关 创 建 控 件 的 信 息
-
**创
建 基 本 控 件** 如 何 创 建 C on tro l 类 的 子 类 并 且 在 设 计 阶 段 环 境 中 放置 控 件
-
定 义 控 件 属 性 如 何 定 义 并 且 公 布 控 件 的 属 性 如 何 为 属 性 值 指 定 自
定 义 编 辑 器
-
使 用 控 件 事 件 如 何 为 控 件 创 建 自 定 义 事 件 如 何 捕 捉 和 使 用 标 准 事件
-
定 制 控 件 管 理 控 件 的 可 视 显 示 指 定 动 词 和 更 多 的 信 息
-
使 用 控 件 这 里 需 要 做 的 是 使 控 件 可 以 应 用 到 其 他 计 算 机 的 主 应 用 程序 上
创 建 基 本 控 件
这 部 分 概 括 创 建 控 件 的 过 程 在 这 部 分 可 以 学 到 如 何 定 义 基 本 控 件并 为 它 的 基 本 事 件 提 供 功 能
定 义 控 件
自 定 义 控 件 是 W F C Co n t ro l 类 的 子 类 为 使 控 件 在 V isu a l J
-
- 的 工 具 箱中 是 可 视 的 也 必 须 扩 展 c o m .m s . w fc .u i . C on tro l . C la s s Info 类 C la ssIn fo 类 包 含 用 于 提 供 有 关 类 设 计 信 息 的 元 数 据 和 浏 览 器 组 件 属 性 以 及 运 行 的事 件 如 果 在 工 具 箱 中 不 需 要 控 件 是 可 视 的 就 不 要 扩 展c o m .m s . w fc .u i . C on tro l . C la s s Info 但 是 必 须 仍 然 有 用 以 实 现c o m .m s. w fc .c o re . IC la ss In fo 的 子 类 C o m pone n t .C la ss Info 这 个 内 部 类 必须 命 名 为 C la ssIn fo
注 意 WFC Comp onent Builder 创 建 了 一 个 骨 架 控 件 这 个 控 件 包括 可 以 在 里 面 填 充 内 容 的 属 性 和 方 法 这 部 分 有 关 如 何 建 立 控 件 的
信 息 可 以 帮 助 你 手 工 建 立 控 件 而 且 解 释 建 立 程 序 所 做 的 一 些 事情
下 面 列 出 一 个 骨 架 控 件 如 果 编 译 它 这 个 控 件 将 在 计 算 机 上 注 册 并且 在 C u s tom iz e T o o lbox 对 话 框 中 变 为 可 用 的
// M y C on tro l . ja v a
im p o r t c o m . m s .w f c.u i.* ;
im port c o m . m s . w fc .c ore .* ;
pub lic c la ss M y C on tro l e x te nds C on tro l {
p u b li c s tatic c lass C lassInfo ex ten d s C o ntro l.C lass Info {
}
}
如 果 把 这 个 控 件 的 一 个 实 例 添 加 到 一 个 窗 体 中 在 属 性 窗 口 中 将 会 看 到它 的 属 性 和 事 件 可 以 改 变 这 些 属 性 也 可 以 看 到 这 个 控 件 已 经 支 持 背景 色 前 景 色 锚 点 停 靠 鼠 标 事 件 焦 点 甚 至 更 多
c o m .m s. w fc .u i . C o n t ro l 类 定 义 这 些 共 同 属 性 和 事 件 的 默 认 实 现
添 加 控 件 描 述
可 以 为 公 布 Ac t iv e X 控 件 的 控 件 添 加 文 本 描 述 然 后 主 应 用 程 序 可 以查 询 和 显 示 这 个 描 述 为 创 建 一 个 描 述 需 在 C la ssIn fo 类 中 添 加 一 个
D e sc r ip tio nA t tr ibu te 对 象 下 面 的 例 子 显 示 如 何 添 加 文 本 描 述
pub lic s ta t ic c la s s C la s s Info e x te nds C on tro l . C la s s Info
{
p u b lic v o id g e t A t t rib u tes ( IA t t rib u tes a t t rib s ) { su per. get A t t r ib u tes ( a t t r ibs );
a ttrib s .a d d ( n e w D es cr ip t io n A ttrib u te(" T h is d es cr ib es M y C o n t ro l" ) ) ;
}
为 类 事 件 提 供 功 能
c o m .m s. w fc .u i . C o n t ro l 类 使 用 默 认 功 能 公 布 了 一 个 共 同 的 成 员 集 例 如如 果 如 前 所 述 创 建 了 基 本 控 件 则 在 P rope r t ie s 窗 口 中 它 的 文 本 属 性 是可 用 的
- 般 情 况 下 要 向 控 件 中 添 加 功 能 必 须 为 通 过 基 类 公 布 的 控 件 超 越 成员 W F C 中 的 大 多 数 事 件 公 布 在 它 们 带 有 保 护 的 on< 事 件 名 > 成 员 的 基类 上 这 可 以 让 子 类 不 必 与 事 件 处 理 程 序 联 系 就 可 以 超 越 事 件 在 超 越代 码 中 定 义 所 需 要 事 件 的 功 能 通 常 通 过 调 用 超 类 事 件 实 现 成 员 的默 认 功 能 通 过 公 布 所 调 用 的 超 类 事 件 可 以 指 定 事 件 触 发 的 顺 序
注 意 当 没 有 创 建 在 超 类 中 定 义 的 事 件 的 子 类 时 还 有 另 外 的 方 法接 收 事 件 详 情 参 见 本 章 后 面 的 使 用 控 件 事 件
下 面 举 例 说 明 怎 样 能 超 越 这 个 保 护 的 onP a int 方 法 来 定 义 什 么 样 的 控件 应 该 在 运 行 时 显 示 在 这 个 例 子 中 首 先 调 用 超 类 事 件 执 行 超 类 拥 有
的 绘 图 方 法 控 件 拥 有 的 代 码 通 过 调 用 G ra ph ic s 对 象 的 dra w S tr ing 方 法来 显 示 文 本 属 性 的 值
// M y C on tro l . ja v a
im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.c o r e .* ;
pub lic c la ss M y C on tro l e x te nds C on tro l {
p rot ecte d vo id o n P a in t ( P a int E v en t p ) {
s upe r .onP a in t( p ) ;
G ra p h ics g = p .g ra p h ics ;
g . d ra w S t r in g ( g e t T e x t ( ) , 0 , 0 ) ;
}
p u b lic s tatic c las s C las sInfo ex te nds C o n t ro l.C las sInfo {
}
}
在 这 个 例 子 中 通 过 调 用 控 件 的 ge t T e x t 方 法 检 索 存 储 在 控 件 中 的 文 本从 而 显 示 文 本 当 编 译 并 且 添 加 类 的 新 版 本 时 现 在 控 件 就 包 含 了 键入 到 文 本 属 性 的 一 切 文 本 因 为 c o m .m s. w fc .u i . C o n t ro l 类 提 供 了 文 本 属性 所 以 没 有 必 要 再 创 建 一 个 新 的
O n P a in t 的 参 数 是 P a in tE v e n t 它 包 含 了 事 件 特 定 的 数 据 当 创 建 保 护
成 员 的 子 类 时 已 经 隐 含 知 道 了 发 送 事 件 的 对 象 因 为 这 个 发 送 者 是 th is
类 的 当 前 实 例 事 件 数 据 随 着 事 件 的 不 同 而 不 同 在 这 种 情 况 下
P a in tE v e n t 看 起 来 如 下 所 示
P ub lic c la s s P a in t E v e nt e x te nds E v e n t {
//G ra p h ics o b je c t w ith w h ic h p a in tin g s h o u ld b e d o n e . P u b l ic f ina l G ra p h ics g ra p h ics ;
// R e c ta n g le in to w h ic h a ll pa in t ing shou ld be done .
P u b l ic f in a l re cta n g le clip R e ct;
}
P a in tE v e n t 的 图 形 成 员 是 指 c o m .m s. w fc .u i . G ra p h ic s 对 象 这 是 绘 图 接 口的 W F C 包 装 w ra ppe r 一 个 W in 3 2 设 备 的 上 下 文 G ra ph ic s 对 象 公布 方 法 来 绘 制 字 符 串 行 位 置 省 略 号 等 等 可 以 改 变 字 体 前 景 色和 背 景 色 属 性 的 值 这 将 正 确 显 示 因 为 通 过 P a in tE v e n t 事 件 传 入 的G ra ph ic s 对 象 是 使 用 基 于 控 件 中 设 置 的 正 确 字 体 和 刷 子 建 立 的 有 关 绘图 的 更 详 细 资 料 参 见 本 章 后 面 的 修 改 可 视 显 示 部 分
使 用 窗 口 句 柄
C on tro l 基 类 通 过 扩 展 c o m .m s . w fc .a pp .W indow 的 私 有 成 员 封 装 W in 3 2 HW N D 句 柄 W ind ow 类 管 理 为 控 件 创 建 的 HW N D 窗 口 过 程 子 类无 论 什 么 时 候 需 要 一 个 带 有 调 用 C on tro l .g e t H a nd le 的 句 柄 如 果 需 要
就 会 创 建 这 个 句 柄 或 句 柄 存 在 时 就 返 回 句 柄 创 建 句 柄 时 C on tro l
类 首 先 调 用 g e t C re ate P ara m s 方 法 为 创 建 句 柄 确 定 正 确 的 窗 口 样 式 如果 想 指 定 窗 口 样 式 或 扩 展 窗 口 样 式 可 以 超 越 g e t C re ate P ara m s 方 法创 建 句 柄 后 马 上 激 活 crea te H a n d le 事 件 在 撤 消 这 个 句 柄 之 前 立 即激 活 de s t ro y H a nd le 事 件 因 此 在 创 建 和 撤 消 句 柄 事 件 期 间 这 个 句 柄是 合 法 的
任 何 给 定 句 柄 的 生 存 期 都 是 通 过 控 件 的 实 现 来 确 定 的 但 是 任 何 控 件的 实 例 的 生 存 期 都 不 依 赖 于 句 柄 的 生 存 期
W F C 允 许 以 不 同 的 方 式 操 作 需 要 在 W ind ow s 中 重 建 的 控 件 例 如 可以 使 用 控 件 如 标 尺 当 改 变 标 尺 的 单 位 时 可 能 导 致 创 建 重 建 这 个 控件 使 HW N D 无 效 如 下 例 所 示
{
h = x. get H a n d le();
x .u n its = " p o ints" ; / / ch an g e p rop ert y th at r esu lts in r e cr ea t io n
// h is no w in v a l id
}
通 常 在 使 用 控 件 之 前 立 即 利 用 句 柄 得 到 它 是 最 安 全 的
有 时 可 能 需 要 调 用 recre a te H a n d le 方 法 来 重 新 创 建 句 柄 先 撤 消 然 后立 即 再 次 创 建 如 果 调 用 recre a te H a n d le 方 法 那 么 在 这 个 句 柄 再 次创 建 之 前 g e t R ecrea tin g H an d le 将 返 回 tru e 这 允 许 用 户 在 de s t ro yH a n d le 事 件 中 公 布 在 句 柄 重 建 期 间 从 HW N D 检 索 状 态 的 特 殊 逻 辑 一 个 例 子是 列 表 框 如 果 句 柄 重 建 你 可 能 想 从 破 坏 的 句 柄 的 列 表 框 中 保 存 所 有
项 如 果 需 要 窗 口 格 式 重 新 应 用 程 序 到 窗 口 而 不 需 要 重 建 句 柄 则 可以 调 用 upda te S ty le s 这 将 调 用 g e t C re ate P a ra m s 方 法 并 且 在 HW N D 中 重 新 应 用 这 个 格 式 和 扩 展 格 式
注 意 如 果 没 有 创 建 句 柄 调 用 这 些 函 数 不 会 起 任 何 作 用 这 在 属 性 设定 方 法 中 是 有 用 的 因 为 不 想 迫 使 句 柄 创 建 而 如 果 句 柄 已 经 创 建 可能 需 要 改 变 HW N D 通 过 这 个 约 定 就 可 以 不 必 为 简 单 的 属 性 变 化 而强 制 创 建 句 柄 了 较 早 强 制 创 建 句 柄 可 能 代 价 较 大 因 为 用 户 可 能 设 置需 要 句 柄 重 建 的 其 他 属 性 需 要 创 建 句 柄 的 最 好 方 法 只 能 是 显 示 控 件 的可 视 性 但 不 调 整 属 性
W F C 控 件 中 的 线 程
Ja va 语 言 通 过 类 集 和 到 控 件 线 程 创 建 与 执 行 的 AP I 来 支 持 多 线 程W in 3 2 窗 口 是 固 有 的 公 寓 线 程 可 以 在 任 何 线 程 上 创 建 它 们 但 是 它 们不 能 交 换 线 程 并 且 调 用 那 个 窗 口 的 所 有 函 数 必 须 在 它 的 主 线 程 上 出现 W F C 控 件 从 c o m .m s. w fc .u i . C o n t ro l 派 生 的 所 有 东 西 需 要 这 种线 程 模 型 而 多 数 的 W F C 组 件 是 自 由 线 程
C on tro l 类 提 供 两 个 函 数 in v oke 和 in v oke A s y n c 将 把 所 有 代 表 调 度 到控 件 的 主 窗 口 线 程 上 并 且 执 行 如 果 试 图 在 W in3 2 H W N D 下 操 作 的 控件 上 调 用 一 个 函 数 这 将 通 过 W ind ow s 调 度 到 正 确 的 线 程 通 过 直 接调 用 in v oke 函 数 可 以 成 批 调 用 到 HW N D 并 且 限 制 所 出 现 的 交 叉 线程 调 度 费 用 的 数 量
注 意 Windows 消 息 循 环 依 赖 于 在 上 面 创 建 HWND 的 线 程 如 果 在一 个 新 线 程 上 创 建 控 件 的 HWND 则 这 个 新 线 程 不 再 接 收 信 息 对更 详 细 的 资 料 参 见 第 1 2 章 W F C 编 程 概 念 中 的 使 用 WFC 和 Java 线 程
虽 然 大 多 数 W F C 组 件 支 持 自 由 线 程 但 大 多 数 方 法 调 用 不 是 同 步 的同 步 调 用 非 常 昂 贵 只 有 需 要 时 才 会 这 样 做 例 如 在 对 象 上 同 步 调 用多 个 方 法 将 得 到 非 常 有 用 的 执 行 结 果
定 义 控 件 属 性
大 多 数 控 件 公 布 一 个 允 许 用 户 确 定 控 件 行 为 和 外 表 的 设 置 或 属 性 在W F C 控 件 中 可 以 使 用 ge t 和 se t 函 数 把 属 性 创 建 为 成 员 但 是 W F C 还 提 供 类 和 接 口 帮 助 用 户 把 控 件 集 成 到 设 计 阶 段 环 境 中
下 面 提 供 有 关 在 控 件 中 创 建 公 布 和 自 定 义 属 性 的 信 息
创 建 和 公 布 属 性
定 义 控 件 属 性 与 向 任 何 类 中 添 加 属 性 相 似 除 此 之 外 向 C la ssIn fo 类中 添 加 成 员 可 以 使 属 性 在 P rope r t ie s 窗 口 中 是 可 见 的
添 加 属 性 定 义
属 性 存 储 在 控 件 的 私 有 成 员 变 量 中 可 以 提 供 一 个 公 共 的 ge t< 属 性 > 方法 来 公 布 属 性 值 如 果 想 使 属 性 是 可 读 写 的 还 可 以 提 供 公 共 的 se t< 属性 > 方 法 用 来 获 取 包 含 新 属 性 值 的 参 数
注 意 WFC Compon ent Builder 将 为 用 户 创 建 属 性 骨 架
在 M y C o n tro l 控 件 中 调 用 简 单 的 整 数 属 性 m y P ro p 可 以 在 下 例 中 实 现
pub lic c la ss M y C on tro l e x te nds C on tro l {
p riv a te in t m y P ro p = 0 / / 0 is th e defa u lt v a lu e p u b lic get M y P ro p ( ) {
r e tu rn m y P r o p
}
p u b lic s e t M y P ro p in t n e w V a lu e { m y P ro p = n e w V a lu e
}
}
注 意 属 性 定 义 中 使 用 的 名 字 应 该 以 一 个 小 写 字 母 开 头 除 非 开 始两 个 字 母 都 是 大 写 紧 跟 在 get 或 set 后 面 的 函 数 名 字 应 该 有 一个 大 写 字 母 例 如 对 text 函 数 应 该 有 getText 和 setText 而对 于 MDIChild 应 该 有 getMDIChil d 和 setMDIChil d
在 设 计 阶 段 公 布 属 性
为 了 在 P rope r t ie s 窗 口 中 使 属 性 是 可 见 的 可 以 做 下 列 事 情
-
创
建 指 出 新 属 性 的 类 名 字 和 数 据 类 型 的 P rope r ty Info 类 的 一 个 静 态最 终 实 例
-
超 越 超 类 的 g e t P rope r t ie s 方 法 并 且 添 加 超 类 的 现 有 属 性 其 次 是 新
属 性
注 意 getPropert ies 方 法 是 用 于 公 布 方 法 事 件 扩 展 器 extender 和 类 属 性 的 可 以 使 用 的 几 种 方 法 之 一 有 关 其 他 方 法的 细 节 参 见 本 章 后 面 的 使 用 控 件 事 件
下 例 显 示 m y P ro p 属 性 的 C la ss In fo 类
pub lic s ta t ic c la s s C la s s Info e x te nds C on tro l . C la s s Info { pub lic s ta t ic fina l P rope rty Info m y P rop =
n e w p rop ert y nf o ( M y C ontro l. c lass, " m yP ro p " , in t .clas s); p u b lic v o id g etP ro p erties ( IP ro p erties p ro p s ) {
// A d d ex is tin g p ro p erties fo r m p a re n t c la s s s u p er .g etP ro p erties ( p ro p s ) ;
p rop s .a d d( m y P ro p ) ; / / a d ds cu s to m p ro p ert y
}
}
有 关 使 用 P rope r ty Info 类 的 更 多 信 息 参 见 本 章 后 面 的 指 定 自 定 义 控件 属 性
对 齐 属 性 举 例
这 部 分 提 供 S upe r L a b e l 类 对 齐 属 性 的 完 整 举 例 它 允 许 用 户 指 定 如 何要 求 标 签 内 的 文 本 对 齐 靠 左 靠 右 和 居 中 这 个 例 子 说 明 如 何 做 下 列操 作
-
定 义 和 公 布 属 性
-
使 用 枚 举 e num 类 为 属 性 定 义 允 许 使 用 的 值
-
为 新 属 性 值 提 供 验 证
-
画 控 件 时 使 用 对 齐 属 性 值
-
在 设 计 阶 段 公 布 属 性
这 个 例 子 的 代 码 参 见 本 章 后 面 的 一 个 完 整 例 子
基 本 对 齐 属 性
创 建 对 齐 属 性 的 代 码 如 下 所 示 在 se tA lig n m e n t 方 法 中 调 用 in v a lid a te
函 数 间 接 强 制 这 个 控 件 重 画 以 便 它 影 响 新 属 性 值
p riv a te in t a lig n = A lig n S tyle . L E F T ; p u b l ic in t g e tA lig n m e n t( ){
retu rn a lig n ;
}
p u b lic v o id s e tA lig n m e n t( in t v a lu e ) {
a lig n = v a lu e ;
in v a lid a te() ; / / R ep a in t c o n t ro l w h en p ro p ert y c h a n g es
}
创 建 枚 举 属 性 值
因 为 属 性 只 有 三 个 可 能 的 值 可 以 使 用 一 个 枚 举 e num 定 义 它 们虽 然 Ja va 没 有 枚 举 类 型 的 支 持 但 是 W F C 提 供 了 一 个 c o m .m s . w fc .c ore .E num 类 任 何 从 c o m . m s . w fc .c o re .E num 得 到 的 类 都 看成 是 E num 对 象 所 有 E num 对 象 都 遵 守 只 包 含 公 共 静 态 最 终 整 数 的 标准 而 这 个 公 共 静 态 最 终 整 数 代 表 有 效 的 选 择 它 们 可 以 随 意 包 含 一 个有 效 的 方 法 如 果 在 E num 对 象 中 传 递 的 值 是 有 效 的 则 这 个 方 法 返 回tru e
枚 举 对 象 在 P rope r t ie s 窗 口 中 是 可 识 别 的 所 以 当 给 E num 类 分 类 时在 设 计 阶 段 的 P rope r t ie s 窗 口 中 将 会 自 动 得 到 一 个 有 效 项 目 的 下 拉 表下 面 例 子 显 示 的 是 定 义 一 个 A lig n S tyle 枚 举 的 类
// A l ig n S ty le .ja v a
im p o r t c o m . m s .w f c.c o r e .*
p u b lic c la ss A lig n S tyle e x te n d s E n u m
{
p u b lic s ta tic f in a l in t L E F T = 1 ;
p u b lic s ta tic f in a l in t R IG H T = 2 ;
p u b lic s ta tic f in a l in t C E N T E R = 3 ;
// O p tio n a l v a lid m e th o d to te s t p a ss e d v a lu e
p u b lic s ta t ic b o o lea n v a lid ( in t v a lu e) {
r e tu rn (L E F T < = v a lu e & & v a lu e < = C E N T E R ) ;
}
}
注 意 把 有 效 的 方 法 创 建 为 静 态 成 员 允 许 用 户 调 用 它 而 不 必 先 创建 一 个 类 实 例
提 供 属 性 验 证
设 置 属 性 时 为 测 试 用 户 指 定 的 有 效 对 齐 值 可 以 向 se tA lig n m e n t 方 法中 添 加 验 证 为 测 试 这 个 值 可 以 调 用 A lig n S tyle 枚 举 的 有 效 方 法 如果 有 错 误 可 以 施 加 W F C In v a l id E num E x c e p tio n 异 常
下 例 显 示 使 用 添 加 的 验 证 修 改 的 se tA lig n m e n t 方 法
pu b lic vo id s e t A l ignm en t in t v a lu e { if A lig n S t y le . v a lid ( v a lu e)
th ro w ne w W F C Inv a l id En um E x c eptio n ( " v a lue" , v a lu e , A lig n S t y le . c la s s ) ;
a lig n = v a lu e ;
in v a lid a te(); / / R ep a in t co n t ro l w h en p ro p ert y c h a n g es
}
注 意 有 关 使 用 invalidate 重 画 控 件 的 信 息 参 见 本 章 后 面 的 修改 可 视 显 示
通 过 施 加 W F C In v a l id E num E x c e p tion 可 以 得 到 非 检 查 异 常 和 与 之 关联 的 预 定 义 信 息 这 个 信 息 转 换 成 多 种 语 言 以 便 在 不 同 场 所 运 行 这 个
控 件 自 动 获 得 有 意 义 的 错 误 信 息
画 控 件 时 使 用 属 性 值
对 齐 属 性 影 响 控 件 中 文 本 的 外 表 所 以 无 论 什 么 时 候 画 控 件 绘 制 代码 必 须 检 查 属 性 值 从 而 使 用 它
通 过 超 越 onP a int 方 法 指 定 绘 制 行 为 下 例 显 示 的 是 可 以 读 对 齐 属 性 值然 后 在 dra w S tr ing 方 法 中 使 用 这 个 值 设 置 对 齐 在 c o m .m s. w fc .u i 的Te x t F o rm a t 中 定 义 LE F T R IG H T 等 常 数
pro te c te d v o id onP a in t( P a in tE v e n t p) {
G rap hics g = p .grap h ics ; in t s ty le = 0 ;
sw it ch ( a l ig n ) {
ca s e A lig n S t y le.L E F T :
s t y le = T ex t F o rm a t . L E F T ; b r ea k ;
ca s e A lig n S t y le.R IG H T :
s t y le = T ex t F o rm a t .R IG H T ; b r ea k ;
ca s e A lig n S t y le.C E N T E R :
s t y le = T ex t F o rm a t . H O R IZ O N T A L C E N T E R ; b r ea k ;
}
g .d raw String ( g et T ext(),g e t C li e n t R e c t ( ) , s t yle);
}
在 设 计 阶 段 公 布 属 性
在 设 计 阶 段 为 使 对 齐 属 性 可 用 需 要 把 C la ssIn fo 分 成 首 先 定 义 属 性 的类 通 过 创 建 P rope r ty Info 的 实 例 然 后 通 过 调 用 g e t P rope r t ie s 方 法公 布 属 性
pub lic s ta t ic c la s s C la s s Info e x te nds C on tro l . C la s s Info {
p u b lic sta t ic fina l P r op ert y In fo a lig n m ent = n e w P rop ert y In fo ( M y C o n t ro l. c la s s , " a l ig n m en t" , A lig n S t y le . c la s s ) ;
P ub lic v o id g e t P ro pe r t ie s ( IP rope r t ie s props ) {
S u p er. g etP ro p erties ( p ro p s ) ; P r op s.ad d( alig n m en t ) ;
}
}
注 意 传 递 到 PropertyIn fo 的 第 三 个 参 数 在 这 里 是AlignStyle .class 是 属 性 的 正 常 数 据 类 型 然 而 因 为 这 个 属 性是 一 个 枚 举 值 所 以 传 递 创 建 扩 展 Enum 的 类
因 为 A lig n S tyle 是 从 E num 类 派 生 的 所 以 P rope r t ie s 窗 口 使 用 与 E num
类 相 关 的 编 辑 器 结 果 是 允 许 设 置 属 性 值 的 下 拉 列 表
注 意 为 创 建 不 在 设 计 阶 段 公 布 的 属 性 例 如 只 是 运 行 时 属 性 使 用 PropertyIn fo 对 象 把 BrowsableA ttribute 属 性 设 置 为 N O 详 情 参 见 本 章 后 面 的 指 定 自 定 义 控 件 属 性 的 属 性
一 个 完 整 例 子
下 例 显 示 使 用 了 对 齐 属 性 的 完 整 标 签 控 件 这 个 对 齐 属 性 包 括 了 前 面 讨论 的 所 有 特 征
// S u p e r L ab e l . jav a
im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.c o r e .* ;
pub lic c la ss S upe r L a b e l e x te nds C on tro l {
p riv a te in t a lig n = A lig n S t y le.L E F T ; p u b lic in t g etA l ig n m en t ( ){
r e tu rn a l ig n ;
}
p u b lic v o id s e tA lig n m e n t( in t v a lu e ) {
if (! A lig n S ty le . v a l id (v a lu e))
th ro w n e w W F C In v alid E n u m E x cep t ion(" v a lue" , v a lu e , A l ig nS t yle. c la ss); a l ig n = v a lu e ;
in v a lid a te(); // R ep a in t c o n tro l w h e n p ro p ert y ch a n g es
}
pro te c te d v o id onP a in t( P a in tE v e n t p) {
G rap hics g = p .grap hics ; in t s ty le= 0 ;
s w itch ( a lig n ) {
ca s e A lig n S t y le.L E F T :
s t y le= T ex t F o r m a t .L E F T ; b r ea k ;
ca s e A lig n S t y le.R IG H T :
s t y le= T ex t F o r m a t .R IG H T ; b r ea k ;
ca s e A lig n S t y le.C E N T E R :
s t y le= T ex t F o r m a t .H O R IZ O N T A L C E N T E R ;
b re a k ;
}
g .d ra w S trin g (g etT ex t(),g etC lie n t R e ct(),s t yle);
}
pub lic s ta t ic c la ss C la s s Info e x te nds C on tro l .C la ss Info {
pu b l ic s ta t ic f in a l Pro p ert y In f o a l ignm en t= ne w Pro p ert y In fo ( S u p er L a b e l . c la s s , " a lig n m e n t " , A lig n S t y le . c la s s ) ;
pub lic v o id g e t P rope r t ie s ( Ip rope r t ie s props){
s u p er .g e t P ro p erties ( p ro p s ) ;
p rop s .add( a lig n m en t ) ;
}
}
}
指 定 自 定 义 控 件 属 性
当 创 建 控 件 属 性 并 且 创 建 P rope r ty Info 对 象 来 设 置 它 的 属 性 时 , 可 以 指 定不 同 选 项 来 自 定 义 这 个 属 性
注 意 使 用 PropertyIn fo 类 的 详 细 信 息 已 经 在 本 章 前 面 部 分 定义 控 件 属 性 中 提 供 了
创 建 P rope r ty Info 对 象 的 基 本 语 法 是
new P r op ert y In fo (cla ss ow n e r S t r ing na m e C lass da ta T y pe )
例 如 下 面 是 在 M yc on tro l 控 件 中 名 叫 m y P ro p 的 属 性 的 P ro p e r ty In fo
对 象
pub lic s ta t ic fina l P rop e rty In fo m y P rop=
n e w P rop ert y In fo ( M y C o n t ro l. c la ss,”m y P rop ” , in t . c la s s);
可 以 通 过 为 P rope r ty Info 对 象 提 供 任 何 数 量 的 附 加 成 员 属 性 来 自 定 义 属性 一 个 成 员 属 性 被 定 义 成 从 co m .m s . w fc .c o re .M e m b er A t t r ib u te 得 到 任意 类 在 P rope r ty Info 类 中 默 认 的 某 一 数 量 的 属 性 是 可 用 的 或 者 通 过从 M e m b e r A ttrib u te 得 到 的 属 性 可 以 创 建 和 添 加 自 己 的 属 性 下 表 列 出
在 P rope r ty Info 类 中 预 定 义 的 属 性
属性 说明
B row sa b le A t tr ib u te 指定 在 P ro p e rties 窗口 中属 性 是 否是 可见 的 默认 值
是 YE S 这个 属性 可 以 与 P e rs is ta b le A t t r ib u te 属性 见下 面 联 合 使 用 来 定 义 控 件 属 性 这 个 控 件 属 性 的值保 存 在 控 件 中 但是 在 P ropertie s 窗口 中不 能 编 辑
Ca te g o ry A t tr ib u te 指定 放 入 P ro p erties 窗口 中的 当 前 控件 属性 的 类 别
如 A p p e ara n ce B e h a v ior 等等 默认 类别 是 M is c 可以 通 过 使 用 Ca te g o ry A t tr ib u te 中的 一个 静 态成员 在预 定 义 类 别 中 公 布 这 个 控 件 或 者 通 过 构 造 一 个 新Ca te g o ry A t tr ib u te 并且 在 需 要调 用 的 类 别 字 串中传 递它 来 创建 一 个 新类 别
D a ta B in d a b le A ttrib u te 指 定 控 件 属 性 是 数 据 绑 定 的 候 选 属 性 默 认 值
是 .N O 当 这 个 属 性 值 设 为 .Y E S 时 D a ta B in d 将 在下 拉 列表 中 列 出这 个控 件 属 性
D e fa u lt V a lu e A ttrib u te 简 单 属性 的 默 认值 当用 户在 P ro p e rties 窗口 中重 设
属性 值时 使 用 这 个 值 Fo rm s D e s ig n e r 还 比 较 默认值 与 当 前 值 如 果 它们 匹配 则 Fo rm s D e s ig n e r 不生 成 设 置 属 性 值 的 代 码 这 可 以 减 少 为 窗 体 生 成 的代码 量
注意 还 可 以通 过创 建 一 个 r e s e t < 属 性 > 方法 来创 建一 个 默 认 值 详 情 参见 下一 部分 指 定 动 态 默 认 值
和永 久 性 属 性
不 同 数 据 类 型 的 许 多 公 共 值 都 预 定 义 成 静 态 值 例如 对布 尔 值 已 经 定义 了值 TRU E 和 FA L S E
D e sc r ip tio nA t t ribu te 当 用 户选 择 当 前控 件属 性 时 定义 在 P ro p erties 窗口
的 底 部显 示 的 文本 默认 值是 |
|||
---|---|---|---|
L o c a liza b leA t tr ib u te |
如 果 用 户 选 择 本 地 化 一 个 窗 体 |
则 指 定 控 件 属 |
性 存 |
储在 源 文 件 中 默认 值 是 NO |
然 后 用户 可以 不 |
必 修 |
改 代 码而 本 地 化这 个源 文 件
P e rs is ta b le A t t r ib u te 在 设 计 阶 段 保 存 控 件 属 性 的 包 容 器 时 指 定 是 否 保
存 这 个 控 件 属 性 的 值 默认 值是 YE S 当 不 想 保 存控 件 属 性 的 值 时 主 要 使 用 这 个 属 性 例 如 瞬 时 控件 属 性 值 它 的 值 依 靠 状 态 或 计 算 结 果 通 常 把控 件 属性 的 这 个属 性设 为 NO 时 这个 控 件 属 性 也是不可 见 的 B row sa b le A t t ribu te 值是 NO
V a lu e E d ito r A t tr ib u te 为 当 前控 件 属 性指 定一 个 被 P ro p erties 窗口 使用 的 自
定义 编 辑 器 如 果 指定 一个 无 值 编辑 器 则 P ro p e rtie s 窗 口 使 用 一 个 与 控 件 属 性 的 数 据 类 型 相 关 的 编 辑器 有 关 详 情 参 见 本 章 后 面 的 创 建 自 定 义 属 性值编 辑 器
为 了 指 定 一 个 属 性 需 要 创 建 一 个 所 需 属 性 的 实 例 或 者 使 用 一 个 预 定 义实 例 例 如 B row sa b le A t t r ibu te . N O 然 后 使 用 如 下 语 法 把 它 添 加 到P rope r ty Info 定 义 中
new P rop ert y In fo ( C la ss ow n e r S t r ing na m e C lass da ta T y p e
[M e m b er A ttrib u te [M e m b er A ttrib u te ...] ] )
下 例 显 示 如 何 使 用 预 定 义 属 性 为 m y P ro p 控 件 属 性 定 义 一 个 描 述 和 默 认值
pub lic s ta t ic fina l P rop e rty In fo m y P rop=
n e w P ro p ert y In f o M y C o ntro l. class , " m yP ro p " , in t . c la s s , ne w D escrip t io n A t t r ibu te( " T es t pro p ert y" ) ,
ne w D e fa u lt V a lu e A t t r ibu te ( D e fa u lt V a lue A t tr ibu te .O N E ) ;
只 需 把 属 性 作 为 参 数 包 括 到 P rope r ty Info 构 造 器 中 就 可 以 有 总 计 六 个属 性 如 果 想 指 定 多 于 五 个 的 成 员 属 性 可 以 为 接 收 成 员 属 性 数 组 的P rope r ty Info 构 造 器 使 用 语 法 对 更 详 细 的 信 息 参 见 M ic rosoft V isu a l J+ + 6 . 0 库 参 考 一 书 中 的 M ic rosoft V is u a l J + + 6 .0 W F C 库 参 考 的 第 一 部分 P ack ag e co m . m s . w fc .c o re 中 的 P rope r ty Info
指 定 动 态 默 认 值 和 永 久 性 属 性
与 指 定 自 定 义 控 件 属 性 的 属 性 中 描 述 的 一 样 当 创 建 一 个 新 的P rope r ty Info 对 象 时 为 设 置 一 个 属 性 的 默 认 值 可 以 指 定 一 个D e fa u ltV a lu e A t t rib u te 属 性 有 时 可 能 想 指 定 一 个 默 认 动 态 值 这 指的 是 在 运 行 时 计 算 的 值 同 样 在 运 行 时 条 件 的 基 础 上 可 能 想 指 定 一 个永 久 属 性 值 在 设 计 阶 段 保 存
设 置 永 久 属 性 值
默 认 情 况 下 在 设 计 阶 段 当 一 个 控 件 的 属 性 值 从 默 认 值 发 生 变 化 时 与在 P rope r t ie s 窗 口 中 一 样 无 论 什 么 时 候 保 存 主 控 件 都 要 保 存 控 件 的属 性 值 例 如 如 果 在 V isu a l J + + 窗 体 中 实 例 化 控 件 并 且 P rope rtie s 窗 口 中 如 果 改 变 属 性 的 值 则 保 存 窗 体 时 也 就 保 存 了 这 个 属 性 的 值
为 了 更 有 效 率 如 果 属 性 值 与 它 的 默 认 值 相 匹 配 则 这 个 值 不 是 永 久 的在 少 量 的 实 例 中 可 能 要 在 运 行 时 条 件 的 基 础 上 指 定 一 个 永 久 属 性 值 为 使 控 件 保 持 永 久 性 需 超 越 C on tro l 类 的 sh o u ld P e rs ist< 属 性 > 方 法 条 件 测 试 后 这 个 方 法 应 该 返 回 一 个 表 明 自 定 义 值 是 否 被 保 存 的 布 尔值 为 避 免 保 存 这 个 值 从 这 个 方 法 返 回 fa lse 还 可 以 为 从 超 类 继 承的 属 性 超 越 shou ldP e rs is t< 属 性 > 与 这 个 例 子 中 一 样 依 靠 字 体 是 否 改变 来 设 置 字 体 属 性 的 永 久 性
pub lic boo le a n shou ldP e rs is t F o n t( ) {
retu rn fo n t != n u ll
}
注 意 比 较 上 述 说 明 周 围 属 性 它 们 的 值 是 从 父 属 性 继 承 的 例如 字 体 和 背 景 色 返 回 null 代 表 它 们 被 设 置 成 默 认 值 但 是 明确 地 获 得 这 样 属 性 的 值 例 如 调 用 getFont 方 法 则 返 回 实际 字 体 信 息
计 算 动 态 默 认 值
为 了 给 在 运 行 时 属 性 创 建 一 个 默 认 值 需 要 为 这 个 属 性 创 建 一 个 re se t< 属 性 > 方 法 下 面 例 子 显 示 如 何 为 名 为 la s t U pda te 的 属 性 实 现 一 个 基 于今 天 日 期 的 默 认 值
p r iv a te Da te d t L a s t Up d a te ;
p u b lic v o id set L as t U p d ate ( D at e d) { dt L a st U p date = d;
in v a lid a te(); / / R ep a in t c o n t ro l w h e n p ro p ert y ch a n g es
}
p u b lic v o id re se t L a stU p d a te ( ) {
retu rn n e w D a te();
}
还 可 以 超 越 从 C on tro l 类 继 承 的 re se t< 属 性 > 方 法 下 面 例 子 显 示 如 何 为控 件 超 越 re se t F ont 方 法
pu b lic vo id r es e t F on t ( ) {
Fo n t f = ne w F o n t (" A r ia l" , 8 .0f, Fo n t S ize .P O IN T S, Fon t W e ig h t .B O L D , fa ls e , fa ls e , fa ls e);
S e t F o n t(f);
}
创 建 自 定 义 属 性 值 编 辑 器
V isu a l J + + 6 . 0 的 P rope r t ie s 窗 口 为 公 布 在 控 件 中 的 属 性 值 提 供 了 编 辑 能力 事 实 上 P rope r t ie s 窗 口 正 好 是 一 个 真 正 的 主 编 辑 器 可 以 指 定 一个 自 定 义 编 辑 器 或 者 可 以 依 靠 P rope r t ie s 窗 口 的 默 认 编 辑 能 力
这 种 机 制 是 这 样 的 P rope r t ie s 窗 口 首 先 检 查 你 是 否 指 定 了 自 定 义 值 编辑 器 如 果 没 有 它 将 在 属 性 类 型 的 类 中 寻 找 一 个 名 叫 Ed i t 的 内 部 类如 果 没 有 发 现 编 辑 器 它 遍 历 类 型 层 寻 找 具 有 编 辑 器 的 任 何 超 类 因 为有 一 个 与 ja va . la n g.O b je c t 关 联 的
O b je c t E d ito r 类 所 以 总 会 发 现 一 个 编 辑 器 P rope r tie s 窗 口 将 为 所 有 简单 类 型 提 供 一 个 默 认 编 辑 器 如 字 串 编 辑 器 整 数 编 辑 器 等 等
指 定 自 定 义 值 编 辑 器 的 原 因 有 许 多 典 型 的 自 定 义 属 性 编 辑
器 任 务 包 括
-
文 本 向 值 的 转 换
-
值 绘 制
-
指 定 值 的 子 属 性
-
显 示 自 定 义 对 话 框
-
显 示 自 定 义 下 拉 列 表
-
通 过 指 定 一 个 应 该 取 代 指 定 值 的 常 数 名 来 参 与 代 码 生 成
详 情 参 见 下 一 部 分 定 义 自 定 义 值 编 辑 器
定 义 自 定 义 值 编 辑 器
为 创 建 自 定 义 值 编 辑 器 必 须 实 现 co m .m s . w fc .c o re .Iv alu e E d ito r 一 个方 便 的 方 法 是 扩 展 c o m .m s. w fc .c o re . V a lu e E d i to r 用 以 提 供 所 有 成 员 的默 认 实 现
为 创 建 在 P rope r t ie s 窗 口 中 显 示 的 值 作 为 字 串 超 越 ge t T e x t F ro m 方 法 为 改 变 在 控 件 中 受 到 影 响 的 值 并 且 在 P rope r t ie s 窗 口 中 显 示超 越 g e t V a lue F rom 方 法
下 面 例 子 说 明 一 个 在 P rope r t ie s 窗 口 用 % 显 示 百 分 比 值 的 简 单 自 定义 值 编 辑 器 不 过 在 存 储 这 个 值 之 前 除 去 了 标 点 符 号 这 个 例 子 利 用了 适 合 转 换 的 c o m .m s. w fc .u t il 类 中 的 V a lu e 类
im port c o m . m s . w fc .c ore .* ;
im p o r t c o m . m s .w f c.u til.*;
p u b lic c la ss P e rc e n tE d ito r e x te n d s V a lu e E d ito r {
/ / C t rea t es s t r in g a s " n n % " f o r d is p la y in th e P ro p erties w in d o w p u b lic S t r in g g etT ex t F ro m V a lu e( o b je c t v a lu e) {
r e tu rn V a lu e .to S t r in g ( V a lu e .to In t(v a lu e)) + " % " ;
}
// C o n v e rts s t r in g in fo rm a t "n n % " to in te g e r .T h is m e th o d
// is r eq u ire d .
p u b lic O b je c t g etV a lu e F ro m T ex t(S tr in g t ex t ) {
S trin g s = U t ils .trim B la n k s ( tex t .rep la c e(" % " ," " ));
r e tu rn V a lu e .to O b je c t(V a lu e .to In t(s ) ) ;
}
}
为 使 用 正 确 的 编 辑 器 交 换 信 息 而 通 过 c o m .m s. w fc .c o re 提 供 的 方 法 列 表如 下
方法 说明
edit V a lu e 为 编 辑正 确 的 值提 供用 户 界 面G e tC o n s ta n tN a m e 检 索 代替 指 定 值的 常数 的 全 名G e t S ty le 返 回 样式 标 志 的位 字段
G e tT e x t F ro m V a lu e 把 值 转换 为 字 符串
G e t V a lu e s 返 回 值 的 数 组 通 常 通 过 在 循 环 中 调 用ge tT e x t F ro m V a lu e 可 以 在 P rop e r t ie s 窗口 的 一 个列 表 中显示 这 些 数 组
G e t V a lu e F ro m T e x t 从 一 个字 符 串 返回 一个 值 必须 实现 这个 方 法
Pa in t V a lu e 在 指 定的 范 围 内描 述一 个 值 的表 示法
两 个 附 加 方 法 — — g e t S ubP rope r t ie s 和g e t V a lue F rom S ubP rope r ty V a lue s — — 允 许 使 用 对 象 属 性 工 作 例 如 Fo n t 对 象 可 以 作 为 构 造 器 的 一 部 分 正 常 传 递
ge t S tyle 方 法 用 于 获 取 和 设 置 在 值 编 辑 器 中 指 定 行 为 的 标 志 有 效 的 格式 是
- S T Y L E _ NO E D IT AB L E T E XT 表 明 值 编 辑 器 不 支 持 在
g e t V a lue F rom T e xt 方 法 中 接 收 任 意 文 本 它 应 该 接 收 从g e t T ex t F ro m V alu e 返 回 的 文 本 一 般 情 况 下 这 个 格 式 将 导 致 属 性 编辑 器 禁 止 在 值 编 辑 器 类 型 的 属 性 编 辑 框 中 键 入 字 符
-
S T Y L E_ P A IN TV A L U E 表 明 实 现 pa in t V a lue 方 法 的 值 编 辑 器 一 般情 况 下 这 将 导 致 属 性 编 辑 器 描 述 值 编 辑 器 类 型 的 属 性 表 示 法
-
S T Y L E_ V A L U ES 表 明 实 现 ge t V a lu e 方 法 的 值 编 辑 器 一 般 情 况 下这 将 导 致 属 性 编 辑 器 显 示 值 编 辑 器 类 型 的 属 性 下 拉 列 表
-
S
T Y L E_ ED IT V A L U E 表 明 实 现 e d it V a lu e 方 法 的 值 编 辑 器 一 般情 况 下 这 将 导 致 属 性 编 辑 器 显 示 一 个 值 编 辑 器 类 型 的 属 性 省 略 按钮
-
S
T Y L E _ D R O P D O W N A R R O W 表 明 如 果 也 返 回S T Y L E_ ED IT V A L U E 应 该 显 示 一 个 下 拉 箭 头 而 不 是 省 略 按 钮 如果 值 编 辑 器 想 在 e d it V a lu e 中 显 示 一 个 与 启 动 模 型 对 话 框 不 同 的 下 拉列 表 这 个 格 式 是 很 有 用 的
-
S
T Y L E_ IM M E D IATE 表 明 这 个 类 型 的 值 适 合 修 改 甚 至 当 这 个 新 值不 完 善 的 时 候 也 可 以 修 改 一 般 情 况 下 这 将 导 致 一 个 属 性 编 辑 器 在编 辑 器 发 生 的 每 一 次 变 化 后 修 改 基 本 属 性 例 如 在 编 辑 框 中 输 入 的每 个 字 符
-
S
T Y L E_ P R O P ER T IES 表 明 这 个 类 型 的 值 可 以 有 能 编 辑 的 子 属 性 例如 F ont 对 象 里 的 那 些 值
-
S
T Y L E _ NO AR R A YE X P A N S ION 表 明 如 果 值 是 一 个 数 组 则 属 性 检查 器 不 能 进 入 数 组
-
S T Y L E _ NO AR R A Y M U L T IS E L E C T 表 明 如 果 值 是 一 个 数 组 则 属 性检 查 器 不 应 该 有 选 择 所 有 数 组 元 素 的 入 口
下 面 例 子 显 示 怎 样 可 以 把 一 个 模 态 对 话 框 显 示 为 自 定 义 属 性 编 辑 器 在这 个 例 子 中 可 以 看 到 IV a lu e A c c e s s 如 何 在 当 前 正 编 辑 的 编 辑 器 组 件 中提 供 一 个 获 取 和 设 置 值 的 抽 象 方 式 如 果 选 择 了 一 个 以 上 的 组 件 这 是很 有 用 的 当 通 过 IV a lu e A c c e s s 调 用 获 取 和 设 置 值 的 方 法 时 P rope r t ie s 窗 口 可 以 在 多 个 组 件 上 正 确 设 置 值 为 显 示 调 用 对 话 框 的 省 略 按 钮 这个 例 子 超 越 了 ge t S yle 方 法 并 且 在 g e t S ty le 返 回 的 位 字 段 中 设 置S T Y L E_ ED IT V A L U E
im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u til.*;
p u b lic c lass P ercent E d ito r ex te nds V a lu eE d ito r {
p u b lic v o id edit V a lu e ( IV a lu eA ccess valu eA ccess ) { P er c en tD ia lo g d ia lo g = n e w P er c en tD ia lo g ();
In t v a lu e= V a lu e .to In t ( v a lu e A c c es s .g e t V a lu e()); dialog .s e t P ercen t V a lu e(valu e);
in t r esult= d ia lo g.sho w D ialog(); if ( r es ult= = D ia logR es u lt .O K ) {
v a lu eA c c es s .s et V a lu e( d ia lo g .g et T ex t ( ) ) ;
}
}
p u b lic in t g etS t y le() {
// U sin g O R o p e ra to r se ts b itfie ld to d isp la y e llip s is b u t to n
r e tu rn s u p er. g e t t S tyle() | ST Y L E_ ED IT V A L U E;
}
}
下 面 例 子 说 明 如 何 显 示 下 拉 对 话 框 当 编 辑 属 性 时 控 件 调 用Ie d ito r H o s t .drop- D o w n D one 除 此 之 外 控 件 还 负 责 调 用 IV a lu e A c c e s s 的 se t V a lu e 方 法 如 果 用 户 以 任 何 方 式 取 消 下 拉 对 话 框 则 P rope r tie s 窗 口 将 关 闭 下 拉 列 表
im port c o m . m s . w fc .c ore .* ;
im p o r t c o m . m s .w f c.u til.*;
p u b lic c la ss P e rc e n tE d ito r e x te n d s V a lu e E d ito r {
p u b lic v o id edit V a lu e( Iv alu e A ccess va lu eA cces s ) { P ercent C ontro l contro l = n e w P ercen t C o n t rol();
in t v a lu e = V a lu e .to In t( v a lu e A c c es s .g e t V a lu e()); d ialo g .s e t P ercent V alu e( v a lu e);
IE d i to r H o s t h o s t =
(IE d itorH o st) v alu e A ccess.g e t S erv ice(IE d itorH o st.c la ss); contro l.sdt V a lu e A ccess ( v alu e A ccess);
ho s t .d ro pD o w n C o n t ro l( con t ro l) ;
}
p u b lic in t g e t S tyle ( ) {
r e tu rn s u p er. g etS ty le() | S T Y L E _ E D IT V A L U E | D R O P D O W N A R R O W ;
}
}
使 用 控 件 事 件
作 为 控 件 的 子 类 控 件 自 动 支 持 一 个 标 准 的 W ind ow s 事 件 设 置 可 以在 控 件 中 捕 获 并 且 处 理 这 些 事 件 并 可 选 择 把 它 们 传 递 到 主 应 用 程 序中 除 此 之 外 还 可 以 定 义 只 有 你 的 控 件 中 才 有 的 自 定 义 事 件 并 且 在需 要 时 激 活 它 们
用 控 件 捕 获 用 户 交 互
在 标 准 事 件 送 到 主 应 用 程 序 之 前 控 件 可 以 捕 获 并 且 处 理 这 些 标 准 事件 交 互 作 用 的 两 个 最 常 见 的 类 型 是 鼠 标 和 键 盘 事 件
捕 获 鼠 标 事 件
W F C 中 的 C on tro l 类 提 供 了 大 多 数 鼠 标 事 件 这 些 事 件 包 括m ouse M ov e m ouse U p m ouse D ow n m ouse W he e l m ouse E n te r 和m ouse L e a v e 除 此 之 外 还 可 以 选 择 接 收 单 击 和 双 击 事 件
为 了 在 控 件 中 接 收 鼠 标 事 件 可 以 超 越 所 需 的 事 件 为 把 鼠 标 事 件 传 递到 主 应 用 程 序 中 需 调 用 超 类 的 相 应 事 件 方 法
下 面 这 个 例 子 说 明 如 何 超 越 m ouse M ov e 事 件 处 理 程 序 直 接 显 示 鼠 标
的 位 置 这 个 位 置 在 传 递 到 处 理 程 序 的 M ous e E v e nt 对 象 的 x 和 y 属 性中 是 可 用 的
p ro tect ed v o id o n M o u s eM o v e( M o u s e E v e n t e) { Strin g s M s g = " " + e .x + " ," + e . y;
Th is .s e t T ex t ( s M s g ) ;
In v a l ida te ( ) ; / / R e pa in t c on tro l w h e n prop e r ty c h a n g e s
Su per .on M o u s e M o v e( e ) ; / / to m a ke it v is ible in th e ho s t
}
捕 获 键 盘 事 件
公 布 的 标 准 键 盘 事 件 是 ke y U p ke y D ow n ke y P re s s 这 些 事 件 是 为 常规 键 和 系 统 键 例 如 F1 到 F1 2 触 发 的
输 入 到 W F C 的 所 有 键 盘 都 使 用 U n ic ode 字 符 数 据 进 行 工 作 当 在 一 个不 支 持 U n ic ode 信 息 的 操 作 系 统 下 像 W ind ow s 95 运 行 时 W F C 框架 将 自 动 执 行 所 需 要 的 信 息 过 滤 生 成 U n ic ode 事 件
下 面 例 子 说 明 在 一 个 控 件 内 如 何 捕 获 键 盘 事 件 这 里 超 越 的 onK e y U p
方 法 在 把 事 件 传 递 到 主 应 用 程 序 之 前 先 把 数 值 字 符 过 滤 出 来
pro te c te d v o id onK e y U p ( k e y E v e n t e ) {
if ( e . k eydata < k ey. D 0 & & e.k e y D ata> K e y. D 9 ) {
s upe r . onK e y U p ( e ) ;
in v a lid a te(); / / R ep a in t co n t ro l w h en p ro p ert y c h a n g es
}
}
创 建 自 定 义 事 件
W F C 控 件 支 持 从 C on tro l 类 继 承 的 事 件 的 标 准 设 置 如 c lic k
m ouse D ow n ke y P re s s 等 等 控 件 自 动 公 布 这 些 事 件 并 且 在 自 己 这一 部 分 中 不 用 做 特 殊 的 处 理 就 可 以 在 主 应 用 程 序 中 使 用 它 们 除 非 想超 越 这 个 事 件 来 添 加 特 殊 功 能
注 意 有 关 创 建 事 件 处 理 程 序 的 更 多 信 息 在 主 应 用 程 序 中 接 收事 件 参 见 第 1 2 章 有 关 如 何 捕 获 标 准 事 件 并 且 在 控 件 中 处 理 它的 详 情 参 见 本 章 前 面 的 使 用 控 件 捕 获 用 户 交 互
有 时 你 可 能 想 创 建 只 在 你 的 控 件 才 有 的 自 定 义 事 件 例 如 想 让 控 件使 用 一 个 事 件 来 通 知 状 态 发 生 变 化 的 主 应 用 程 序 例 如 初 始 化 进 程 的完 成 或 者 报 告 一 个 错 误 条 件
注 意 按 照 约 定 为 标 明 属 性 值 的 变 化 需 要 利 用 下 面 描 述 的 技 术创 建 on<属 性 >Changing 和 on<属 性 >Changed 方 法 更 多 细 节 参 见本 章 后 面 的 提 供 属 性 变 化 通 知
自 定 义 事 件 依 赖 于 V isu a l J + + 委 托 技 术 为 实 现 自 定 义 事 件 需 要 创 建可 以 在 应 用 程 序 中 把 事 件 处 理 程 序 绑 定 到 事 件 的 委 托
使 用 事 件 委 托
W F C 的 事 件 模 型 使 用 委 托 把 事 件 绑 定 到 处 理 它 们 的 方 法 中 为 了 在
V isu a l J + + 中 定 义 一 个 事 件 给 E v e n 类 分 类 然 后 创 建 一 个 基 于 要 绑 定的 c o m .m s. la n g . D e le g a te 的 委 托 类 委 托 允 许 其 他 类 通 过 指 定 处 理 程 序方 法 为 事 件 通 知 注 册 事 件 出 现 时 被 调 用 委 托 调 用 绑 定 的 方 法 委 托 可 以 绑 定 到 单 个 方 法 中 或 绑 定 到 多 个 方 法 中 这 称 做 多 点 传 送
m u l t ic a s t in g 为 事 件 创 建 委 托 时 一 般 是 创 建 一 个 多 点 传 送 事 件 有 少 量 的 异 常 可 以 是 导 致 指 定 进 程 显 示 一 个 对 话 框 的 事 件 而 这 个指 定 进 程 不 能 感 觉 到 每 个 事 件 重 复 多 遍
多 点 委 托 维 护 一 个 所 绑 定 到 的 方 法 的 调 用 表 in v o c a tio n lis t 多 点 委托 支 持 一 种 组 合 的 方 法 把 一 个 方 法 添 加 到 调 用 表 中 并 且 添 加 一 个 用 来删 除 这 个 新 增 方 法 的 删 除 方 法
- 个 控 件 通 过 调 用 事 件 的 委 托 可 以 激 活 这 个 事 件 委 托 按 次 序 调 用 绑 定的 方 法 在 大 多 数 情 况 下 多 点 委 托 委 托 按 次 序 调 用 调 用 表 里 的 每个 绑 定 方 法 提 供 一 个 一 对 多 的 通 告 这 个 策 略 意 味 着 控 件 不 需 要 维 护一 个 用 于 事 件 通 告 的 目 标 对 象 表 委 托 处 理 程 序 全 部 注 册 通 告 和 注销
委 托 也 允 许 把 多 个 事 件 绑 定 到 同 一 个 方 法 中 允 许 一 个 多 对 一 的 通 告 例 如 按 钮 单 击 事 件 和 菜 单 命 令 单 击 事 件 都 可 以 调 用 相 同 的 委 托 然 后委 托 调 用 单 个 方 法 用 相 同 的 方 式 处 理 这 两 个 独 立 事 件
和 委 托 一 起 使 用 的 绑 定 结 构 是 动 态 的 可 以 在 运 行 时 把 一 个 委 托 绑 定到 调 用 号 与 事 件 处 理 程 序 相 匹 配 的 任 何 方 法 这 个 特 征 允 许 靠 条 件 建 立或 改 变 绑 定 方 法 并 且 把 事 件 处 理 程 序 动 态 附 加 到 控 件 上
创 建 自 定 义 事 件 类
如 果 想 使 用 事 件 传 递 事 件 指 定 数 据 与 C on tro l 类 的 m ouse M ov e 事 件 中x 和 y 属 性 相 似 必 须 创 建 一 个 自 定 义 事 件 类 并 且 定 义 它 的 数 据 为创 建 自 定 义 事 件 需 要 给 E v e n t 类 建 立 子 类 为 使 事 件 成 为 一 个 最 高 层的 公 共 类 它 必 须 是 在 一 个 独 立 的 ja v a 文 件 中 在 你 的 类 中 可 以 定义 成 员 来 容 纳 事 件 数 据
下 面 例 子 显 示 怎 样 创 建 一 个 简 单 错 误 事 件 类 这 个 事 件 类 有 两 个 字 段一 个 用 于 错 误 号 另 一 个 用 于 错 误 信 息 的 文 本
// E rro rE v e n t . ja v a
im p o r t c o m . m s .w f c.c o r e .* ;
pu b lic c la s s Erro r E ve n t ex tend s E v e n t{ p u b lic f in a l in t erro r N u m b er;
p u b lic fina l S t r ing err o r T ex t ;
p u b lic E rro r E v e n t ( in t e N u m , S trin g e T x t){ th is .e r r o r N u m b er = e N u m ;
th is .e r r o r T ex t = e T x t ;
}
}
创 建 委 托
为 允 许 事 件 绑 定 需 要 为 事 件 创 建 一 个 用 来 声 明 指 定 调 用 号 的 委 托 处 理程 序 类 如 果 想 把 委 托 绑 定 到 多 个 方 法 中 需 要 把 它 声 明 为 多 个 委 托
委 托 应 该 是 最 高 层 类 所 以 它 应 该 在 一 个 独 立 的 文 件 中下 面 例 子 显 示 前 面 说 明 的 E rro rE v e n t 类 的 处 理 程 序 类
// E rro rE v e n t H a n d le r .ja v a
im p o r t c o m . m s .w f c.c o r e .* ;
p u b lic f in a l m u ltic a s t d e le g a te v o id E r ro r E v e n t ( O b je c t se n d e r ,
E r ro r E v e n t ev e n t ) ;
多 点 委 托 必 须 返 回 vo id 因 为 它 们 不 能 返 回 一 个 以 上 方 法 的 结 果
实 现 自 定 义 事 件
为 在 控 件 中 实 现 自 定 义 事 件 需 要 为 主 应 用 程 序 提 供 一 个 方 式 为 事 件 注册 先 创 建 一 个 私 有 委 托 实 例 然 后 创 建 主 应 用 程 序 能 调 用 事 件 注 册 和绑 定 到 指 定 方 法 的 a ddO n< 事 件 > 方 法 如 果 是 多 点 委 托 在 a ddO n< 事件 > 方 法 中 调 用 委 托 的 组 合 方 法 用 来 把 用 户 方 法 添 加 到 委 托 调 用 表 中
下 面 例 子 显 示 怎 样 为 前 面 说 明 的 E rro rE v e n t 类 执 行 这 些 步 骤
// C rea te in s tan ce o f d e le g a te
p r iv a te E rro r E ve n t H a nd ler err = n u ll;
/ / C a ll d e legate’ s co m b in e m e th od to ad d b ind in g to in vo ca t ion list p u b lic f in a l vo id ad dO n E r r o r E v en t ( E r r o r E v ent H a nd ler ha nd ler){
err = ( E rro r E v e n t H a n d ler) D ele g a te. c o m b in e( err , h a n d ler);
}
- 般
情 况 下 还 可 以 提 供 一 个 re m o v e O n < 事 件 > 方 法 以 便 主 应 用 程 序
能 为 事 件 注 册
p u b lic f in a l vo id rem o v e O n E rror E v en t ( E r r or E v en t H a ndler ha nd ler) { err = ( E r ro r E v en t H a n d ler)D e leg a t e.r e m o v e( err, h a n d le r);
}
如 果 正 使 用 非 多 点 委 托 则 a ddO n< 事 件 > 方 法 的 语 法 很 简 单
p r iv a te E rro r E ve n t H a nd ler err = n u l l / / C rea te in stan ce of d e leg a t e
p u b lic f ina l v o id a d d O nE r r or E v en t ( E r r or E v en t H a n d ler h a n d ler) {
e r r= ha nd le r ;
}
注 意 从 控 件 得 到 的 Component 类 包 含 实 用 程 序 代 码 用 于 添 加 删除 和 激 活 事 件
在 设 计 阶 段 公 布 事 件
在 设 计 阶 段 公 布 事 件 与 公 布 属 性 相 似 首 先 创 建 标 有 新 事 件 的 类 名字 和 委 托 的 E v e n t In fo 类 的 一 个 实 例 然 后 超 越 超 类 的 ge t E v e n ts E v e nt In fo 方 法 添 加 超 类 的 存 在 事 件 然 后 再 添 加 新 事 件
注 意 事 件 名 应 该 以 一 个 小 写 字 母 开 头 如 errorEvent 除 非开 头 两 个 字 母 都 是 大 写 例 如 MIDIChildA ctivated
下 面 举 例 说 明 以 前 看 到 的 E rro rE v e n t 事 件 的 C la ssIn fo 类
pub lic s ta t ic c la s s C la s s Info e x te nds C on tro l . C la s s Info{
p u b lic sta t ic E v en t In fo err E vt = n e w E v ent Info( M y C o ntro l. class, " err or E v en t " , E r r o r E v ent H a nd ler. c lass ) ;
p u b lic v o id get E ve n ts ( IE ven ts ev e n ts ({ s u per .get E ven ts ( e v e tn s ) ;
ev e tns.a dd(errE vt);
}
}
激 活 事 件
为 激 活 事 件 需 要 创 建 事 件 类 的 实 例 然 后 把 它 传 递 到 在 类 中 定 义 的 事件 指 定 参 数 中 然 后 调 用 委 托 如 下 例 所 示
// th e e r r d e le g a te m u s t a l re a d y e x is t
in t err N u m ber = 102 0 ;
S t r ing err T ex t= " Inva lid valu e ."
E rro rE v en t e = n e w E r r o r E v en t ( err N u m b er , errT ex t ) ;
e rr.in v o k e (th is ,e ) ;
W F C 中 的 大 多 数 事 件 包 括 一 个 pro te c te d< 事 件 名 > 成 员 这 个 pro te c te d< 事 件 名 > 成 员 让 子 类 超 越 事 件 并 且 确 定 通 过 调 用 supe r . on< 事 件 名 > 的位 置 而 触 发 的 事 件 顺 序 下 面 显 示 E rro rE v e n t 的 保 护 成 员
P rotecte d v o id on E r ro rE v e nt ( E r r or E v en t ev ent) { If ( err ! = n u ll) {
err .in vo ke( th is ,e v en t ) ;
}
}
如 果 包 括 保 护 成 员 可 以 在 控 件 内 通 过 调 用 事 件 而 不 是 直 接 调 用 调 用方 法 来 激 活 这 个 事 件 如 下 例 所 示
if ( v a lue >20) {
on E r ro r E ve n t ( n e w E r r o r E ven t ( 1 0 20 ,” In v a l id v a lu e” ) ) ;
}
一 个 完 整 的 例 子
下 面 显 示 一 个 完 整 的 包 括 前 部 分 描 述 的 E rro rE v e n t 事 件 的 简 单 控 件
// M y C on tro l . ja v a
im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.c o r e .* ;
im p o r t c o m . m s .la n g .D ele g a te;
pub lic c la ss M y C on tro l e x te nds C on tro l {
p riv a t e in t m y P ro p = 1 ;
p u b l ic in t g e t M y P r o p ( ) { r e tu r n m y P ro p ;
}
p u b l ic v o id s etM y P ro p ( in t v a lu e) {
/ / F ir es erro r ev e n t if p ro p ert y v a lu e ex c e e ed 2 0 0 if( v a lu e > 2 0 0 ) {
on E r ro r E v e n t( n e w E r ro r E v e n t( 1020, " In v a l id v a lu e "));
}
m y P ro p = v a lu e ;
}
pro te c te d v o id onP a in t( P a in tE v e nt p) {
s u per.on Pa in t ( p);
G rap hics g = p .grap hics ;
g .d ra w S t r in g ( g etT ex t(), 0 , 0 ) ;
}
// e v e n t se tu p to b e a b le to f ire e v e n t " E r ro r E v e n t"
p r iv a te E rro r E v e n t H a n d ler err D ele g a te = n u ll;
pub lic f in a l v o id a ddO nE r ro w E v e n t( E r ror E v e n t H a nd le r ha nd le r ) {
errD e leg a t e = ( E rr o r E v en t H a n d ler)D e leg a t e. co m b in e(e rrD e leg a t e, h a n d ler);
}
p u b lic fin a l v o id r e m o v e O n E r r o rE v en t(E r r o r E v en tH a n d le r h a n d ler){
err D eleg ate = ( E r ro r E v e n t H a n d ler) D eleg ate .re m o v e ( e r r D e le g a te ,
h a n d ler);
p ro te c t ed vo id on Err o r E ven t ( E r r io r E ve n t ev e n t ) { if ( err D e le g a te ! = n u ll) {
errD e leg a t e. in v o k e( th is , ev e n t ) ;
}
}
pub lic s ta t ic c la s s C la s s Info e x te nds C on tro l . C la s s Info{
p u b lic sta t ic fina l P r op ert y In fo m y P rop = n e w
P r op ert y In fo( M y C ontro l. class, " m y P rop " , in t . ca ls s); p u b lic v o id g etP ro p erties ( Ip ro p erties p ro p s ){
s u p er .g etP ro p erties ( p ro p s ) ; p rop s .a d d( m y P ro p ) ;
}
pub lic s ta t ic E v e n t Info e v t = ne w E v e n t Info( M y C on tro l . c la ss ,
" err o r E v en t, E rro r E v en t H a n d ler. c la s s ) ;
p u b lic v o id g e tE v e n ts ( IE v e n ts e v e n ts) {
s u per .get E ven ts ( e v en ts ) ;
e v e n ts .a d d ( e v t ) ;
}
}
}
提 供 属 性 变 化 通 告
W F C 为 标 有 属 性 值 正 在 改 变 或 已 经 改 变 的 创 建 事 件 使 用 一 个 命 名 约定
-
<
属 性 名 > C ha ng in g 事 件 表 明 用 来 改 变 属 性 值 的 函 数 已 经 被 调 用 一般 情 况 下 在 se t< 属 性 > 方 法 的 开 始 处 激 活 这 个 事 件 把 它 传 递 到C a n c e lE v en t 对 象 如 果 主 应 用 程 序 已 经 有 一 个 < 属 性 名 > C ha ng in g 事件 处 理 程 序 这 个 处 理 程 序 可 以 防 止 通 过 把 C a n c e lE v en t 对 象 的 取 消属 性 设 定 为 tru e 而 改 变 这 个 属 性
-
为 标 明 一 个 成 功 完 成 了 的 变 化 可 以 激 活 < 属 性 名 >C h a n g e d 事 件
注 意 数 据 绑 定 需 要 实 现 < 属 性 名 >Changed 事 件
这 些 事 件 不 是 为 提 供 数 据 有 效 性 而 设 计 的 但 是 允 许 控 件 越 过 被 编 辑 的属 性 例 如 防 止 一 个 控 件 修 改 它 的 值 数 据 有 效 性 是 在 数 据 源 上 例 如一 个 记 录 设 置 或 通 过 在 控 件 上 自 定 义 属 性 来 处 理 的
实 现 属 性 变 化 事 件 的 方 式 是 做 一 个 自 定 义 事 件 对 每 个 事 件 可 以 提 供一 个 a ddO n< 属 性 > C ha ng in g 和 a ddO n< 属 性 > C ha ng e d 方 法 以 及 相 应 的re m o v e O n 方 法 还 可 以 创 建 保 护 的 on< 属 性 名 > C h a n g in g 和 on< 属 性
> C ha ng e d 方 法 on< 属 性 名 > C ha ng in g 通 常 使 用 一 个 C a n c e l E v e n t 对 象
允 许 停 止 这 个 变 化 有 关 创 建 这 些 方 法 的 细 节 参 见 本 章 前 面 的 创 建自 定 义 事 件
下 面 举 例 说 明 怎 样 为 调 整 属 性 包 括 属 性 通 告
p u b lic v o id s e tA lig n m e n t( in t v a lu e ) {
if ( a lign m e nt ! = valu e) {
C a n c el E v e n t e = n e w C a n c e lE v en t (); o n A lig n m en tC h a n g in g ( e);
if ( ! e. ca n c el) {
a l ig n m en t = v a lu e ;
in v a lid a te(); / / R ep a in t co n t ro l w h e n p ro p erty ch a n g es onA l ig n m e n t C h a n g ed(E v ent.E M P T Y ) ;
}
}
}
}
p r iv a te E v en t H an d le r eA l ig n C h an g e d = n u l l ;
p u b lic f in a l vo id ad dO n A lig n m e nt C h an g ed(E v ent H an dler h a n d ler) {
e A l ign C h a n ge d = ( E ven t H a n d ler) D e leg a t e . co m bine( e A lig n C h a n g ed , hand ler);
}
pu b lic f in a l v o id r e m o ve O n A lig nm e n t C h a nged ( E v e n t H a n d ler h a nd ler) {
e A ligh C h an g ed = (E v e nt H a n d ler) D e le gate.r em ov e( eA l ig n C h a n g e d, han d ler);
}
pro tect ed vo id o n A lig nm e n t C h a ng ed ( E ve n t ev e n t ) { if ( e A l ig n C ha ng ed ! = nu ll){
e A lig n C h a n ged .in vo ke( th is , ev e n t ) ;
}
}
p r iv a te C a n c e l E v en t H an d le r eA l ig n C h an g e in g = n u l l ;
p u b lic f in a l vo id ad dO n A lig n m e nt C h an gin g ( C a n cel E v ent H a n d ler han d ler) {
e A lign C h an ging = ( C a n cel E v e n t H a n d ler) D e le gate. c o m b in e(eA l ig nC h a ng in g, h a n d ler);
}
pu b lic f in a l v o id r e m o ve O n A lig nm e n t C h a ng in g ( C a nc e lE v e n t H a n d ler h a nd ler){
e A l ig nC ha n g in g =
( C a n c e lE v e n t H a nd le r ) D e le g a te .re m o v e ( e A l ig nC ha n g in g , ha nd lde r ) ;
}
pro tect ed vo id o n A lig nm e n t C h a ng in g ( C a nc e l Ev e n t ev e n t ){ if ( e A lignC han g in g != nu ll){
e A l ig n C h a n g ing . inv oke( th is . ev e n t ) ;
}
}
pub lic s ta t ic E v e n t Info e i A l ig nC ha ng e d = ne w E v e n t In fo( M y C on tro l .c la ss,
" o nA l ign m en t C h an g e d " , E v en t H a n d ler. c la s s ) ;
p u b lic s tatic E v en t In f o eiA lignC han g ing = n e w E v ent Info( M y C o n t ro l .cla s s, " o nA l ign m en t C h an g ing " , E v en t H a n d ler. c la s s ) ;
p u b lic v o id g e tE v e n ts ( IE v e n ts e v e n ts){
s u per.get E v en ts ( e v en ts ) ;
ev en ts .a dd(eiA lig n C han g ed ) ; ev en ts .a dd(eiA lig n C han g ing);
}
自 定 义 控 件
除 了 定 义 控 件 成 员 外 可 以 通 过 自 定 义 控 件 来 定 义 它 的 的 功 能
定 义 控 件 的 显 示
在 控 件 中 , 可 以 写 代 码 来 确 定 和 修 改 控 件 的 可 视 表 示 以 下 部 分 提 供 有关 控 件 显 示 的 背 景 信 息 以 及 如 何 管 理 的 信 息
控 件 维 数
与 控 件 关 联 的 有 三 个 主 要 维 数 边 界 客 户 和 显 示 坐 标 控 件 的 边 界 是外 部 窗 口 控 件 的 坐 标 边 界 总 是 在 父 客 户 坐 标 中 表 示 这 就 是 说 与 父客 户 的 维 数 有 关
客 户 坐 标 是 控 件 可 以 画 进 去 的 区 域 范 围 客 户 控 件 区 域 总 是 以 0 0
为 起 点 并 且 在 属 于 控 件 区 域 的 内 部 客 户 的 基 础 上 扩 大 客 户 坐 标 不 包 含
非 客 户 区 域 如 应 用 程 序 到 窗 口 的 边 界 例 如
W S _ B OR D E R ,W S _ E X _ C L IE NT E D G E 以 及 最 上 层 窗 口 的 标 题 栏
显 示 坐 标 是 实 际 定 义 子 控 件 显 示 区 域 的 坐 标 显 示 坐 标 能 够 定 义 比 客 户坐 标 大 的 区 域 在 客 户 坐 标 和 显 示 坐 标 之 间 不 同 的 很 好 的 例 子 就 是 带 有自 动 滚 动 的 窗 体 当 自 动 滚 动 在 窗 体 中 启 用 时 窗 体 的 显 示 大 小 能 够 变得 比 客 户 的 尺 寸 大 在 实 际 窗 体 中 的 结 果 比 物 理 窗 口 要 大 一 些 当 在 窗体 上 移 动 滚 动 条 时 显 示 坐 标 改 变
注 意 因 为 控 件 的 边 界 总 是 在 父 客 户 坐 标 中 当 窗 体 滚 动 时 子 控件 的 边 界 将 改 变 以 反 映 它 们 相 对 于 父 客 户 坐 标 的 实 际 位 置
在 多 数 控 件 中 用 户 只 需 要 使 用 客 户 坐 标 如 果 编 写 转 到 主 应 用 程 序 其他 控 件 如 T a bC on tro l 控 件 的 控 件 并 且 想 要 启 用 停 靠 或 其 他 布 局机 制 时 显 示 坐 标 是 很 重 要 的
位 置 和 大 小
控 件 的 布 局 是 由 控 件 从 C on tro l 类 中 继 承 的 几 个 属 性 的 值 组 合 确 定 的
-
位 置 属 性 包 含 设 置 控 件 的 左 上 角 x 和 y 坐 标 Po in t 类
-
大 小 属 性 包 含 设 置 控 件 的 高 度 和 宽 度 的 Po in t 类
-
锚
点 属 性 固 定 一 个 和 多 个 控 件 的 边 到 它 的 容 器 中 当 该 容 器 重 新 设 置大 小 时 锚 定 的 控 件 边 也 重 新 设 置 大 小
-
停 靠 属 性 指 定 控 件 停 靠 在 主 包 容 器 的 哪 边
这 些 属 性 可 以 在 运 行 时 间 中 设 置 来 改 变 控 件 的 位 置 和 大 小
如 果 控 件 的 位 置 或 大 小 在 运 行 时 间 改 变 控 件 接 着 通 知 事 件 当 在 控 件上 改 变 的 任 何 事 情 会 导 致 它 们 重 新 应 用 任 何 布 局 时 将 激 活 布 局 事 件示 例 包 括 添 加 子 控 件 改 变 控 件 的 边 界 线 或 执 行 一 些 其 他 的 由 控 件 指 定的 事 件 如 改 变 属 性 值 等 重 置 大 小 事 件 只 有 在 控 件 的 边 界 改 变 时 激 活默 认 的 W F C 布 局 逻 辑 是 在 C on tro l .on La y out 和 F o rm . o n L a y ou tv 中 处 理停 靠 和 子 控 件 的 锚 定 应 用 在 父 的 布 局 事 件 中 因 此 一 个 面 板 将 布 局 所有 的 子 控 件 并 且 面 板 的 父 将 布 局 所 有 的 面 板
更 新 可 视 显 示
所 有 可 视 控 件 必 须 提 供 它 自 己 的 表 现 除 非 控 件 是 其 他 控 件 的 子 类 用户 必 须 通 过 超 越 onP a int 方 法 添 加 定 制 绘 制 逻 辑 到 控 件 中 调 用 超 类 的O n P a in t 方 法 来 显 示 控 件 然 后 添 加 自 己 的 逻 辑 来 定 制 显 示
onP a int 事 件 接 收 可 以 用 来 得 到 G ra ph ic s 对 象 接 口 的 P a in tE v e n t 对 象然 后 调 用 G ra ph ic s 对 象 的 方 法 来 更 新 控 件 的 显 示 下 面 的 代 码 显 示 了如 何 在 控 件 中 通 过 更 新 文 本 属 性 来 显 示 文 本 的 一 个 简 单 的 例 子
pro te c te d v o id onP a in t( P a in tE v e n t p) { su pe r . onP a in t( p ) ;
G rap hics g = p .grap hics ;
g.d ra w S t r ing ( g e t T ex t ( ) , 0 , 0 ) ;
}
W F C 中 的 G ra ph ic s 对 象 功 能 非 常 丰 富 和 完 全 用 户 几 乎 可 以 绘 制 任 何基 本 结 构 包 括 弧 形 椭 圆 矩 形 多 边 形 直 线 和 点 下 表 列 出 了 G ra ph ic s
对 象 的 常 用 属 性 和 方 法
G r a p h ic s 对象 成 员 说明
se t P e n 方 法 指 定 一 个 用 来 定 义 如 何 绘 制 直 线 和 对 象 周 围 的 边 框
Pe n 对象
se tB ru sh 方法 指定 一 个 填 充 控 件 的 B ru sh 对象 例如 在 c lea r R ec t
方法 中
se tB a c k C o lo r 方 法 指 定 在文 本 后 面显 示的 颜 色
se tT ex t C o lo r 方法 指 定 用于 文 本 的前 景色
se t F o n t 方 法 指 定 将绘 制 的 文本 的字 体
d ra w A rc 方法 绘制 一 个 椭 圆 弧
d ra w Im a g e 方法 绘 制 一幅 图 像
d ra w S tr ing 方法 显 示 一个 串 包括 支持 字 环 绕 对齐 剪切 等 等
在 W F C 中 使 用 标 准 的 W in 3 2 模 型 在 控 件 的 区 域 中 绘 制 被 禁 止 这 些有 效 地 请 求 重 新 绘 制 但 是 不 会 立 即 执 行 绘 制 进 程 在 下 一 个 空 闲 循 环中 绘 制 事 件 异 步 地 送 到 该 控 件 当 事 件 到 达 该 控 件 时 控 件 首 先 调 用eraseB a c k g ro u d 来 清 除 要 绘 制 的 区 域 绘 制 事 件 随 后 发 生 并 剪 取 到 无效 区 域
绘 制 事 件 是 合 并 的 所 以 对 于 控 件 的 多 个 无 效 区 域 控 件 将 只 接 收 一个 绘 制 事 件 控 件 接 收 的 合 并 绘 制 事 件 剪 取 到 所 有 无 效 区 域 的 结 合 部分
下 例 解 释 了 用 户 如 何 调 用 使 无 效 in v a lid a te 的 方 法 来 请 求 控 件 重 新 绘
制 它 自 己 在 这 个 实 例 中 调 用 使 无 效 的 方 法 不 用 用 来 指 出 剪 取 部 分 的
R ec tan g le 对 象 参 数 这 样 整 个 的 控 件 将 重 新 绘 制
p u b lic v o id s e tA lig n m e n t( in t v a lu e ) {
if ( ! A lig n S t yle. v a lid ( v a lu e))
t h ro w n e w W F C In v a lid E n um E x c eptio n (" v la ue" , v a lu e , A l ig n S t yle. c la s s ) ;
a lig n = v a lu e ;
in v a lid a te(); // R ep a in t co n tro l w h en p ro p ert y c h a n g es
}
注 意 如 果 修 改 多 个 属 性 或 两 次 修 改 同 一 属 性 控 件 将 不 两 次执 行 整 个 绘 制 操 作
要 强 制 绘 制 操 作 同 步 发 生 用 户 可 以 调 用 控 件 的 更 新 方 法 该 方 法 强 制控 件 立 即 执 行 所 有 未 决 定 的 绘 制 事 件
在 绘 制 时 消 除 闪 烁
要 消 除 控 件 中 的 闪 烁 用 户 应 该 考 虑 超 越 onE ra se B a c k g round 事 件 这些 事 件 的 默 认 实 现 是 使 用 b ack C o lo r 属 性 的 当 前 值 清 除 控 件 的 背 景 但是 并 不 总 是 需 要 重 新 绘 制 控 件 的 整 个 区 域 并 且 进 行 这 些 不 需 要 的 操作 时 将 会 导 致 闪 烁 当 控 件 有 大 区 域 或 是 复 杂 的 绘 制 逻 辑 时 通 常 会 出现 这 种 情 况
在 这 个 例 子 中 dra w S tr ing 方 法 用 来 在 控 件 中 放 置 文 本 如 果 背 景 没 有
被 e ra se B a c kg round 方 法 清 除 那 么 它 将 看 起 来 就 像 从 没 有 被 绘 制 一 样产 生 一 个 透 明 的 显 示
注 意 控 件 并 不 是 真 正 透 明 但 是 因 为 屏 幕 区 域 中 以 前 的 内 容 没有 重 新 绘 制 它 们 是 始 终 可 见 的
要 在 没 有 闪 烁 的 情 况 下 创 建 实 心 的 控 件 应 该 避 免 绘 制 将 要 使 用 前 景 信息 重 新 绘 制 的 区 域 的 背 景 这 样 操 作 的 最 简 单 途 径 就 是 要 确 保 onP a int 方 法 为 整 个 的 c lie n t R e c t 区 域 计 数 在 如 下 所 示 的 例 子 中 用 户 可 以 通过 超 越 onE ra se B a c k g round 事 件 指 定 该 事 件 已 被 处 理 从 而 完 全 地 跳过 背 景 绘 制 操 作
pro te c te d v o id onE ra s e B a c k g round( E ra se B a c kg roundE v e nt e v e n t) {
ev en t . han d le d = t ru e ;
}
p ro tect ed v o id o n P a in t( P a in tE v en t p ) { G rap hics g = p .grap hics ;
-
c lea r R ect( g e t C lien t R ect());
-
d ra w S t r ing ( g e t T ex t ( ) , 0 , 0 ) ;
}
这 是 在 oN P a in t 方 法 中 带 有 简 单 代 码 的 小 例 子 在 这 种 情 况 下 用 户 可能 看 不 到 超 越 onE ra se B a c k g round 事 件 的 好 处 但 是 在 自 己 的 控 件 中绘 制 的 代 码 可 能 会 更 复 杂 使 用 示 例 中 的 技 术 会 极 大 地 减 少 闪 烁
其 他 添 加 控 件 可 视 稳 定 性 的 技 术 是 双 缓 冲 用 户 在 屏 幕 上 的 图 像 在 该 技
术 中 用 户 维 护 整 个 客 户 区 域 的 位 图 并 且 随 后 创 建 一 个 基 于 图 像 的
G ra ph ic s 对 象 利 用 缓 冲 区 更 新 图 像 的 性 能 比 正 常 的 要 快
只 是 在 已 经 超 越 onE ra se B a c k g round 并 优 化 绘 制 代 码 时 及 始 终 感 到 有闪 烁 时 用 户 才 应 该 使 用 双 缓 冲 区 技 术 双 缓 冲 区 技 术 是 需 要 许 多 资 源的 操 作 因 为 用 户 要 维 护 控 件 图 像 的 附 加 副 本 对 于 大 的 图 像 这 样 做会 需 要 大 量 的 内 存 附 加 内 存 的 大 小 取 决 于 图 像 大 小 和 它 的 色 深 如果 缓 冲 区 存 储 一 个 大 的 区 域 维 护 缓 冲 区 还 会 减 缓 执 行 速 度
要 在 控 件 中 使 用 双 缓 冲 区 进 行 下 列 操 作
-
指 定 正 在 处 理 的 onE ra se B a c k g round 事 件
-
超
越 O n R e s iz e 方 法 来 创 建 一 个 新 的 缓 冲 区 来 匹 配 新 的 客 户 区 域 对老 的 缓 冲 区 进 行 处 理 使 之 在 资 源 中 释 放 也 是 一 个 好 的 方 法 用 户 还可 以 调 用 使 无 效 的 方 法 默 认 情 况 下 W ind ow s 将 只 是 使 在 重 设 大 小时 直 接 影 响 区 域 的 部 分 无 效
-
在
绘 制 代 码 中 从 缓 冲 区 中 创 建 一 个 G ra ph ic s 对 象 并 且 在 该 对 象 上执 行 所 有 的 绘 图 操 作 用 户 必 须 明 确 为 基 于 这 些 定 义 的 G ra ph ic s 对 象设 置 b ack C o lo r 和 pe n 属 性
下 例 在 控 件 中 的 客 户 区 域 中 绘 制 一 个 简 单 的 星 形 图 案 如 果不 包 括 一 个 双 缓 冲 区 控 件 的 闪 烁 会 非 常 引 人 注 目
/ / S tar.java
im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.c o r e .* ;
pub lic c la ss S ta r e x te nds C on tro l
{
/ / C r ea te b u f f er
B itm a p bu f f er = nu l l;
/ / O v errid e o n R es iz e in o r d er to r e cr ea t e b u ff er a t n e w s iz e pro tect ed vo id o n R es ize( E ven t e) {
if (b u f f er != n u l l) {
b u f f er. d is p o se(); / / F rees reso ur ces bu f f er = nu l l;
}
P o in t s = g etC l ien tS iz e();
bu f f er = ne w B itm a p ( s .x , s . y ) ;
in v a lid a te(); // F o r c es W in d o w s to r ed ra w en tir e co n t r o l s u per .on R es ize( e);
}
p ro tect ed v o id o n E ra s eB a ck g ro u n d ( E ra s eB a ck g ro u n d E v e n t ev e n t ) { ev e n t.h a n d led = t ru e ;
}
pro te c te d v o id onP a in t( P a in tE v e n t pe ) {
G rap hics g = b u f f er.g e t G rap hics ( ) ; R e c ta n g le c lien t = g etC lic en t R e c t();
// E xp lic i t ly se t ba c k C o lo r a nd pe n ba s e d on buffe r’ s v a lu e s
g.s et B ackC o lo r ( g e t B ackC o lo r ( ) ) ;
g .s et P e n (n e w P en ( g etF o r e C o lo r())); g. clea r R ect( clie nt);
in t x = 0 ; in t y= 0 ;
in t x C en t er = clien t.w id th / 2 ; in t y C en t er = clien t .h e ih g t/ 2 ;
// D raw s a s tar
f o r (; x < c lien t . w id th ; x + = 4 ) {
g.d ra w L in e( x , y ,x C e n ter, y C ent er);
}
f o r (; y < clien t . h eig h t ; y + = 4 ) {
g.d ra w L in e( x , y, x C en t er, y C en ter);
}
f o r ( ; x> = 0 ; x -= 4 ) {
g.d ra w L in e( x , y, x C en t er, yC en t er);
}
f o r ( ; y > =0; y -=4) {
g.d ra w L in e( x , y, x C en t er, yC en t er);
}
g. d isp ose();
pe .g ra ph ic s . d ra w Im a g e ( buffe r , 0, 0);
}
pub lic s ta t ic c la s s C la s s Info e x te nds C on tro l . C la s s Info {
}
}
为 控 件 添 加 位 图
作 为 控 件 的 可 视 部 分 用 户 可 以 指 定 一 个 16 16 像 素 的 位 图 到 该 控 件当 控 件 可 以 使 用 时 位 图 显 示 在 V isu a l J + + 的 工 具 箱 中 控 件 的 位 图 还为 没 有 运 行 时 表 示 的 控 件 显 示 如 计 时 器
注 意 只 有 当 控 件 作 为 一 个 W F C 控 件 使 用 时 才 使 用 位 图 如 果 作为 ActiveX 控 件 使 用 控 件 在 工 具 栏 中 显 示 一 个 标 准 的 预 定 义 的位 图
默 认 情 况 下 C la ssIn fo 对 象 加 载 具 有 相 同 文 件 名 作 为 控 件 的 任 何 位 图如 果 控 件 命 名 为 M y C o n tro l . ja v a 用 户 可 以 只 需 添 加 M y c on tro l .bm p 到M y C o n tro l . c la ss 文 件 所 在 的 目 录 中 就 可 以 将 位 图 与 它 关 联
作 为 选 择 用 户 可 以 使 用 超 越 在 C la ssIn fo 子 类 中 的 ge t T oo lboxB i tm a p 方 法 来 指 定 一 个 特 定 的 位 图 下 面 的 代 码 显 示 了 如 何 将 位 图 Ge a rs . b m p 分 配 到 控 件 中
pu b lic B it m a p get T o o lb o x B itm a p ( ) {
retu rn = n e w B itm a p (M y C o n tro l. c la s s , " G ea r s .b m p " ) ;
}
用 户 所 指 定 的 位 图 大 小 不 能 超 过 16 16 像 素 并 且 应 该 使 用 16 色 或 更少 的 颜 色 V isu a l J + + 能 够 自 动 重 新 设 置 尺 寸 不 正 确 的 位 图 大 小 但 是这 种 图 形 的 结 果 看 起 来 并 不 太 好
创 建 控 件 定 制 器
定 制 器 cu s to m iz er 是 每 个 实 例 设 计 时 间 元 数 据 的 类 型 C la ssIn fo 类定 义 指 定 到 类 的 元 数 据 相 反 定 制 器 提 供 了 访 问 到 更 高 级 的 设 计 事 件功 能 通 过 创 建 一 个 Cu s to m iz e r 对 象 用 户 可 以 添 加 功 能 到 其 控 件 中如 指 定 一 个 设 计 时 间 活 动 添 加 控 件 动 词 或 创 建 设 计 页 定 制 属 性 页 作 为 带 有 值 的 编 辑 器 这 里 有 一 个 默 认 的 c o m .m s. w fc .c o re . Ic u s to m iz e r
co m .m s . w fc .c o re .C u s to m iz er 的 实 现 用 户 可 以 超 越 在 C la ssIn fo 中 的
ge t C u s to m iz e r 方 法 来 返 回 一 个 定 制 器 的 实 例
指 定 设 计 时 间 激 活
W F C 支 持 控 件 的 设 计 时 间 激 活 如 设 计 时 间 滚 动 或 项 目 扩 充 通 过 简单 的 击 中 测 试 方 案 当 选 中 控 件 时 击 中 测 试 请 求 将 传 递 到 控 件 的 定 制器 中 如 果 击 中 测 试 返 回 值 为 真 将 认 为 控 件 在 该 位 置 是 激 活 的 利 用这 个 简 单 的 结 构 控 件 区 域 的 激 活 便 是 无 缝 的 如 选 项 卡 条 的 选 项 卡 区域
下 例 举 例 说 明 了 一 个 简 单 的 击 中 测 试 方 法 该 方 法 允 许 控 件 在 鼠 标 移 动过 控 件 顶 部 的 50 像 素 时 来 接 收 消 息
注 意 控 件 只 能 在 它 是 主 选 中 组 件 时 被 激 活 并 且 getHitTest 事件 被 激 活
im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.c o r e .* ;
pub lic c la ss M y T a bC on tro l e x te nds C on tro l {
p u b l ic s tatic class C lass Info ex te nds C o ntro l. C lassInfo { p u b l ic IC u s to m iz er g e t C u s to m z ier( O b je c t c o m p ) {
r e tu r n ( ( M y T a b C o n t ro l) c o m p ) . n e w C u s to m iz er();
}
}
p u b l ic c las s C u s to m iz er ex te n d s co m .m s . w fc . c o re .C u s to m iz er {
pu b l ic b o o lea n get H it T es t ( P o in t p t ) { if ( p t .y < 5 0 )
r etu rn t ru e ;
}
r e tu rn fa ls e ;
}
}
}
指 定 控 件 动 词
动 词 可 定 义 设 计 时 间 中 能 够 在 控 件 上 执 行 的 动 作 在 设 计 器 中 动 词 通常 显 示 在 对 应 于 该 控 件 的 快 捷 菜 单 上
要 创 建 一 个 动 词 需 细 分 subc la ss Cu s to m iz e r 类 然 后 创 建 一 个Cu s to m iz e r V e rb 对 象 该 对 象 允 许 用 户 指 定 动 词 中 的 文 本 并 且 创 建 一个 绑 定 动 词 的 动 作 到 指 定 方 法 上 的 委 托
下 例 说 明 了 如 何 创 建 一 个 调 用 A bout 的 动 词 A bou t 类 提 供 一 个 动 词在 上 下 文 菜 单 中 为 A bout 并 且 显 示 一 个 简 单 的 消 息 框 用 来 显 示Ac t io n 动 词 结 果 的 方 法 也 包 含 在 该 类 中
// A bou t . ja v a
im p o r t c o m . m s .w f c.u i.* ;
im p o r t c o m . m s .w f c.c o r e .* ;
pub lic c la ss A b out e x te nds C on tro l {
p u b l ic s tatic class C lass Info ex te nds C o ntro l.C lass In fo p u b l ic IC u s to m iz er g e t C u s to m iz er( O b je c t c o m p ) {
r e tu rn ((A b o u t ) c o m p ) .n e w C u s to m iz er();
}
}
p u b l ic cla s s C u s to m iz er ex te n d s co m . m s . w f c . c o r e .C u s to m iz er { pu b l ic C u s tom iz er V erb [ ] get V erb s ( ) {
C u s to m iz er V erb v = n e w C u s to m iz er V erb ( A b o u t ,
n e w V erb E x e cu t e E v en t Ha n d ler( Ab o u t .th is .s h o wAb o u t ) ) ; r e tu rn n e w C u s to m iz er V erb [ ] { v } ;
}
}
priv a te v o id show A bou t( O b je c t se nde r , V e rb E x e c u te E v e nt e v e n t ) {
M es s a g e B o x .s h o w ( " T h is co n t ro l w a s w r itten in W F C " , " A b o u t" , M es s a g e B o x .O K ) ;
}
}
对 于 数 据 和 委 托 用 户 还 可 以 指 定 这 些 项 选 中 和 启 用 状 态 并 将 位 图 与这 些 项 关 联 尽 管 通 常 V isu a l J + + 将 不 显 示 在 定 制 器 中 指 定 的 位 图 例如 在 快 捷 菜 单 中 其 他 宿 主 可 能 支 持 该 特 性
指 定 设 计 页
设 计 页 是 W F C 属 性 页 的 等 价 物 设 计 页 可 以 在 设 计 时 间 环 境 中 编 辑 要 执 行 一 个 设 计 页 用 户 创 建 扩 展 D e s ign P a ge 类 的 类 并 且 超 越O n R ead P ro p e r ty 和 on W r i te P rope r ty 方 法
注 意 尽 管 W F C 支 持 设 计 页 但 是 我 们 还 是 建 议 通 过 定 制 编 辑 器 动 词 和 设 计 事 件 激 活 来 为 控 件 提 供 功 能 有 关 细 节 请 见 本 章 前 面 的
创 建 定 制 属 性 值 编 辑 器 部 分
下 例 说 明 了 如 何 为 对 齐 属 性 创 建 一 个 设 计 页 对 齐 属 性 左 对 齐 居 中
右 对 齐 是 由 一 个 选 项 按 钮 组 来 执 行 的 在 onR e a d P rope r ty 方 法 中 代码 检 查 对 齐 属 性 并 且 返 回 对 象 在 设 计 页 中 设 置 的 属 性 值 在onW r i te P rop e r ty 方 法 中 代 码 再 次 检 查 对 齐 并 在 设 计 页 中 显 示 它 的 值用 于 所 有 这 些 单 选 按 钮 的 句 柄 中 调 用 se tD irty 方 法 该 方 法 标 记 该 设计 页 为 无 效 页 并 且 启 用 在 P rope r t ie s 窗 口 中 的 A pply 按 钮
// S u p e r L ab e l D P .jav a
im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u i.* ;
p u b l ic c lass S u p e r L ab e l D p ex te n d s D e s ig n P a g e {
pu blic Su p er L a b el D P ( ) { in it F o r m ( ) ;
}
priv a te v o id set A l ign ( in t v a lu e) { s w itch ( v alu e) {
ca s e A l ig n S t yle. L E F T :
ra dioB utto n1 .s e t C h eck e d( t ru e); b r ea k ;
ca s e A lig n S t y le .C ENTE R;
ra dioB utto n2 .s e t C h eck e d( t ru e); b r ea k ;
ca se A lignS t y le .R IG H T :
ra dioB utto n3 .s e t C h eck e d( t ru e); b r ea k ;
}
}
p riv a te in t g e t A lig n ( ){
in t alig n = A lignS t y le .L E F T ;
if ( rad io B u t ton1 .g e t C h eck e d()) { alig n = A lignS t y le. L E F T ;
}
els e if (ra d io B u t to n 2 .g et C h e c k ed ( ) ) { alig n = A lignS t y le.C E N T E R ;
}
els e if (ra d io B u t to n 3 .g et C h e c k ed ( ) ) { alig n = A lignS t y le.R IG H T ;
}
r e tu rn a l ig n ;
}
priv a te v o id ra d ioC l ic k e d( o b je c t se nd e r , E v e n t e ) {
s e t D ir t y();
}
pro te c te d O b je c t onR e a d P rop e r ty( S t r in g na m e ) {
if (n a m e. eq u a ls (" a l ig n m en t" )) {
r e tu r n n e w In te g er( g e t A lig n ( ) ) ;
}
r etu rn n u ll;
}
pro te c te d v o id onW r i te P rope r ty( S t r in g na m e , O b je c t v a lu e ) {
if (n a m e.eq u a ls (" a l ig n m en t" ) & & v a lu e in s ta n c eo f In t eg er) { s e t A lig n ( ( ( In te g er)v a lu e) .in t V a lu e());
}
}
C on ta ine r c o m pone n ts = ne w C on ta ine r();
G ro u p B o x g ro u pB o x 1 = ne w G ro u pB o x ( ) ;
R a dioB utton ra dioB utton1 = n e w R a d ioB utto n ( ) ; R a dioB utton ra dioB utton2 = n e w R a d ioB utto n ( ) ; R a dioB utton ra dioB utton3 = n e w R a d ioB utto n ( ) ; p riv a te v o id in it F o r m ( ) {
th is .s e t T ext(" A l ignm en t" ) ;
th is .s et A u to S ca leB a s eS iz e( 1 3 ) ;
th is .s et B o rd erS t y le(F o r m B o rd er S t y le.N O N E ); th is .s e t C li e n t S iz e( n e w P o in t( 3 0 7 , 1 3 1 ) ) ;
th is .s e t C o n tro lB o x (fa ls e); th is .s e t M a x B u tto n ( fa ls e); th is .s e t M inB utton( fa ls e);
g roup B o x 1 .se t Loc a t ion( ne w P o in t( 8 ,8));
g ro u p B o x1 .s e t S ize( n e w P o in t ( 1 28 ,1 12 ); g ro u p B o x1 .s e t T a b Index( 0);
group B o x 1 .s e t T a b S to p ( fa ls e);
g ro u p B o x1 .s e t T ext(" A lig nm e n t" ) ;
ra d ioB u tton1 .se t L oc a t ion( n e w P o in t ( 8 ,16));
ra d ioB utto n1 .s e t S iz e(n ew P o in t ( 1 1 2 ,25 ) ) ; ra d ioB utto n1 .s e t T a b In d ex ( 0 ) ;
ra d ioB utto n1 .s e t T a b S to p ( t ru e); ra d ioB utto n1 .s e t T ex t (" L eft" ) ;
ra d io B u t to n 1 .s et C h e c k ed (tru e);
ra d ioB utto n1 .a d d O n C l ick(n e w E v ent H an dler( th is .ra d ioC lick ed ) ) ;
ra d ioB u tton2 .se t L oc a t ion( n e w P o in t ( 8 ,48));
ra d ioB utto n2 .s e t S iz e(n ew P o in t ( 1 1 2 ,25 ) ) ; ra d ioB utto n2 .s e t T a b In d ex ( 1 ) ;
ra d ioB utto n2 .s e t T ex t (" C ent er" ) ;
ra d ioB utto n2 .a d d O n C l ick(n e w E v ent H an dler( th is .ra d ioC lick ed ) ) ;
ra d ioB u tton3 .se t L oc a t ion( n e w P o in t ( 8 ,80));
ra d ioB utto n3 .s e t S iz e(n ew P o in t ( 1 1 2 ,25 ) ) ; ra d ioB utto n3 .s e t T a b In d ex ( 2 ) ;
ra d ioB utto n3 .s e t T ex t ( R ig ht);
ra d ioB utto n3 .a d d O n C l ick(n e w E v ent H an dler( T h is.ra d ioC ick e d));
th is . se t N e w C o n tro ls(n e w C o n tro l [] {
gro u p B ox 1 } ) ;
group B o x 1 .s e t N e w C o n t rols( n e w C o ntro l[ ] { ra dioB u t to n3 ,
ra dioB u t to n2 , ra d ioB utto n1 } ) ;
}
}
使 用 控 件
当 创 建 了 W F C 控 件 之 后 用 户 可 以 在 主 环 境 中 使 用 想 要 使 用 的 任 何 控件
注 册 控 件
控 件 必 须 在 它 将 要 运 行 的 计 算 机 上 注 册 控 件 必 须 包 括 注 册 进 程 可 以 读取 用 来 标 识 该 控 件 的 信 息 并 且 这 些 信 息 将 放 入 该 控 件 将 要 运 行 的 计算 机 的 W ind ow s 注 册 表 中 通 过 阅 读 注 册 信 息 应 用 程 序 可 以 找 到 并
加 载 控 件
注 意 如 果 在 编 译 控 件 项 目 的 计 算 机 上 使 用 这 些 控 件 用 户 将 不 需要 注 册 这 些 控 件 编 译 进 程 已 经 自 动 注 册 了 这 些 控 件 如 果 正 在Visual J++ 中 使 用 这 些 控 件 用 户 也 不 需 要 明 确 地 包 括 注 册 信 息
主 应 用 程 序 也 需 要 一 个 用 于 控 件 的 类 型 库 .tlb 文 件 该 库 中 包 含 了有 关 控 件 成 员 的 信 息 应 用 程 序 在 类 型 库 中 读 取 这 些 信 息 用 来 知 道 控件 支 持 何 种 属 性 事 件 和 方 法 V isu a l J + + 可 以 自 动 为 在 编 译 进 程 中 的控 件 生 成 类 型 库
指 定 注 册 和 类 型 库 信 息
注 册 需 要 下 面 的 信 息
- 类 ID c ls id 这 是 一 个 唯 一 标 识 控 件 的 GU ID 全 局 唯 一 的 ID
控 件 自 身 和 类 型 库 中 需 要 一 个 类 ID
- 程
序 ID pro g ID 当 创 建 一 个 控 件 的 实 例 时 如
M y P ro je c t .M y C on tro l 在 主 应 用 程 序 中 所 使 用 的 名 称
如 果 已 经 使 用 了 W F C C o m pone nt B u i lde r 来 创 建 控 件 类 ID 自 动 生 成还 可 以 在 编 译 进 程 中 通 过 指 定 该 控 件 是 一 个 CO M D L L 来 自 动 获 得V isu a l J + + 创 建 的 类 ID 可 以 在 项 目 的 P rope r t ie s 窗 口 中 的 CO M C la ss e s 选 项 卡 上 选 择 该 选 项 有 关 编 译 D L L 的 细 节 见 本 书 第 十 七 章
最 后 用 户 还 可 以 手 工 创 建 并 包 含 控 件 的 类 ID 如 果 想 要 保 证 为 控 件留 下 相 同 的 类 ID 或 者 为 一 些 其 他 的 目 的 想 要 知 道 类 ID 并 且 不 想 让
V isu a l J + + 来 生 成 用 户 可 能 要 这 样 操 作 可 以 使 用 U u id g e n .e x e 这 样 的程 序 生 成 一 个 GU ID 该 程 序 是 一 个 免 费 的 实 用 程 序 在 M ic rosoft W e b 节 点 上 可 用 用 户 总 共 必 须 提 供 两 个 类 ID 一 个 用 于 控 件 而 另 一 个用 于 它 的 类 型 库
要 将 手 工 注 册 信 息 添 加 到 注 册 程 序 中 用 户 应 该 将 其 包 括 在 控 件 的 .ja v a
文 件 中 的 命 令 内 嵌 注 释 中 格 式 为
/ *
* @ co m .r eg is ter( clsid = gu id , type lib = gu id )
*/
例 如 一 个 注 册 块 应 该 看 起 来 如 下 所 示 在 例 子 中 出 现 了 折 行 是 因 为
c las s ID 太 长 但 是 在 你 的 文 件 中 不 要 将 其 折 行
/ *
* @ com .r e g is ter ( c ls id = d 0 702 fa 0 - fb 3b -11 d l- 8 f 8 8- 0 0 a a 0 0 6 00 a 54 , typelib = d 310 8a 20 - fb3 b - 1 1 d 1 - 8 f 8 8 - 0 0a a 0 0 6 00 a 5 4)
*/
当 为 控 件 编 译 项 目 时 编 译 进 程 查 找 该 块 如 果 找 到 编 译 进 程 为 该 控件 生 成 一 个 类 型 库 它 也 将 该 控 件 和 类 型 库 注 册 到 计 算 机 上
创 建 prog ID
注 册 进 程 自 动 为 使 用 下 列 格 式 的 控 件 建 立 一 个 prog ID P ro jc e t N a m e .C on tro l N a m e
例 如 控 件 项 目 可 能 为 M y P ro je c t 并 且 控 件 的 .ja v a 文 件 可 能 是
M y C o n tro l . ja v a 当 注 册 之 后 控 件 的 pro g ID 将 为 M y P ro je c t .M yc on tro l
运 行 注 册 进 程
如 果 想 要 在 编 译 某 个 控 件 的 计 算 机 上 使 用 该 控 件 则 不 需 要 来 注 册 它 ─
- 编 译 进 程 已 经 自 动 为 用 户 注 册 了 但 是 如 果 将 该 控 件 发 布 到 其 他 计算 机 上 则 必 须 在 那 里 注 册 该 控 件
如 果 已 经 将 控 件 作 为 CO M D L L 编 译 用 户 可 以 使 用 W indow s R e gsvr 3 2 . e x e 程 序 像 对 其 他 控 件 一 样 来 注 册 它 在 C o m m a n d 窗 口 使用 下 列 语 法
reg s v r 3 2 . ex e pa th / con tro l N a m e
如 果 控 件 简 单 地 编 译 为 一 个 .c la ss 文 件 则 使 用 一 个 名 为 V jre g .e x e 的 命令 行 实 用 程 序 该 程 序 包 含 在 V isu a l J + + 中 不 能 使 用 re gsvr 3 2 . e x e 来注 册 该 控 件 因 为 该 程 序 不 是 设 计 用 来 注 册 .c la ss 文 件 的 使 用 下 面的 语 法 在 命 令 行 中 注 册 控 件
V jr eg p a th / c on tr ol N a m e
当 运 行 此 命 令 时 它 注 册 M s ja v a l .d l l 作 为 该 控 件 的 服 务 器 控 件 的 名 字和 路 径 作 为 参 数
在 主 应 用 程 序 中 使 用 控 件 工 作
可 以 使 用 控 件 在 主 应 用 程 序 中 工 作 如 可 以 使 用 任 何 想 要 使 用 的 控 件 在
V isu a l J + + V isu a l B a sic 和 In te rn e t E xp lo re r 中 工 作 要 运 行 在 V isu a l J + +
中 创 建 的 任 何 控 件 下 面 列 出 的 东 西 必 须 在 主 计 算 机 上 存 在
- 使 用 V isu a l J ++ 6 .0 可 用 的 M ic rosoft V irtua l M a c h in e fo r J a v a ( V M )
可 分 配 的 VM 是 可 以 利 用 文 件 M s ja v x86 .e x e VM 的 这 些 版 本 与 In te rn e t E xp lore r 3 .02 和 4 .0 兼 容 但 是 有 些 控 件 特 性 可 能 在 3 .02 下 不 可 用
另 外 对 于 每 个 控 件 用 户 必 须 分 配 下 列 文 件
-
在 项 目 中 用 于 所 有 类 的 .c la ss 文 件
-
在 编 译 进 程 中 为 项 目 生 成 的 类 型 库 .tlb 文 件
-
在 编 译 进 程 中 为 控 件 生 成 的 .d a t 文 件
-
包 含 注 册 信 息 的 V J PR O J S .SR G 文 件
注 意 如 果 正 在 编 译 该 控 件 的 计 算 机 上 运 行 这 些 控 件 所 有 这 些 文件 都 可 以 使 用
当 在 主 机 上 安 装 了 这 些 文 件 之 后 用 户 必 须 像 在 本 章 前 面 的 注 册 控 件一 部 分 介 绍 的 那 样 注 册 该 控 件 随 后 可 以 创 建 该 控 件 的 实 例 在 许 多 主应 用 程 序 中 用 户 可 以 将 该 控 件 添 加 到 工 具 栏 中 例 如 在 V isu a l B a s ic 中 用 户 可 以 右 击 工 具 箱 选 择 C o m pone n ts 然 后 选 择 该 控 件
在 In te rn e t E xp lore r 中 使 用 控 件
要 在 In te rn e t E xp lore r 中 使 用 控 件 需 要 创 建 一 个 <O BJ E C T 元 素 在
C L A S S ID 属 性 中 按 照 下 面 列 出 的 几 种 方 法 之 一 识 别 控 件
- 按 prog ID 如 下 所 示 使 用 C L A S S ID 属 性
< O B J EC T C L A S S ID = " p ro g id :m y P ro je c t .M y C o n tro l">
</ O B J E C T >
- 按 C la ssID 如 下 所 示 使 用 C L A S S ID 属 性
<O B J E C T C L A S S ID = " c ls id :d 0 702 fa 0 - fb 3 b - lld l- 8 f 8 8 - 0 0a a 0 0 6 0 0 a 5 4 :>
</ O B J E C T >
- 使
用 控 件 名 这 种 语 法 需 要 M ic rosoft V irtua l M a c h in e fo r Ja v a 带 有V isu a l J + + 6 . 0 或 更 高 的 版 本 按 下 面 列 出 的 方 法 使 用 包 括 JA V A 名字 的 C L A S S ID 属 性
< O BJ E C T CL A S S ID = " J A V A :M y C o n t ro l" >
</ O B J E C T >
创 建 组 合 的 W F C 控 件
用 户 可 以 使 用 W ind ow s F ounda t ion C la sse s fo r J a v a ( W F C ) 组 件 模 型 来 创建 控 件 的 两 种 类 型 定 制 cu s to m iz e 和 组 合 c o m posite
定 制 控 件 源 于 c o m .m s. w fc .u i . c o n t ro l 类 用 户 可 以 在 一 个 退 出 W F C 控件 的 整 个 和 子 类 中 设 计 定 制 的 控 件 有 关 创 建 定 制 控 件 的 更 多 信 息 见在 本 章 前 面 的 编 写 W F C 控 件 一 部 分
组 合 控 件 是 包 括 其 他 控 件 的 控 件 所 有 组 合 控 件 均 源 于
co m .m s . w fc .u i . U serco n t ro l 类 因 为 U s e r C on tro l 类 是 c o m . m s . w fc .u i . F o rm 类 的 子 类 所 以 用 户 可 以 使 用 F o rm s D e sig n e r 来 布 局 定 义 组 合 控 件 的 控件
在 本 部 分 中 要 创 建 控 件 用 户 需 要 学 习 如 何
-
使 用 F o rm s D e sig n e r 来 定 义 控 件 的 布 局
-
添 加 使 用 W F C C o m pone nt B u i lde r 的 属 性 和 事 件
-
为 控 件 添 加 支 持 代 码
创 建 控 件 对 象
V isu a l J + + C o n t ro l 模 板 提 供 在 创 建 W F C 控 件 的 领 先 技 术 模 板 提 供 源于 c o m .m s. w fc .u i . U se r C o n t ro l 的 类 并 且 包 含 源 于 U s e rco n t ro l .C lass In fo 的 C la ssIn fo 类
注 意 |
在 开 始 下 面 的 进 程 之 前 |
关 闭 所 有 打 开 的 项 目 |
在 |
File 菜 |
||
---|---|---|---|---|---|---|
单 上 |
单 击 Close All |
|||||
使 用 C o n tr o l 模 板 创 建 控 件 项 目 |
||||||
|
F ile N e w |
文 件 新 建 |
菜 单 上 单 击 N e w 选 项 卡 上 扩 展 |
P ro je c t 新 项 目 V isu a l J + + P ro je c ts |
文 件 夹 |
单 击 |
C o m pone n ts 然 后 选 择 C on tro l 控 件 图 标 |
-
在 N a m e 名 称 框 中 为 项 目 输 入 一 个 名 称在 此 时 输 入 G roupC he c k
-
在
L o c a tio n 位 置 框 中 输 入 要 存 储 项 目 的 路 径 或 者 单 击 B ro w s e
浏 览 按 钮 来 定 位 到 某 个 目 录
- 单
击 O p e n 打 开
该 项 目 的 折 叠 视 图 出 现 在 P ro ject E x p lo rer 中
- 在
P ro ject E x p lo rer 中 扩 展 该 项 目 节 点
— 个 带 有 默 认 名 C on tro l 1 .ja v a 的 文 件 添 加 到 项 目 中
- 要 将
该 该 控 件 源 文 件 名 重 命 名 为 G roupC he c k . ja v a 在 P ro je c t E xp lo re r
中 可 以 右 击 该 文 件 名 然 后 单 击 R e n a m e 重 命 名
注 意 重 命 名 该 文 件 不 会 重 命 名 在 源 代 码 中 与 之 关 系 的 类 反 之 亦然 用 户 必 须 手 工 改 变 所 有 老 的 名 称 的 实 例 用 户 可 以 创 建 一 个 空的 项 目 并 且 添 加 Control 类 到 该 项 目 中 然 后 在 控 件 创 建 之 前 命名 该 控 件
下 一 步 是 来 设 计 控 件 的 布 局
设 计 控 件 的 布 局
使 用 F o rm s D e sig n e r 来 设 计 组 合 控 件 的 布 局 该 进 程 与 设 计 窗 体 布 局 的进 程 是 一 样 的 用 户 可 以 从 工 具 箱 中 添 加 控 件 在 U s e r C on tro l 的 接 口上 移 动 控 件 和 重 置 控 件 的 大 小 指 定 属 性 和 创 建 事 件 处 理 程 序
该 方 案 示 范 了 如 何 创 建 一 个 组 合 控 件 该 控 件 中 包 含 G roup B o x 控 件 和C h eck B o x 控 件 的 组 合 控 件 C h eck B o x 控 件 在 G r ou p B ox 控 件 的 左 上 角当 组 合 控 件 被 公 布 到 窗 体 上 时 用 户 还 可 以 在 G roup B o x 控 件 的 一 部 分
添 加 控 件 当 C h eck B o x 控 件 未 被 选 取 时 则 禁 用 组 合 控 件 中 的 该 组 件但 选 取 C h eck B o x 控 件 时 将 启 用 组 合 控 件 中 的 该 控 件
添 加 控 件 到 U s e r C o n tr o l
-
在 P ro ject E x p lo rer 中 双 击 G roupC he c k . ja v a 在 F o rm s D e sig n e r 中 打 开该 控 件
-
在 工 具 箱 中 选 择 W F C Co n t ro l W F C 控 件 选 项 卡
如 果 工 具 箱 没 有 显 示 在 V ie w 视 图 菜 单 中 单 击 T oo lbox
- 要 添 加 G roup B o x 控 件 到 U s e r C on tro l 中 可 以 在 工 具 箱 中 单 击
G roup B o x 控 件 然 后 单 击 U s e r C on tro l 设 计 表 面
G roup B o x 控 件 以 默 认 的 名 字 g roup B ox1 添 加
- 要 添 加 C h eck B o x 控 件 到 U s e r C on tro l 可 以 在 工 具 箱 中 单 击 C h eck B o x
控 件 然 后 拖 动 该 控 件 移 动 到 先 前 添 加 的 G roup B o x 控 件 的 左 上 角
C h eck B o x 控 件 以 默 认 的 名 字 c h e c kB ox1 添 加 确 保 C h eck B o x 控 件包 含 在 G roup B o x 控 件 中
要 节 省 屏 幕 的 空 间 重 新 设 置 U s e r C on tro l 大 小 是 重 要 的 因 为U s e r C on tro l 可 以 重 置 大 小 则 当 U s e r C on tro l 的 大 小 改 变 时 重 新 设 置在 U s e r C on tro l 中 的 控 件 的 大 小 也 是 很 重 要 的
设 置 控 件 的 大 小
- 重 新 设 置 环 绕 在 G roup B o x 和 C h eck B o x 控 件 周 围 U s e r C on tro l 的 设 计表 面 来 去 除 附 加 的 空 间 要 重 置 设 计 表 面 的 大 小 选 择 该 接 口 并 且拖 动 设 置 大 小 柄
当 U s e r C on tro l 设 计 表 面 添 加 到 窗 体 时 它 的 大 小 是 控 件 的 默 认 大 小
- 要 允 许 G roup B o x 控 件 在 U s e r C on tro l 重 置 大 小 时 也 重 置 大 小 则 在Fo rm s D e s ig n e r 中 选 择 G roup B o x 控 件 然 后 选 择 锚 定 属 性 为 To p 顶部 Le f t 左 R ig h t 右 和 Bo t to m 底 部
G roup B o x 控 件 现 在 被 锚 定 到 U s e r C on tro l 的 边 界 上
- 要 将
G roup B o x 控 件 的 正 确 显 示 提 供 给 用 户 修 改 已 经 添 加 到
U s e r C on tro l 中 的 G roup B o x 和 C h eck B o x 的 属 性设 置 控 件 的 属 性
- 要 删 除 G roup B o x 控 件 的 默 认 标 题 可 以 在 P ro p e rtie s 窗 口 中 选 择 te x t
属 性 并 且 清 除 它 的 内 容
- 要 设 置 C h eck B o x 控 件 被 选 取 的 默 认 状 态 可 以 在 Fo rm s D e s ig n e r 中选 择 该 控 件 并 且 在 P rope r t ie s 窗 口 中 设 置 ch e c k e d 属 性 为 tru e
下 一 步 是 添 加 属 性 到 控 件 中
使 用 W F C C o m p onent B u ilde r添 加 定 制 属 性
使 用 W F C C o m pone nt B u i ld e r 来 从 控 件 中 添 加 和 删 除 定 制 属 性 通 过 使用 W F C C o m pone nt B u i lde r 在 为 控 件 定 义 属 性 中 用 户 会 有 较 高 的 起点
使 用 W F C C o m p o n e n t B u i ld e r 添 加 属 性
- 在 P ro je c t E x p lore r 中 右 击 控 件 的 源 文 件 然 后 单 击 V ie w C ode 查
看 代 码
文 本 编 辑 器 打 开 并 且 显 示 控 件 的 源 文 件
-
在 C la ss O u t l in e 中 右 击 控 件 的 类 名 称 并 且 单 击 W F C C o m pone nt Bu i ld e r 要 显 示 C la ss O u t l in e 视 图 在 V ie w 菜 单 上 将 鼠 标 指 针 指向 O the r W indow s 然 后 单 击 D o c u m e n t O u tlin e
-
在 W F C C o m pone nt B u i lde r 的 P rope r t ie s 部 分 单 击 Ad d
-
在 A dd W F C P rope r ty 添 加 W F C 属 性 对 话 框 中 为 G rou p B ox 控件 按 照 下 表 格 定 义 ch ec k e d 属 性 然 后 单 击 OK
字段 值
N a m e 名称 che c ke d
D a ta T yp e 数据 类 型 Bo o le a n
Ca te g o ry 分类 B e hav ior
D e sc r ip tio n 说明 D e te rm in e s w h e th e r th e c o n t ro l's c h e c k bo x is c h e c k e d 检 测 是否 控件 的 复 选框被选 取
R e a d -o n ly P ro p e rty 只读 属 性 un c h e c k e d
D e c la re M e m b e r V a r ia b le 声 明 成 员变量
un c h e c k e d
- 在 W F C C o m pone nt B u i lde r 中 单 击 OK
W F C C o m pone nt B u i lde r 添 加 g e t C h e ck ed 和 se t C h e c k e d 方 法 到 代 码中 并 且 属 性 定 义 到 控 件 的 C la ssIn fo 类 中
下 一 步 是 添 加 代 码 到 g e t C h e ck ed 和 se t C h e c k e d 方 法 中
添 加 代 码 到 属 性 方 法 中
W F C C o m pone nt B u i lde r 创 建 方 法 和 字 段 需 要 定 义 和 执 行 定 制 的 属 性一 般 是 用 户 自 己 修 改 代 码 来 提 供 自 己 的 实 现 操 作
添 加 代 码 到 属 性 方 法 中
- 对 于 要 返 回 C h eck B o x 控 件 的 选 取 状 态 的 g e t C h e ck ed 方 法 使 用 下 面的 一 行 代 码 替 换 由 W F C C o m pone nt B u i lde r 添 加 的 代 码
retu rn ch eck B o x 1 .g e t C h eck e d();
- 对 于 要 设 置 C h eck B o x 控 件 的 选 取 状 态 并 需 要 调 用 其 他 方 法 的se t C h e c k e d 方 法 使 用 下 面 的 几 行 代 码 替 换 由 W F C Co m p o n e n t B u i ld e r 添 加 的 代 码
ch eck B o x 1 .s e t C h eck ed ( v alu e);
onC heck ed C h an g ed ( E v en t .E M P T Y ) ; en ab le C ontro ls ( this, va lu e);
这 些 代 码 基 于 传 递 到 该 属 性 的 值 来 设 置 C h eck B o x 控 件 的 选 取 状 态 该 代 码 还 调 用 o n C h eck ed C h a n g e d 方 法 并 且 生 成 到 en ab le C o n t ro ls 方
法 的 调 用 o n C h eck C h an g e d 方 法 的 调 用 用 来 切 换 定 制 事 件
c h e c ke dC h a ng e d 中 该 事 件 在 后 面 将 添 加 到 该 方 案 中
E v e n t . EM P T Y 值 传 递 到 o n C h eck ed C h a n g e d 定 义 一 个 空 的 E v e n t 对象 该 对 象 分 配 到 c h e c ke dC h a ng e d 事 件 中 en ab le C o n t ro ls 方 法 的 调用 用 来 启 用 或 禁 用 添 加 到 G roupC he c k 控 件 中 的 控 件
这 些 方 法 也 将 在 后 面 添 加 到 该 方 案 中
使 用 W F C C o m p onent B u ilde r添 加 事 件
使 用 W F C C o m pone nt B u i ld e r 在 控 件 中 添 加 和 删 除 定 制 事 件 用 户 可 以因 此 避 免 在 控 件 的 C la ssIn fo 类 中 手 工 定 义 事 件
使 用 W F C C o m p o n e n t B u i ld e r 添 加 事 件
-
在 C la ss O u t l in e 中 右 击 控 件 的 类 名 称 然 后 单 击 W F C C o m pone nt Bu i ld e r 要 显 示 C la ss O u t l in e 在 V ie w 菜 单 上 将 鼠 标 指 针 指 向 O th e r W ind ow s 然 后 单 击 D o c u m e n t O u tlin e
-
在 W F C C o m pone nt B u i lde r 的 E v e n t 事 件 部 分 单 击 Ad d
-
在 A dd W F C E v e n t 添 加 W F C 事 件 对 话 框 中 按 下 表 为 G r oupC he c k
控 件 定 义 c h e c ke dC h a ng e d 事 件 然 后 单 击 OK
字段 值
N a m e |
名称 |
c h e c k e dCha nge d |
---|---|---|
T y p e |
类型 |
Ev e n t 事件 |
Ca te g o ry 种类 Ac t io n 活动
D e sc r ip tio n 说明 当 事 件的 复 选 框选 取状 态 改 变时 发生
- 在 W F C C o m pone nt B u i lde r 中 单 击 OK
W F C C o m pone nt B u i lde r 添 加 a ddO nC he c k e d c h a n g e d
re m o v e O n C h e c ke d -C h a n g e d 和 o n C h eck ed C h a n g e d 方 法 到 代 码 中 并且 在 控 件 的 C la ssIn fo 类 中 添 加 一 个 事 件 定 义 W F C C o m pone nt B u i lde r 还 添 加 一 个 E v en t H an d le r 委 托 的 实 例 该 委 托 由 事 件 使 用
下 一 步 是 超 越 继 承 方 法
超 越 U s e r C on tro l的 方 法
使 用 C la ss O u t l in e 可 以 很 容 易 地 超 越 在 控 件 继 承 类 中 的 方 法 由 C la s s O u tlin e 创 建 的 超 越 方 法 提 供 了 实 现 C on tro l 类 中 该 方 法 的 领 先 技 术 用户 可 以 在 超 越 方 法 代 码 中 使 用 由 C la ss O u t l in e 提 供 的 注 释 用 以 快 速 地检 测 添 加 自 己 代 码 的 位 置
使 用 C la ss O u t l in e 超 越 方 法
-
在 C la ss O u t l in e 中 扩 展 类 的 节 点
-
扩 展 Inhe r i te d m e m b e r 节 点 然 后 右 击 想 要 超 越 的 方 法 名
如 果 该 方 法 可 以 被 超 越 则 快 捷 菜 单 上 显 示 O v e r r ide M e thod 超 越 方法
- 单 击 O v e r r ide M e thod
C la ss O u t l in e 为 指 定 的 方 法 添 加 一 个 方 法 定 义 到 用 户 的 源 代 码 中
- 对 于 G roupC he c k 控 件 为 ad d g e tC o n tro l g e t C o n tro l C oun t g e tC o n tro ls re m o v e 和 se t T e x t 方 法 创 建 超 越 的 方 法
下 一 步 是 添 加 代 码 到 超 越 方 法 中
添 加 代 码 到 超 越 方 法
当 已 经 使 用 C la ss O u t l in e 创 建 了 超 越 方 法 之 后 用 户 将 实 现 代 码 提 供 到方 法 定 义 中 保 留 或 是 删 除 到 超 类 的 调 用 取 决 于 用 户 如 何 执 行 超 越 方法
添 加 代 码 到 ad d 方 法
要 添 加 控 件 到 G roupC he c k 控 件 的 G roup B o x 控 件 上 用 户 可 以 添 加 代码 到 G roupC he c k 的 ad d 方 法 中 该 方 法 调 用 G rou p B ox 的 ad d 方 法这 将 导 致 代 替 G roupC he c k 控 件 的 G roupB ox 控 件 成 为 被 添 加 控 件 的 父控 件
添 加 代 码 到 ad d 方 法
- 在 添 加 代 码 代 ad d 方 法 之 前 用 户 应 该 添 加 一 个 私 有 成 员 变 量 到G roupC he c k 类 中 用 来 检 测 是 否 控 件 可 以 添 加 将 下 面 列 出 的 代 码添 加 到 G roupC he c k 类 中
priv a te boo lean m _ b R ea dy = fa ls e ;
- 添 加 下 面 的 代 码 替 代 ad d 方 法 的 定 义
if ( m _ b R ea d y ){
contro l.s e t E nab led ( ch eckB ox 1 .get C h e ck ed ( ) ) ; gro u p B ox 1 .add(contro l) ;
}
els e
sup er.add(con t ro l) ;
这 些 代 码 检 测 m _bR e a dy 成 员 变 量 是 否 设 置 为 真 该 检 查 是 用 来 预 防控 件 G roup B o x 控 件 添 加 到 它 自 身 中 如 果 m _bR e a d y 的 值 为 真 该代 码 调 用 控 件 的 se t E na b le d 方 法 作 为 参 数 传 递 到 该 方 法 中 se t E n a b le d 方 法 传 递 G roupC he c k 控 件 的 C h eck B o x 控 件 的 复 选 框 状 态 因 为 当控 件 未 被 选 取 时 该 控 件 可 以 添 加 到 G roupC he c k 控 件 中 所 以 当 添加 控 件 时 该 控 件 的 启 用 或 禁 用 的 状 态 是 非 常 重 要 的
这 些 代 码 然 后 调 用 G roup B o x 控 件 的 ad d 方 法 并 且 传 递 控 件 参 数 来将 该 控 件 添 加 到 G roup B o x 控 件 中 用 以 代 替 U s e r C on tro l 如 果m _bR e a dy 成 员 变 量 设 置 为 假 则 调 用 转 到 ad d 方 法 的 超 类 版 并 且带 有 作 为 参 数 传 递 的 控 件
添 加 代 码 到 控 件 相 关 的 方 法
所 以 用 户 可 以 访 问 在 G roup B o x 中 的 控 件 用 户 在 ge t C on tro l
g e t C o n tro l C ount 和 g e tC o n tro ls 方 法 中 提 供 代 码 用 来 调 用 G roup B o x 控件 的 这 些 代 码 的 实 现
添 加 代 码 到 控 件 关 系 的 方 法
- 在 g e tC o n tro l 方 法 的 定 义 中 输 入 下 列 代 码 来 替 换 由 C la ss O u t l in e 添加 的 代 码
retu rn group B o x 1 .g e t C o ntro l( in d ex ) ;
- 在 g e t C o n tro l C ount 方 法 的 定 义 中 输 入 下 列 代 码 来 替 换 由 C la ss O u t l in e
添 加 的 代 码
retu rn group B o x 1 .g e t C o ntro lC o unt();
- 在 g e tC o n tro ls 方 法 的 定 义 中 输 入 下 列 代 码 来 替 换 由 C la ss O u tlin e 添加 的 代 码
retu rn g r o u p B o x 1 .g et C o n tro ls ();
添 加 代 码 到 re m o v e 方 法
控 件 可 以 从 G roupC he c k 控 件 中 删 除 用 户 在 re m o v e 方 法 中 为
G roupC he c k 提 供 代 码 用 来 调 用 G roup B o x 控 件 的 re m o v e 方 法添 加 代 码 到 re m o v e 方 法
- 在 re m o v e 方 法 中 输 入 下 列 代 码 来 替 换 由 C la s s O u tlin e 已 添 加 的 代
码
if ( m _bR ea dy) {
g rou pB o x1 .re m o ve( c);
}
els e {
s u p er.r e m o v e( c);
}
这 些 代 码 检 测 m _bR e a dy 变 量 是 否 为 真 如 果 为 真 该 代 码 调 用G roup B o x 控 件 的 re m o v e 方 法 的 版 本 并 带 有 作 为 参 数 传 递 到 该 方 法的 控 件 用 于 m _bR e a dy
的 复 选 框 为 真 则 阻 止 C h eck B o x 或 G roup B o x 控 件 被 删 除 如 果m _bR e a dy 为 假 则 代 码 调 用 超 类 方 法 的 译 本 用 来 验 证 控 件 完 全 删除
添 加 代 码 到 set T ex t 方 法
G roup B o x 控 件 不 提 供 自 动 设 置 控 件 的 文 本 部 分 用 来 计 算 显 示 文 本 的数 量 的 方 法 超 越 se t T e x t 方 法 来 检 测 正 确 的 基 于 文 本 大 小 的 宽 度 来 显示 文 本 使 G roupC he c k 控 件 适 当 显 示 它 的 文 本
添 加 代 码 到 se t T e x t 方 法
- 在
se t T e x t 方 法 的 定 义 中 输 入 下 面 的 代 码 来 替 换 由 C la s s O u tlin e 添加 的 代 码
G rap hics g = ch eckB ox 1 .c r ea te G rap hics ( ) ;
C h eck B o x 1 .s et W id th(g.g e t T ex t S iz e( va lu e) .x + 2 0 ) ;
g.d isp ose();
ch eck B o x 1 .s e t T ex t ( v alu e); sup er.set T ex t ( valu e);
这 些 代 码 使 用 G ra ph ic s 类 方 法 来 检 测 指 定 的 文 本 大 小 当 检 测 文 本 的大 小 后 它 的 值 增 长 20 用 来 补 偿 在 复 选 框 和 C h eck B o x 控 件 文 本 部分 之 间 的 空 格 和 复 选 框 的 大 小 该 代 码 随 后 调 用 G ra ph ic s 类 的 d ispos e 方 法 用 来 释 放 任 何 被 分 配 的 资 源 设 置 C h eck B o x 控 件 的 文 本 属 性并 且 调 用 se t T e x t 方 法 的 超 类 版 本
下 一 步 是 添 加 新 的 方 法 到 该 控 件 中
添 加 方 法 到 该 控 件
当 正 在 开 发 控 件 时 用 户 必 须 经 常 提 供 方 法 以 执 行 控 件 中 的 动 作 对 于G roupC he c k 控 件 用 户 添 加 一 个 方 法 用 来 根 据 C h eck B o x 控 件 禁 用 或启 用 包 含 在 G roup B o x 控 件 中 的 控 件 此 方 法 从 se t C h e c k e d 方 法 中 调 用
添 加 方 法 控 件
- 添 加 下 面 的 方 法 定 义 到 G roupC he c k 控 件 的 源 代 码 中
p u b lic v o id en ab le C ontro ls ( c on t ro l start. B o o lea n enab le) { f o r ( in t i = ; i < s ta r t .g etC o n tro lC o u n t(); i+ + ) {
C ontro l c = start.get C o n t ro l( i)
if( c == g r o u pB o x 1 || c = = ch e c k B o x1) {
co n t in u e ;
}
c .s et E n a ble d ( en a ble);
en a b leC o n tro ls (c , en a b le);’
}
}
en ab le C o n t ro ls 方 法 接 收 一 个 控 件 和 一 个 布 尔 值 用 来 确 定 所 包 含 的控 件 是 否 应 该 禁 用 或 启 用 当 该 方 法 由 se tc h e ck ed 方 法 调 用 时 它 传递 当 前 G roupC he c k 控 件 的 一 个 实 例
en ab le C o n t ro ls 方 法 开 始 是 循 环 通 过 在 sta r t 控 件 参 数 中 包 含 的 控 件 在 fo r 循 环 中 代 码 使 用 带 有 fo r 循 环 当 前 索 引 的 g e tC o n tro l 方 法 得 到包 含 的 控 件 如 果 控 件 不 是 G roupC he c k 控 件 的 G rou p B ox 或 C h eck B o x 控 件 该 代 码 启 用 或 禁 用 基 于 启 用 参 数 的 值 的 指 定 控 件 任 何 包 含 在这 些 控 件 中 的 控 件 随 后 通 过 e n a b le C o n t ro ls 的 递 归 调 用 被 启 用 或 禁用
下 一 步 是 添 加 代 码 到 构 造 器 中
添 加 代 码 到 构 造 器
要 为 控 件 提 供 初 始 设 置 可 以 添 加 代 码 到 构 造 器 中 对 于 G roupC he c k
控 件 用 户 添 加 控 件 添 加 到 窗 体 时 设 置 属 性 的 代 码
添 加 代 码 到 构 造 器
- 使 用 下 面 的 代 码 替 换 在 构 造 器 中 用 于 G roupC he c k 控 件 的 代 码
s u p er ();
in it F o r m ( ) ;
s etS ty le( th is .S T Y L E _ A C C E P T S C H IL D R E N , tru e) ; m _ bR ea dy = t ru e
这 些 代 码 将 G roupC he c k 控 件 样 式 设 置 为 接 收 子 控 件 代 码 还 将 私 有变 量 m _bR e a dy 的 值 设 置 为 tru e 这 样 G rou pC he c k 控 件 的 ad d 方 法知 道 该 控 件 已 经 初 始 化 完 毕 并 且 可 以 接 收 添 加 到 G roup B o x 控 件 中的 控 件
下 一 步 是 编 译 该 控 件
编 译 控 件
要 使 用 该 控 件 用 户 必 须 编 译 它 当 控 件 编 译 后 用 户 可 以 将 其 添 加 到工 具 箱 中
编 译 控 件
- 在 Bu i ld 编 译 菜 单 上 单 击 Bu i ld
所 有 编 辑 错 误 或 消 息 出 现 在 T a sk L ist 中 双 击 在 Ta sk L is t 中 的 某 个错 误 可 以 将 插 入 点 移 动 到 在 Te x t 编 辑 器 中 产 生 该 错 误 的 代 码 处
- 改 正 错 误 并 且 重 新 编 译 控 件
下 一 步 是 调 试 控 件
调 试 控 件
当 编 译 控 件 之 后 可 以 测 试 和 调 试 该 控 件 来 确 保 该 控 件 是 否 如 期 操 作 要 做 到 这 些 应 该 添 加 控 件 到 工 具 箱 中 添 加 窗 体 到 项 目 中 然 后 添 加该 控 件 到 该 窗 体 对 于 G roupC he c k 方 案 来 说 用 户 还 可 以 添 加 控 件 到G roupC he c k 控 件 并 添 加 一 个 用 于 该 控 件 的 事 件 处 理 程 序 随 后 编 译并 且 运 行 该 控 件
添 加 控 件 的 工 具 箱
当 编 译 控 件 之 后 为 了 要 使 用 该 控 件 应 该 将 其 添 加 到 工 具 箱 中添 加 控 件 到 工 具 箱
-
右 击 工 具 箱 然 后 单 击 C u s tom iz e T o o lbox 定 制 工 具 栏
-
单 击 W F C Co n t ro ls W F C 控 件 选 项 卡 并 且 选 择 要 添 加 的 控 件 名对 于 本 方 案 来 说 单 击 G roupC he c k 控 件
-
单 击 O K
添 加 窗 体 到 项 目
要 测 试 和 调 试 控 件 用 户 应 该 添 加 一 个 窗 体 到 项 目 中
添 加 窗 体 到 项 目
- 在 P ro je c t E x p lore r 中 右 击 该 项 目 名 称 将 鼠 标 指 向 Ad d 然 后 单 击
A dd F o rm 添 加 窗 体
-
单 击 Fo rm 图 标
-
在 N a m e 框 中 输 入 用 于 该 窗 体 的 名 称
要 确 保 输 入 的 窗 体 名 称 不 是 G roupC he c k 这 样 该 窗 体 的 源 文 件 将不 会 与 用 户 控 件 的 名 称 有 冲 突
- 单 击 O p e n
带 有 指 定 名 称 的 窗 体 添 加 到 项 目 中 并 且 在 Fo rm s D e s ig n e r 中 打 开
添 加 控 件 到 窗 体
用 户 添 加 控 件 到 窗 体 中 来 测 试 该 控 件添 加 控 件 到 窗 体
-
选 择 该 窗 体
-
在
工 具 箱 中 双 击 要 添 加 的 控 件控 件 添 加 到 窗 体 的 中 间
添 加 控 件 到 G ro u p C h e c k 控 件
要 确 保 G roupC he c k 控 件 完 全 成 为 添 加 到 其 中 的 控 件 的 父 控 件 用 户 可以 添 加 W F C 控 件 到 G roupC he c k 控 件 中
添 加 其 他 控 件 到 G r o u p C h e c k 控 件
1. 在 该 窗 体 上 |
选 择 G roupC he c k 控 件 |
||
---|---|---|---|
2. 在 工 具 箱 中 |
双 击 某 个 控 件 将 指 定 的 控 件 添 加 到 |
G roupC he c k |
控 件 |
的 中 间
创 建 事 件 处 理 程 序
G roupC he c k 控 件 包 含 一 个 定 制 的 事 件 处 理 程 序 名 为 c h e c ke dc h a ng e d 当 包 含 在 G roupC he c k 控 件 中 的 C h eck B o x 控 件 被 选 中 或 放 弃 选 中 时 该 事 件 被 触 发 要 确 定 是 否 该 事 件 是 否 适 当 触 发 用 户 可 以 添 加 一 个 用于 c h e c ke dC h a ng e d 事 件 的 事 件 处 理 程 序 到 窗 体 中
添 加 用 于 ch e c ke d C h a n g e 事 件 的 事 件 处 理 程 序
-
在 P rope r t ie s 窗 口 中 单 击 E v e n ts 工 具 栏 按 钮
-
要 显 示 G roupC he c k 控 件 的 事 件 在 窗 体 上 选 择 G rou pC he c k 控 件或 者 在 P rope r t ie s 窗 口 中 选 择 G roupC he c k 控 件 的 名 称
-
双 击 c h e c ke dC h a ng e d 事 件 来 创 建 带 有 默 认 方 法 名 的 事 件 处 理 程 序
Te x t 编 辑 器 打 开 一 个 空 的 事 件 处 理 程 序
要 确 定 c h e c ke dC h a ng e d 事 件 是 否 触 发 可 以 添 加 代 码 到 该 事 件 处 理 程序 中 用 来 在 每 次 事 件 触 发 时 在 窗 体 上 显 示 一 个 消 息 框
为 事 件 处 理 程 序 添 加 代 码
- 在 该 事 件 处 理 程 序 的 定 义 中 添 加 下 面 的 一 行 代 码
m essage B o x .sho w (" T h e ch eck e d C ha ng ed ev en t w a s t r ig g ered . " )
编 译 并 测 试 控 件
当 已 经 将 控 件 添 加 到 窗 体 并 添 加 控 件 到 G roupC he c k 控 件 中 及 添 加用 于 控 件 的 c h e c ke dC h a ng e d 事 件 的 事 件 处 理 程 序 之 后 用 户 可 以 编 译并 运 行 该 项 目
编 译 和 运 行 窗 体
-
在 Bu i ld 菜 单 上 单 击 Bu i ld 如 果 收 到 任 何 编 译 错 误 或 消 息 改 正 错误 并 重 新 编 译 项 目
-
单 击 在 D e bug 菜 单 上 的 S ta r t
因 为 用 户 正 在 第 一 次 运 行 该 项 目 并 且 由 于 该 项 目 有 两 个 .ja v a 文 件则 显 示 P ro je c t P rope r tie s 对 话 框
-
在 L a unc h 选 项 卡 上 选 择 D e fa u l t 选 项 按 钮
-
当 项 目 运 行 时 指 定 Fo rm 1 将 加 载
关 于 P ro ject 属 性 的 详 细 信 息 请 参 见 第 一 章 的 P ro je c t 选 项
当 该 项 目 运 行 时 用 户 可 以 操 作 该 控 件 用 来 确 定 该 控 件 是 否操 作 正 确
在 运 行 时 间 测 试 该 控 件
- 在 G roupC he c k 控 件 中 单 击 复 选 框
— 个 消 息 框 显 示 出 来 通 知 用 户 c h e c ke dC h a ng e d 事 件 触 发 每 次 当复 选 框 的 选 取 状 态 改 变 时 该 事 件 发 生 包 含 在 G roupC he c k 控 件 中的 控 件 的 启 用 或 禁 用 取 决 于 该 控 件 的 选 取 状 态
有 关 将 W F C 控 件 作 为 Ac t iv e X 控 件 输 出 的 更 多 信 息 见 本 书 的 第 16 章中 的 创 建 和 导 入 Ac t iv e X 控 件
第 14 章 在 Ja v a 中 编 制 动 态 H T M L
通 过 使 用 M ic rosoft In te rn e t E xp lo re r 4 .0 M ic rosoft 推 出 了 一 种 新 型 的HTM L 对 象 模 型 内 容 提 供 者 可 以 用 它 随 时 有 效 地 操 作 HT M L 对 象 的属 性 现 在 这 个 对 象 模 型 基 本 上 已 经 可 以 通 过 使 用 脚 本 技 术 来 访 问 了利 用 W ind ow s F ounda t ion C la sse s fo r J a v a W F C 框 架 的 c o m .m s. w fc .h tm l 软 件 包 可 以 从 一 个 Ja va 类 中 访 问 W e b 页 中 的 D y n a m ic H T M L
D H T M L
本 章 包 含 下 面 的 主 题
-
c o m .m s. w fc .h tm l 软 件 包 介 绍
-
使 用 in it F o rm 方 法
-
理 解 D h E lem en t 类
-
使 用 包 容 器
-
处 理 事 件
-
使 用 动 态 样 式
-
使 用 动 态 表
-
在 服 务 器 上 使 用 c o m .m s. w fc .h tm l 软 件 包
快 速 开 始
为 了 帮 助 用 户 通 过 使 用 c o m .m s. w fc .h tm l 软 件 包 来 开 始 运 行 Ja v a 和D H T M L 这 里 给 出 了 创 建 简 单 的 D H T M L 对 象 和 添 加 动 态 行 为 的 基 本执 行 步 骤 然 后 这 并 不 是 本 节 的 全 部 内 容 它 还 设 置 本 主 题 的 其 余 部分 和 样 本 的 步 骤 当 使 用 c o m .m s. w fc .h tm l 软 件 包 时 有 如 下 5 个 基 本步 骤
- 通 过 从 F ile 菜 单 中 选 择 N e w P ro je c t 然 后 从 W e b P a g e s 子 菜 单 中 选择 C ode - b e h in d H T M L 命 令 来 创 建 新 项 目
这 就 产 生 了 一 个 包 含 名 为 C la ss1 的 类 的 对 象 该 对 象 扩 展D h D o c u m e n t 这 些 类 描 述 动 态 的 HTM L 文 档 加 入 初 始 化 代 码 到in it F o rm 方 法 中 可 以 控 制 文 档 的 内 容 和 行 为
通 过 做 下 面 的 工 作 可 以 扩 展 文 档 的 行 为
-
创 建 新 的 元 素 例 如 D h B u tto m 或 创 建 描 述 文 档 中 HT M L 页 上 的 现 有 元 素 的 元 素 对 象
-
对 一 些 元 素 挂 上 事 件 处 理 程 序
-
在 C la ss. in it F o rm 方 法 中 使 用 se t N ew E le m en ts 方 法 添 加 新 的 元 素并 且 使 用 se t B oundE le m e n ts 方 法 连 接 任 何 一 个 现 有 元 素
-
编
写 在 步 骤 3 中 挂 上 的 事 件 处 理 方 法所 创 建 的 文 档 看 起 来 如 下 所 示
im p o r t c o m . m s . w fc .h tm l .* ;
im p o r t c o m . m s .w f c.c o r e .* ; im p o r t c o m . m s .w f c.u i.* ;
p u b l ic c lass C lass 1 ex te n d s D h D o cu m e n t
{
pu blic C la s s 1 ( )
{
in it F o r m ( ) ;
}
// S tep 2 : c reate o b je c ts to re p resen t a n e w e lem e n ts…
D h B u tto n n e w E le m = n e w D h B u tto n ();
/ / … as w e l l as e lem ents th at alrea d y ex is t in th e H T M L p a g e . D h T ext ex is t E le m = ne w D h T ex t( ) ;
p riv a te v o id in it F o rm ( )
{
// S e t p ro p erties to ex is tin g e le m en t s a n d n e w ly a d d ed e le m e n ts . n e w E le m .s etT ex t (" h e l lo w o r ld " ) ;
ex is tE le m .s etB a c k C o lo r ( C o lo r .B L U E );
/ / S tep 3 : h o o k up an ev ent ha nd ler to y o ur ob je c t
new E le m .a d d O nC lick( n ew E v en t H a n d ler( this. on C lic k B utton);
// S tep 2 : cre a te an o b je c t to re p resen t a n ex is tin g e lem en t
ex is tE le m = n e w D h T ex t();
// S tep 4 : ca l l s e t N ew E lem en ts w i th an arra y o f n e w e lem e n ts
s e t N ew E lem en t s ( n ew C o m p o n en t [ ] { n e w E le m } ) ;
}
// S tep 4 : ca l l b in d N e w E lem e n ts w i th an a r ra y o f ex is t in g e lem en ts
s e t B o u n d E le m en ts ( n e w D h E le m e n t[] { ex is tE le m .s etB in d ID (" S a m p le" ) } ) ;
}
/ / S tep 5 : im p lem ent your ev en t ha n d ler
p r iv at e vo id on C l ic k B utton( O b je c t send er, E v en t e) { ex is tE le m .s etT ex t(" H e llo ,w o r ld ");
}
}
用 来 练 习 的 Ja va 部 分 已 经 完 成 其 他 部 分 是 HTM L 的 代 码 下 例 显 示了 由 C ode - b e h in d H T M L 对 象 模 式 产 生 的 HT M L 文 档 的 简 化 版 本 这 里有 两 个 连 接 HTM L 到 用 户 项 目 中 的 代 码 的 元 素
- < O B J EC T> 标 记 加 载 c o m .m s . w fc .h tm l .dh M odu le 类 该 类 通 过 Ja v a 的
V irtu a l M a c h in e fo r J a v a 实 例 化
- < O B J EC T> 标 记 带 有 一 个 名 为 CO D E C L A S S 的 参 数 参 数 的 值 就 是 扩展 D h D o c u m e n t 的 用 户 类 的 名 称
<H T M L >
< B O DY>
< O B J E C T class id = " ja v a: co m . m s . w f c .h t m l. D h M o d u le "
h e ig h t= 0 w id th = 0 … V IE W A S T E X T >
<PA R A M N A M E =C A B B A SE V A L U E = M y Proje c t>
<PA R A M N A M E =C O D EC L A SS V A L U E=C la s s 1 >
</ O B J E C T >
< s pa n id = S a m p le > < /s p a n > |
|||
---|---|---|---|
< !-- In s ert y o u r o w n H T M L h er e-- > |
|||
< / B O DY> < / H T M L > |
|||
打 开 In te rn e t E xp lore r 4 .0 |
将 其 指 向 用 户 的 |
HTM L 文 件 |
然 后 可 以 看 到 |
应 用 程 序 的 运 行 |
使 用 in it F o rm 方 法
在 W F C 中 用 于 所 有 用 户 界 面 编 程 的 编 程 模 型 中 in it F o rm 方 法 起 着 重要 的 作 用 当 使 用 基 于 W in 3 2 应 用 程 序 的 V isu a l J + + F o rm s D e sig n e r 时在 代 表 用 户 主 窗 体 的 Fo rm 派 生 类 中 可 以 找 到 in it F o rm 方 法 在 c o m .m s. w fc .h tm l 软 件 包 中 该 方 法 可 以 在 D h D o cu m e n t - d eriv ed 类 中 找到 例 如 C la ss1 在 有 V isu a l J + + 提 供 的 代 码 在 后 的 HTM L 模 板 并 且它 由 类 的 构 造 器 调 用
用 户 将 使 用 in it F o rm 方 法 来 初 始 化 Ja va 组 件 该 组 件 代 表 用 户 想 要 访问 和 加 入 代 码 的 HTM L 元 素 当 在 Fo rm - d e r iv ed 类 中 有 in it F o rm 方 法
并 从 D h D o c u m e n t 中 的 in it F o rm 方 法 中 调 用 W F C 方 法 时 有 一 些 限 制规 则 是 用 户 只 能 调 用 设 置 属 性 的 在 in it F o rm 中 的 方 法 甚 至 用 户 将使 用 se t B oundE le m e nt 方 法 来 连 接 HTM L 页 中 的 元 素
特 别 是 这 就 意 味 着 在 in it F o rm 中 不 支 持 调 用 重 新 设 置 或 删 除 属 性 或元 素 的 任 何 方 法 这 条 规 则 也 同 样 适 用 于 试 图 定 位 到 已 有 HTM L 页 上的 任 何 方 法 例 如 D h D o c u m e n t .f indE le m e nt
这 是 因 为 直 到 调 用 了 dhD oc um e n t . onD oc um e n t L oa d 方 法 已 有 的 HT M L 页 中 的 文 档 才 与 用 户 的 D h D o c u m e n t 派 生 类 合 并 用 户 可 以 使 用onD o u c m e n t L oa d 方 法 来 恢 复 属 性 并 且 操 作 或 定 位 在 已 有 的 HT M L 文档 中 的 元 素 在 服 务 器 端 的 类 中 使 用 in it F o rm 和 onD o c um e n t L oa d 方 法的 信 息 见 本 章 后 面 的 在 服 务 器 上 使 用 c o m .m s. w fc .h tm l
理 解 D h E lem en t类
元 素 是 源 于 D h E lem en t 的 对 象 是 在 c o m .m s. w fc .h tm l 软 件 包 中 所 有 用户 界 面 元 素 的 超 类 当 使 用 源 于 D h E lem en t 的 任 何 对 象 时 会 有 某 种 一致 性
-
每 个 事 件 都 有 一 个 空 的 构 造 器 因 此 用 户 能 够 使 用 一 个 新 的 语 句 实例 化 任 何 元 素 然 后 一 致 设 置 属 性 挂 接 事 件 处 理 程 序 和 调 用 方 法
-
事 件 是 非 模 态 的 设 置 属 性 或 调 用 方 法 总 是 以 任 何 顺 序 进 行 并 且 在一 些 外 部 的 状 态 或 环 境 中 它 是 无 条 件 的
-
每 个 包 容 器 都 有 一 个 带 有 最 适 合 的 安 全 类 型 元 素 的 添 加 方 法
-
在
浏 览 器 环 境 中 直 到 用 户 添 加 元 素 或 是 在 它 的 父 系 中 最 上 层 的 包容 器 元 素 到 文 档 中 时 才 可 以 见 到 它 然 而 这 只 是 一 个 假 象 不是 编 程 模 型 的 一 部 分 因 为 它 们 不 管 是 否 可 视 都 始 终 以 同 样 的 方 法来 工 作 所 以 用 户 不 需 要 改 变 编 程 元 素 的 方 法
当 调 用 D h D o c u m e n t .o nD oc um e n t L oa d 方 法 时 如 果 某 个 元 素 已 经 在 页面 上 用 户 可 以 调 用 该 文 档 的 f indE le m e nt 方 法 并 且 开 始 对 该 元 素 编程 用 户 还 可 以 从 in it F o rm 中 调 用 se t B oundE le m e n ts 并 使 用 在D h D o c u m e n t 派 生 类 中 的 元 素 来 合 并 页 上 的 已 知 元 素 f indE le m e m t 方法 有 较 好 的 性 能 但 是 要 求 首 先 调 用 onD o c um e n t L oa d
f indE le m e nt 和 se t B oundE le m e n ts 使 用 的 搜 索 规 则 假 定 用 户 想 要 绑 定 到有 特 殊 名 字 的 ID 属 性 值 的 元 素 使 用 f indE le m e nt 用 户 还 可 以 列 举 所有 在 文 档 中 的 元 素 直 到 发 现 自 己 感 兴 趣 的 某 个 元 素 为 止
使 用 包 容 器
包 容 器 就 是 能 够 容 纳 其 他 元 素 的 元 素 基 本 的 例 子 就 是 <D IV > 元 素 它可 以 包 含 任 意 的 其 他 HTM L 项 更 复 杂 的 例 子 包 括 表 单 元 格 和 文 档 本身 在 多 数 情 况 下 包 容 器 能 够 任 意 嵌 套 例 如 某 个 表 嵌 套 到 其 他 表 的单 元 格 中
包 容 器 与 其 他 元 素 相 似 它 们 使 用 ne w 语 句 来 创 建 并 且 多 数 能 够 在页 中 进 行 位 置 和 大 小 的 选 择 用 户 可 以 在 一 个 包 容 器 中 选 择 元 素 的 位 置和 大 小 并 且 可 以 设 置 它 们 的 Z -次 序 关 系 D H T M L 的 一 个 最 重 要 特 性
就 是 用 户 可 以 在 自 己 的 代 码 中 改 变 这 些 元 素 的 属 性
当 然 用 户 也 可 以 使 用 常 用 的 HTM L 布 局 规 则 来 设 置 包 容 器 中 元 素 的位 置 调 用 元 素 的 se t L o catio n 方 法 或 是 调 用 se t B ounds 方 法 来 设 置 它 的绝 对 位 置 或 者 调 用 re se t L o ca tio n 来 允 许 HTM L 布 局 引 擎 选 择 位 置 但是 必 须 放 在 HTM L 流 程 布 局 中 最 后 一 个 元 素 的 后 面
- 旦 创 建 了 一 个 包 容 器 元 素 用 户 就 可 以 通 过 使 用 S e t N ew E lem en ts 或添 加 方 法 来 添 加 元 素 到 该 包 容 器 中 这 种 结 构 遵 循 规 则 的 父 - 子 关 系 模式 元 素 可 以 是 其 他 包 容 器 添 加 到 成 为 它 的 子 包 容 器 的 包 容 器 中 事实 上 直 到 最 顶 部 不 是 任 何 其 他 包 容 器 的 一 部 分 的 包 容 器 添 加 到 文 档时 才 有 元 素 和 文 档 相 联
用 户 可 以 通 过 使 用 包 容 器 的 se t B ound 方 法 来 选 择 包 容 器 的 位 置 和 大 小例 如 创 建 包 容 器 的 语 句 如 下
D h F o rm m yfo rm = d h F o rm ();
然 后 用 户 就 可 以 在 包 容 器 上 设 置 各 种 属 性 包 括 当 鼠 标 在 面 板 上 盘 旋 时显 示 的 工 具 提 示
M y F o r m .s e t T o o lT ip(" T h is text a p pea r s w h en th e m o u s e h overs " ) ; M y F o r m .s e t F o n t (" A ria l" , 1 0 ) ;
M y F o r m .s e t B a c k C o lo r( C o lo r.R E D ) ; M y F o r m .s e t B o un d s ( 5 , 5, 10 0, 1 0 0);
最 后 用 户 可 以 将 刚 刚 创 建 的 包 容 器 加 入 到 在 D h D o c u m e n t 派 生 类 如
C la ss1 . ja v a 中 的 文 档 中
th is .a d d ( m y F o rm )
当 加 入 元 素 到 包 容 器 中 时 用 户 能 够 通 过 使 用 c o m .m s. w fc .h tm l 软 件 包中 提 供 的 常 量 集 中 的 某 个 来 指 定 元 素 在 Z 次 序 中 的 位 置 添 加 元 素 时使 用 默 认 的 大 小 和 位 置 用 户 可 以 调 用 元 素 上 的 se t B ounds 来 指 定 不 同的 大 小
D h F o rm m y O v e r L a y 1 = n e w D h F o rm ();
Dh F o r m m y O v er L a y 2 = n e w D h F o r m ( ) ;
m y O v er L a y 1 .s e t Ba c k Co lo r ( C o lo r .BLA C K ) ; m y O v er L a y 1 .s e t B o un d s ( 1 0 ,10 .5 0 .5 0 ) ;
m y O v er L a y 2 .s e t Ba c k Co lo r ( C o lo r .BLU E ) ; m y O v er L a y 2 .s e t B o un d s ( 2 0 ,25 ,5 0 .5 0 ) ;
m y F o r m .a d d ( m y O v er L a y 1 . n u ll ,D h In s ert O p t io n s .B E G IN N IN G ) ;
/ / B la ck o n to p o f blue
m y F o r m .a d d ( m y O v er L a y 2 . m y O v er L a y 1 ,D h In s ert O p t io n s .B E F O R E ) ;
/ / B lue o n to p of b la c k ( u n co m m e nt b e lo w an d co m m en t ab ov e)
// m y F o rm .a dd( m y O v e r La y 2 .m y O v e r L a y 1 ,D h In se r t O p t ions. A F T E R ) ;
在 元 素 加 入 之 后 还 可 以 使 用 se t Z In d e x 方 法 围 绕 着 Z 次 序 中 来 移 动 元素 例 如 下 面 的 语 法 没 有 清 楚 地 在 添 加 的 元 素 上 设 置 Z 次 序 但 是使 用 了 默 认 的 Z 次 序 在 所 有 其 他 元 素 的 顶 部
m yfo rm .a d d ( m y T e x t);
用 户 可 以 清 楚 地 设 置 该 元 素 为 下 面 列 出 的 形 式 这 里 的 num 是 整 数 集用 来 描 述 在 它 的 包 容 器 中 的 元 素 关 联 的 Z 次 序
m y T e x t . se t Z Inde x( num ) ;
带 有 最 小 数 字 的 元 素 是 在 Z 次 序 的 底 部 其 他 元 素 覆 盖 了 它 带 有最 大 的 数 字 的 元 素 是 在 Z 次 序 的 顶 部 该 元 素 覆 盖 了 其 他 元 素
处 理 事 件
D H T M L 程 序 中 的 许 多 元 素 都 能 触 发 事 件 c o m .m s. w fc .h tm l 软 件 包 使 用与 c o m .m s. w fc .u i 软 件 包 相 同 的 事 件 模 型 如 果 用 户 熟 悉 此 种 技 巧 就可 以 发 现 这 两 种 软 件 包 之 间 的 小 小 不 同 之 处 按 钮 就 是 一 个 很 好 的 例子 假 定 用 户 想 要 处 理 单 击 页 面 中 某 个 按 钮 时 产 生 的 事 件 下 面 列 出 的就 是 处 理 的 代 码
p u b l ic c lass C lass 1 ex te n d s D h D o cu m e n t
{
C la s s 1 ( ) { in it Fo r m ( ) ;}
D h B u tto n m y B u tto n = n e w D h B u tto n ( ) ; priv a te vo id in it F o r m ( )
{
a d d ( m y B u t to n ) ;
m y B u tto n .a d d O n C lick ( n e w E v e n tH a n d ler(th is . m y B u tto n C l ick ) ) ;
}
v o id m y B u tto n C lick ( o b je c t s e n d er, E v e n t e)
{
(( D h B u t to n ) s en d er).s et T ex t (" I’v e b e en click e d " );
}
}
在 这 些 代 码 中 无 论 何 时 按 钮 触 发 了 onC l ic k 事 件 也 就 是 当 其 被 单 击时 便 调 用 m y B u tto n C lic k 事 件 处 理 程 序 在 本 例 中 m ybu ttonC l ic k 事 件 处 理 程 序 中 的 代 码 发 挥 了 很 小 的 作 用 它 仅 仅 设 置 按 钮 上 的 标 题 为新 的 文 本
多 数 事 件 按 着 包 含 树 的 所 有 路 径 进 行 传 播 这 就 意 味 着 按 钮 的 单 击 事 件可 以 由 按 钮 的 包 容 器 和 其 本 身 看 到 尽 管 在 程 序 员 一 般 在 距 离 事 件 最 近的 包 容 器 中 处 理 事 件 这 些 事 件 的 模 型 可 能 在 一 些 特 殊 的 情 况 中 很 有用 它 提 供 给 程 序 员 灵 活 地 决 定 事 件 处 理 程 序 代 码 的 最 佳 位 置
许 多 不 同 的 事 件 能 够 被 D H T M L 中 的 事 件 触 发 并 且 能 够 以 相 同 的 方 式捕 获 它 们 例 如 要 确 定 鼠 标 通 过 按 钮 的 事 件 试 试 下 面 的 代 码 这 些代 码 捕 获 用 于 按 钮 的 m ouse E n te r 和 m ouse L e a v e 事 件
p u b l ic c lass C lass 1 ex te n d s D h D o cu m e n t
{
D h B u tto n b u tto n = n e w D h B u t to n (); priv a te vo id in it F o r m ( )
{
b u t ton.a ddO n M ous e E nter(n ew M o us e E v ent H a nd ler( th is .b utto n E nt er)); b u t ton.a ddO n M ous e L ea v e( n ew M o useE v e nt H a nd le r ( th is .b uttonE x it ) ;
s e t N ew E lem en t s ( en w D h E lem en t [ ] { b u t to n } ) ;
}
v o id b u t to n E n ter( o b je c t s en d er, M o u s eE v en t e)
{
b u t ton.s e t T ex t (" I ca n feel th at m ous e" ) ;
}
vo id bu t to n E x it ( O b je c t s e n d er , M o u s e E ve n t e)
{
b u t to n .s e t T ex t(" b u tto n " ) ;
}
}
所 有 能 够 触 发 和 捕 获 的 事 件 都 在 基 于 co m .m s . w fc .c o re .E v en t 事 件 类中 定 义
使 用 动 态 样 式
用 户 可 以 将 Style 样 式 对 象 想 象 为 独 立 的 属 性 集 合 样 式 这 个 术 语取 自 字 处 理 操 作 在 这 里 样 式 表 的 编 辑 与 用 户 的 文 档 无 关 在 库 中 使用 和 应 用 Style 对 象 是 同 样 的
例 如 老 板 告 诉 你 新 的 公 司 徽 标 颜 色 为 红 色 你 需 要 改 变 在 HTM L 页中 元 素 的 颜 色 当 然 可 以 在 元 素 上 直 接 设 置 属 性 这 是 GU I 框 架 编程 的 传 统 模 型
/ / old w a y o f d o in g th ings… D h T ext t 1 = ne w D h T ex t ( ) ; D h T ext t 2 = ne w D h T ex t ( ) ; t1 .s e t C o lo r( C o lo r.R E D );
t 1 .s et F o n t ( " a ria l" ) ;
t2 .s e t C o lo r( C o lo r.R E D ); t2 . s etF o n t ( " a r ia l" ) ;
当 然 也 可 以 使 用 派 生 的 方 式 来 节 省 时 间 例 如 可 以 考 虑 使 用 下 面 的代 码 来 改 善 这 个 问 题
// o ld w a y of do in g th in g s a l i t t le be t te r…
pu b lic c la s s M y T ext ex tend s D h T ext
{
p u b lic M y T ex t ( )
{
s e t C o lo r ( Co lo r . RE D ) ; S e t F o n t ( "a r ia l");
}
直 到 决 定 想 要 这 些 设 置 来 设 置 按 钮 标 签 选 项 卡 和 文 档 等 上 面 这 些
代 码 都 还 适 用 当 在 其 他 程 序 中 或 程 序 的 其 他 部 分 中 使 用 这 些 设 置 时用 户 就 会 发 现 还 有 很 多 的 事 情 要 做
这 个 问 题 的 答 案 就 是 Style 对 象 当 使 用 这 些 库 时 用 户 可 以 实 例 化 一个 Style 对 象 并 在 任 意 位 置 设 置 它 的 属 性
// S T E P 1 : C rea te s tyle o b jec ts .
D h S t y le m y S t y le = n e w D h S t yle();
// S T E P 2 : S e t P rope r t ie s on s tyle ob je c ts
m y S t yle.s e t C olor( C o lo r .R E D ) ; m y S t yle.s e t F o n t ( "a r ia l" ) ;
然 后 在 编 码 的 其 他 时 候 可 以 将 该 样 式 应 用 到 任 意 数 量 的 元 素 上
D h T ext t 1 = ne w D h T ex t ( ) ; D h T ext t 2 = ne w D h T ex t ( ) ;
// S T E P 3 : A pply s ty le s usin g th e se t S tyle m e thod.
t 1 .s et S tyle( m y S t yle ); t 2 .s et S tyle( m y S t yle );
当 在 公 司 中 使 用 高 级 设 置 策 略 的 动 态 特 性 的 时 候 下 面 的 程 序 行 使 用 在它 们 上 面 的 m y S tyle 集 来 设 置 所 有 元 素 的 实 例 化 用 来 改 变 它 们 的 颜色
m y S tyle . se t C o lor( C o lor. B LU E ) ;
这 里 才 是 真 正 重 要 的 部 分 在 运 行 时 所 有 这 些 都 是 有 用 的 每 次 改 变Style 对 象 时 D H T M L 动 态 运 行 并 且 改 变 所 有 的 Style 对 象 应 用 的 所有 元 素
有 关 更 多 的 信 息 见 下 一 节 理 解 Style 继 承 性
理 解 S ty le 继 承 性
如 果 样 式 与 设 置 在 页 面 上 的 设 置 有 冲 突 则 HTM L 重 现 引 擎 可 以 确 定所 要 使 用 的 样 式 例 如 如 果 元 素 直 接 设 置 了 颜 色 属 性D h E lem en t .s e tc o lo r , 那 么 就 使 用 颜 色 属 性 定 义 的 颜 色 然 而 如 果 一 个 元 素 上 有 Style 对 象 D h E le m e n t.s e tS tyle 并 且 该 对 象 有 颜 色 属
性 设 置 那 么 将 使 用 该 对 象 的 颜 色 设 置 如 果 找 不 到 某 种 颜 色 或 样 式将 使 用 带 有 元 素 的 包 容 器 D h E lem en t .g e t P aren t 相 同 的 过 程 如 果 还是 找 不 到 则 使 用 该 包 容 器 的 包 容 器 的 过 程 以 此 类 推
此 过 程 向 上 一 直 到 文 档 如 果 文 档 没 有 颜 色 属 性 设 置 环 境 浏 览 器 设置 或 一 些 其 他 环 境 设 置 决 定 要 使 用 的 颜 色
因 为 属 性 层 叠 向 下 到 包 容 层 次 所 以 该 过 程 称 为 层 叠 样 式 在 W 3 C
中 用 于 D h S tyle 对 象 的 基 础 机 制 称 为 S tyle S h eets CS S 样 式 表
使 用 动 态 表
使 用 表 通 常 与 使 用 库 中 的 任 何 其 他 部 分 没 有 什 么 不 同 应 用 到 表 的 原 则和 编 程 模 型 同 样 也 应 用 到 任 何 其 他 类 型 的 元 素 然 而 表 是 值 得 一 提 的元 素 它 重 要 而 且 常 用
要 使 用 表 应 该 建 立 一 个 D h T a b le 对 象 给 它 添 加 D h R o w 对 象 然 后在 行 上 添 加 D h C e l l 对 象 下 面 是 表 使 用 规 则
-
用 户 只 能 添 加 D h ro w 对 象 到 D h T a b le 对 象
-
用 户 只 能 添 加 D h C e l l 对 象 到 D h R o w 对 象
-
用 户 能 添 加 元 素 的 任 何 类 型 到 D h C e l l 对 象
尽 管 这 可 能 有 些 严 格 但 用 户 可 以 使 用 下 面 的 代 码 轻 松 地 创 建 一 个 包 容器 来 模 仿 grid B a g 类
im p o r t c o m . m s .w f c.h tm l.* ;
pub lic c la ss G r id B a g e x te nds D h T a b le
{
in t c o ls ;
in t c u r r C o l; Dh Ro w cu r r R o w ;
p u b lic G rid B a g ( in t c o ls )
{
th is .c o ls = co ls ;
th is .c u r r C o l = co ls ;
}
p u b lic v o id a d d ( D h E le m e n t e )
{
if ( + + th is . c u r r C o l > = co ls )
{
th is .c u r r R o w = n e w D h R o w ( ) ; s u p er .a d d ( cu r r R o w ) ;
th is .c u r r C o l = 0 ;
}
D h C ell c = n e w D h C ell();
c.a d d ( e);
th is .c u r r R ow .a dd ( c ) ;
}
}
要 使 用 G rid B a g 类 用 户 只 需 设 置 行 和 列 的 数 字 必 须 与 此 实 现 相 同 然 后 指 定 元 素 到 单 元 格 下 面 的 代 码 是 使 用 G rid B a g 的 D h D o c u m e n t 派生 类 中 的 代 码
pro te c te d v o id in i t F orm ( )
{
G r id B a g m y T a b le = n e w G r id B a g ( 5 ) ; f o r ( in t i = 0; i < 25; + + i) {
m y T a b le .a d d ( ne w D h T ext(" " + i) ) ;
s e t N ew E lem ents ( n e w D h E lem en t [ ] { m y T a b le } ) ;
}
}
使 用 库 最 强 的 功 能 之 一 就 是 表 和 Style 对 象 的 结 合 这 使 得 用 户 可 以 创建 定 制 的 报 表 生 成 器 该 生 成 器 功 能 强 大 具 有 专 业 性 的 外 观 并 且 容易 编 写 代 码
数 据 绑 定 到 表
表 也 有 数 据 绑 定 的 能 力 使 用 co m .m s . w fc .d a ta .u i .D a taS o u rce 对 象 用户 可 以 绑 定 数 据 到 表 中 如 下 面 的 简 单 代 码 所 示
.
.
.
im p o r t co m . m s . w fc. d ata.*;
im p o r t co m . m s . w fc. d ata.u i.* ;
.
.
.
v o id p r iv a te in it F o r m ( ){
D h T a b le da ta T a b le = ne w D h T a b le ( ) ;
d a ta T a b le .s etB o rd er( 1 );
d a ta T a b le .s etA u to H ea d er( tru e ) ;
D a ta S ourc e da ta S ourc e = ne w D a ta S o u rc e ( ) ;
d a ta S o u r c e .s etC o n n e c tio n S trin g ( " D S N = N o rth w in d " ) ;
data S ource.set C o m m a ndT ex t (" S E L E C T * F R O M P ro d u c t s " ) ;
/ / if you w o uld lik e to use th e ta b le on th e serv er,
// ca ll d a ta S u r c e .g etR e co r d s e t ( ) to f o r c e th e D a ta S o u r c e
//to s yn c h ro n o u s ly cr ea t e th e r e c o rd s et; o th er w is e ,
// ca ll d a ta S o u r c e .b eg in (), a n d th e ta b le w il l b e p o p u la t ed
// w h en th e r e co r d s e t is r ea d y , a s yn c h ro n o u s ly . if ( !g etS er v er M o d e() ){
d a ta S ource.b e gin();
d a ta T a b le .s e t D ataS ource( data S ource ) ;
} e ls e
d a ta T a b le.s e t D a ta S o u r c e( d a ta S o u r c e . g et R e co r d s e t ( ) );
se t N ew E lem en ts ( n ew D h E lem en t [ ] { d a ta T a b le } );
}
如 果 知 道 将 要 返 回 的 数 据 格 式 也 可 以 指 定 表 将 要 使 用 的 模 板 重 复 器 行 用 来 格 式 化 要 返 回 的 数 据 进 行 这 些 操 作 的 步 骤 如 下 所 示
- 创 建 D h T a b le 元 素
Dh Ta b le d a ta Ta b le = n e w Dh Ta b le();
- 创 建 模 板 行 并 且 将 其 设 置 到 表 中 用 户 还 可 以 有 选 择 地 创 建 标 题 行对 于 在 模 板 单 元 格 中 用 户 要 从 记 录 集 中 接 收 数 据 的 每 项 为 其 创 建 一个 D a ta B ind ing
.
.
.
D h R o w r ep ea ter R o w = n e w D h R o w();
R ep ea t er Ro w .s e t B a c k C o lo r ( C o lo r . L IG H TG RA Y ) ; R ep ea t er Ro w .s e t F o r e C o lo r ( C o lo r .B L AC K ) ;
D a ta B ind in g[] b ind in gs = n e w D a ta B in d ing[ 3 ] ; Dh C e l l c e ll = n e w Dh C e ll() ;
D a ta B in d in g [ 0 ] = n e w D a ta B in d in g ( c e l l, " tex t" , " P r o d u c t ID " ) ; rep eat er R o w .a dd( cell ) ;
c e l l = n e w Dh C e ll( ) ; .
Da ta B in d in g [ 1 ] = n e w D a ta B in d ig ( c e ll , " t ex t" , " P ro d u c t Na m e" ) ; c e l l = n e w Dh C e ll( ) ; .
c e l l.s et F o r e C o lo r( C o lo r.R E D ); c e l l.a d d ( ne w D h T ext("$ " ) ) ;
D h T ex t pric e= ne w D h T ext();
p r ic e .s e t F ont( F o nt.A N S I_ F IX E D ) ;
D a ta B in d in g [ 2 ] = n e w D a ta B in d in g ( p r ic e , " tex t" , " U n itP ric e" ) ; cell.a dd( p r ice ) ;
rep eat er R o w .a dd( cell ) ;
/ / set up th e ta b le rep eat er ro w a nd b ind in gs ta b le.s e t R ep ea t er R o w ( r ep ea t er R o w );
ta b le .s etD a ta B in d in g s ( b in d in g s ) ;
/ / crea t e a n d s e t th e h a n d er r o w
D h R o w h ea d er R o w = n e w D h R o w () ;
hea d er R o w .a dd( n e w D h C e l l( " P ro d u c t ID " ) ) ;
hea d er R o w .a dd( n e w D h C e l l( " P ro d u c t N a m e" ) ) ; hea d er R o w .a dd( n e w D h C e l l( " U n it p r ice" ) ) ;
ta b le .s e t H ea der R ow ( h ea d er R o w ) ;
- 创 建 D a ta S ourc e 对 象 并 且 设 置 它 以 希 望 的 格 式 来 恢 复 数 据
D a ta S ourc e ds = ne w D a ta S ourc e ( ) ;
ds.s e t C o n n e c t io nS t r in g (" D S N = N orth w ind ");
d s .s e tc o m m a n d T ex t (" S E L E C T Prod uct ID , P ro d uct N am e ,
U n it P r ice FR O M Pro d u c t s W H ER E U n it P ric e < 10 " ) ;
- 设 置 D a ta S ourc e 对 象 到 D h T a b le 对 象 中
ta b le .s etD a ta S o u r c e( d s ) ds.b eg in ( ) ;
- 添 加 D h T a b le 到 文 档 中
set N ew E lem en ts ( n ew D h E lem en t [ ] { tab le} ) '
/ / altern ately: ad d( ta b le )
现 在 表 从 记 录 集 中 放 入 了 数 据 并 且 这 些 数 据 以 模 板 行 格 式 进 行 了 格 式化
在 服 务 器 上 使 用 c o m . m s.w f c .h tm l软 件 包
c o m .m s. w fc .h tm l 也 能 够 在 服 务 器 上 使 用 用 来 提 供 一 种 编 程 模 型 来产 生 HTM L 并 且 将 其 送 到 客 户 页 上 服 务 器 端 不 像 客 户 端 D y n a m ic HTM L 模 型 那 样 由 于 服 务 器 Ja va 类 与 客 户 机 的 文 档 没 有 相 互 作 用
所 以 服 务 器 端 的 模 型 是 静 态 的 然 而 服 务 器 由 HTM L 元 素 组 成 并且 当 元 素 在 HTM L 模 板 中 使 用 时 指 定 了 一 个 模 板 则 服 务 器 将 频 繁 地将 它 们 发 送 到 客 户 中
尽 管 这 不 是 完 全 的 动 态 模 型 它 还 是 一 个 重 要 的 服 务 器 特 性 例 如 用户 能 够 应 用 D h S tyle 属 性 到 一 些 模 板 的 HT M L 代 码 的 所 有 部 分 中 然后 通 过 使 用 改 变 D h S tyle 属 性 来 产 生 不 同 外 观 的 显 示 页 用 户 不 必 通 过程 序 来 产 生 所 有 的 单 独 样 式 改 变 另 外 一 个 优 点 就 是 用 户 能 够 使 用 相同 的 模 型 来 为 客 户 和 服 务 器 应 用 程 序 来 产 生 动 态 HTM L 因 此 HT M L 生 成 器 易 学 易 记
当 前 在 服 务 器 上 有 两 个 产 生 HTM L 的 模 型 这 两 种 类 型 都 使 用 A c tiv e Se rv e r Pa g e s ( A S P) 脚 本 和 基 于 c o m .m s. w fc .h tm l 类 的 类 第 一 种 类 型 是主 干 的 方 法 它 更 多 地 依 赖 于 AS P 脚 本 而 第 二 种 类 型 则 使 用 从
D h D o c u m e n t 中 衍 生 的 类 并 且 因 为 此 类 型 在 类 中 比 在 脚 本 中 公 布 更
多 的 控 件 所 以 与 在 客 户 机 上 使 用 的 模 型 非 常 相 似
基 于 ASP 的 方 法
此 种 方 法 在 服 务 器 页 中 使 用 两 个 AS P 方 法 ge t O b je c t 和 R e spons e . W r i te Ge t O b je c t 方 法 用 来 实 例 化 基 于 c o m .m s. w fc .h tm l 类 的 类 R e spons e . W r i te 方 法 将 已 生 成 的 HTM L 串 写 到 客 户 c o m .m s. w fc .h tm l .D h E le m e n t 类 提供 ge t H T M L 方 法 用 来 创 建 HT M L 串 这 些 串 然 后 使 用 AS P R e spons e . W r i te 方 法 送 到 客 户 页 中
例 如 用 户 有 一 个 名 为 M y S e rv e r 的 类 用 来 扩 展 Dh F o rm 并 且 合 并一 些 HTM L 元 素 在 AS P 脚 本 中 首 先 调 用 ge t O b je c t ja va :M yS e r ve r 来 创 建 一 个 D H T M L 对 象 用 户 然 后 可 以 执 行 AS P 脚 本 对 象 上 的 任 意动 作 如 在 对 象 中 设 置 属 性 等 当 完 成 这 些 操 作 之 后 就 可 以 调 用 对 象的 ge t H T M L 方 法 来 产 生 串 并 且 将 此 结 果 传 送 到 A S P R e spon se .W r i te 方 法 中 该 方 法 将 HTM L 送 到 客 户 上 下 面 的 代 码 段 显 示 了 有 关 的 AS P 脚 本 和 用 来 在 HTM L 中 创 建 D h E d i t 控 件 并 将 其 送 到 客 户 中 的 Ja va 代码
A S P SC R IP T
D im f , x
s e t f = g etO b je ct( ja v a :d h F a cto r y ) set x = f . cr ea te E d it
x .s e t T ex t (" I’ m a n ed it ! " )
R es p o n s e .W r ite ( x . g etH T M L ( ) )
R es p o n s e .W r ite ( f . cr ea te B r ea k ( ) .g e t H T M L ( ) )
.
.
.
J AVA CO D E
pub lic c la ss dh F a c tor y {
p u b lic d h F a c tory() { }
p u b l ic D h B reak c re a te B reak ( ) {
r e tu rn n e w D h B r ea k ( ) ;
}
p u b lic D h E d it c re a te D d it(){
r e tu rn n e w D h E d it();
}
}
基 于 HT M L 的 方 法
此 种 方 法 稍 微 复 杂 一 些 并 且 与 客 户 模 型 更 接 近 一 些 它 使 用 一 个 AS P 脚 本 来 设 置 D h D o c u m e n t 类 的 地 点 但 是 操 作 代 码 的 其 他 部 分 却 是 在 Ja v a 中 就 像 在 客 户 模 型 一 样 D h M odu le 类 在 W e b 页 中 实 例 化 为 Ja va 组件 并 且 自 动 调 用 从 D h D o c u m e n t 中 衍 生 的 项 目 类 中 的 in it F o rm 方 法
就 像 在 客 户 模 型 中 一 样 用 户 能 够 在 in it F o rm 调 用 中 做 所 有 的 绑 定 设置 onD o c um e n t L oa d 函 数 也 被 服 务 器 端 的 类 调 用 在 此 方 法 中 用 户能 够 访 问 I IS R e spon s e 和 R e que s t 对 象 使 用 D h M odu le g e t R e sponse 和g e t R e que s t 方 法 并 且 还 添 加 新 的 D h E lem en t 项 到 用 户 的 文 档 流 中然 而 理 解 用 户 不 能 使 用 文 档 级 的 函 数 如 f indE le m e nt 这 一 点 是 很重 要 的 而 且 在 服 务 器 端 文 档 中 不 能 使 用 枚 举 操 作 除 非 项 目 已 经 明确 添 加 到 自 己 的 D h D o c u m e n t 派 生 类 中
按 下 列 步 骤 使 用 基 于 HTM L 的 方 法
-
创 建 服 务 器 Ja va 类 从 D h D o c u m e n t 中 扩 展
-
在 该 类 中 当 想 使 用 客 户 应 用 程 序 时 执 行 in it F o rm 方 法
-
从 AS P 中 调 用 S e r v er.C re ateO b je c t 方 法 传 递 D h M odu le 来 创建 D h M odu le 对 象
-
调 用 D h M odu le . se t C ode C la s s 方 法 传 递 给 它 D h d o cu m e n t -d eriv e d 类的 名 称
-
调 用 D h M odu le . se t H T M LD oc um e n t 方 法 如 果 有 该 方 法 则 将 服 务 器
W e b 页 的 完 全 本 地 文 件 名 传 递 给 它
如 果 使 用 一 个 空 串 "" 调 用 se tH T M L D o c u m e n t 那 么 D h D o c u m e n t 类 运 行 并 且 为 在 用 户 的 AS P 中 调 用 Se t H T M L D oc u m e n t 的 位 置 处 已添 加 的 任 意 元 素 输 出 HTM L 然 后 用 户 就 可 以 生 成 内 嵌 的 HT M L 代码 段
如 果 用 户 没 有 调 用 se t H T M LD oc um e n t 那 么 D h D o c u m e n t 类 为 该 页输 出 完 全 的 HTM L 并 且 包 含 <H TM L > <H E A D > 和 <B O D Y > 标 记
下 例 显 示 了 使 用 模 板 的 AS P 页
< % S e t m o d = S erv er.C r ea t e O b je c t ( "c o m . m s . w f c .ht m l.D hM o d ule" ) m o d.set C o d e C la ss( " C la ss1 " )
m o d .s e t H TM LDo c u m en t ( " c :\ in e tp u b \ wwwr o o t \P a g e 1 .h t m " )
% >
在 运 行 期 间 此 结 构 能 够 识 别 在 服 务 器 用 户 类 的 运 行 和 相 应 的 动 作
- 旦 实 例 化 用 户 就 可 以 对 D h D o c u m e n t 衍 生 类 添 加 元 素 或 文 本 那 些项 目 就 可 以 添 加 到 在 < / B O DY> 标 记 前 指 定 的 任 意 模 板 中
下 例 说 明 了 既 工 作 在 客 户 上 也 工 作 在 服 务 器 上 的 类
im p o r t c o m . m s . w fc .u i.* ;
im p o r t c o m . m s .w f c.h tm l.* ;
p u b l ic c lass C lass 1 ex te n d s D h D o cu m e n t {
p u b lic C la s s 1 ( ){ in it F o r m ( ) ;
}
Dh T ex t tx t1 = n e w Dh T ex t ( ) ; Dh F o r m s e c t = n e w Dh F o r m ( ) ;
p r iv a te v o id in i t F o rm () {
// ca ll g e t S erv e r M o d e ( ) to ch ec k
/ / if th is ob je c t is ru n n in g on th e serv er
if ( g e t S erv erM o d e() ) {
tx t 1 .s etT ex t("H ello fr o m th e s erv er !" );
} e ls e{
tx t 1 .s etT ex t("H ello fr o m th e c lie n t!" );
}
// s iz e th e s e c t ion, se t i ts ba c k g round c o lo r
// a n d a d d th e tx t 1 e le m en t to it s e c t .s e t S ize( 100 , 10 0 ) ;
s e ct.s et B a c k C o lo r( C o lo r.R E D ); s e c t .a d d ( tx t1 );
a d d ( s e ct );
s e t N ew E lem en t s ( n e w D h E lem en t [ ] { s ect } ) ;
}
}
如 果 用 户 想 要 绑 定 到 在 该 页 上 已 有 的 HTM L 文 档 中 就 像 在 客 户 上 工作 一 样 使 用 D h D o c u m e n t .s e t B oundE le m e nt 方 法 例 如 如 果 HTM L 模 板 包 含 下 面 的 HTM L
<P >
T h e t im e is :< SP A N id = tx t 1> < / SP A N > < B R >
< INP UT t yp e= tex t id = e d it 1 v a lu e= " " >
</ P>
用 户 的 in it F o rm 方 法 应 该 如 下 所 示
D h T ex t tx t1 = n e w D h T ex t(); D h E d it e d it = n e w D h E d it ( ) ;
D h C o m b oB ox cb = n e w D h C o m b oB ox ( ) ;
p r iv a te v o id in i t F o rm ( ){
tx t 1 .s e t T ext( com . m s . w f c .a pp .T im e().fo r m a t S ho r t T im e());
ed i t . se tT e x t (" H e l lo ,w o r ld !" ) ;
e d it .s et B a c k C o lo r( C o lo r.R E D );
se t B oundE le m e n ts ( ne w D h E le m e n t [ ]{ tx t 1 . se t B ind ID (" tx t 1 ") ;
e d it .s e t B in d ID (" e d it 1 " ) } ) ;
// C re a te a c o m bo box to b e a dde d a f te r th e bound i te m s
cb .a d d It e m ("O n e" );
cb .a dd It e m (" T w o" ) ;
// A d d th e ite m s to th e e n d o f d o c u m e n t .
s e t N ew E lem ents ( n e w D h E lem en t [ ]{ cb } ) ;
}
在 客 户 和 服 务 器 上 HTM L 类 的 执 行 几 乎 一 样 然 而 也 有 一 个 很 重 要的 不 同 点 一 旦 元 素 写 入 发 送 到 客 户 它 们 就 不 能 像 修 改 客 户 文 档一 样 进 行 修 改 如 果 企 图 再 次 修 改 此 元 素 在 写 入 操 作 已 经 在 元 素 上 执行 之 后 会 出 现 D h C a n t M o d if y E le m e n t 只 与 服 务 器 应 用 程 序 相 关 的 异 常
这 着 重 说 明 了 在 服 务 器 Ja va 类 和 客 户 文 档 之 间 没 有 实 际 互 操 作 的 事实 就 像 在 客 户 上 的 Ja va 类 和 文 档 之 间 一 样
使 用 D h D o c u m e n t 派 生 方 法 的 一 个 有 利 之 处 就 是 能 够 实 现 用c o m .m s. w fc .h tm l 类 识 别 的 属 性 嵌 入 的 HTM L 模 板 首 先 通 过 在 文 档中 使 用 ID 属 性 来 装 饰 HT M L 元 素 然 后 在 源 代 码 中 使 用D h E le m e n t.s e tB in d ID 方 法 来 设 置 相 应 的 ID 用 户 能 够 绑 定 到 这 些 HTM L 元 素 中 在 元 素 中 设 置 属 性 添 加 用 户 自 己 的 HTM L 代 码 等 实 际 上这 就 是 允 许 用 户 提 前 编 码 和 设 计 单 独 的 模 板 并 在 服 务 器 请 求 文 档 时 使用 动 态 数 据 来 传 播 模 板
第 15 章 图 形 服 务 器
通 过 图 形 设 备 接 口 GD I 可 以 在 M ic rosoft W indow s 中 显 示 G ra ph ic 对 象 它 是 一 个 与 设 备 无 关 的 图 形 输 出 模 型 处 理 基 于 W ind ow s 应 用程 序 的 图 形 功 能 调 用 并 把 这 些 调 用 传 到 合 适 的 设 备 驱 动 程 序 这 些 驱动 程 序 在 输 出 时 执 行 硬 件 特 定 的 函 数 当 在 设 备 相 关 格 式 与 设 备 相 互 作用 时 GD I 在 应 用 程 序 和 输 出 设 备 之 间 充 当 一 个 缓 冲 区 对 应 用 程 序 提供 与 设 备 无 关 的 视 图
应 用 程 序 开 发 人 员 使 用 GD I 的 功 能 可 以 显 示 图 像 绘 制 控 件 形 状 和文 本 创 建 和 使 用 笔 刷 子 和 字 体 W ind ow s F ounda t ion C la sse s W F C G ra ph ic 对 象 与 其 他 W F C 对 象 协 调 诸 如 笔 文 字 和 刷 新 对 象 等 将这 些 能 力 封 装 为 基 于 Ja va 的 对 象
在 W F C 环 境 中 可 通 过 G ra ph ic 对 象 输 出 图 形 在 创 建 或 检 索 一 个G ra ph ic 对 象 之 后 可 以 关 联 其 他 基 于 图 形 的 对 象 诸 如 带 对 象 的 字 体笔 和 刷 子 然 后 使 用 对 象 的 各 种 绘 制 方 法 来 重 现 显 示 输 出 例 如 要 画具 有 特 殊 外 观 的 线 可 以 使 用 G ra ph ic 对 象 的 se t P e n 方 法 来 指 定 一 个 笔对 象 将 使 用 此 笔 来 绘 制 然 后 使 用 对 象 的 dra w L in e 方 法 来 重 现 线 条还 可 以 根 据 需 要 多 次 修 改 这 些 关 联
创 建 G ra ph ic 对 象
W F C 提 供 了 几 种 方 法 来 创 建 一 个 G ra ph ic 对 象
显 式 G ra ph ic 对 象 的 创 建 可 以 在 任 何 可 扩 充 C on tro l 类 的 对 象 上 通过 调 用 crea t G ra p h ics 方 法 来 创 建 一 个 显 式 的 G ra ph ic 对 象
隐 式 显 示 G ra ph ic 对 象 的 创 建 B itm a p 和 M e ta f i le 对 象 通 过 g e tG ra p h ic s
方 法 支 持 隐 式 G ra ph ic 对 象 的 创 建
显 式 G raph ic 对 象 的 创 建
扩 充 C on tro l 类 的 所 有 类 都 支 持 cre a te G rap h ic s 方 法 可 以 使 用 它 来 创 建一 个 G ra ph ic 对 象 实 例 下 面 的 程 序 段 演 示 了 如 何 从 一 个 Fo rm 派 生 类中 调 用 这 种 方 法
G rap hics g = th is .creat e G ra p h ics();
显 式 G ra ph ic 对 象 创 建 的 第 二 种 方 法 是 使 用 W in3 2 设 备 场 境 句 柄
HD C 通 常 当 调 用 一 个 W in 3 2 方 法 返 回 HD C 时 可 以 使 用 这 种方 式 创 建 一 个 G ra ph ic 对 象
在 G ra ph ic 对 象 中 如 果 只 需 要 本 机 不 支 持 的 图 形 能 力 可 以 使 用 对 象的 g e t H a nd le 的 方 法 来 检 索 W in 3 2 设 备 场 境 的 句 柄 并 且 可 以 对 适 当 的W in 3 2 方 法 透 明 传 送 句 柄
如 果 在 以 前 的 句 柄 上 创 建 一 个 G ra ph ic 对 象 则 此 对 象 假 定 不 具 有 句 柄的 所 有 权 使 用 了 此 对 象 后 要 负 责 使 用 适 当 的 W in 3 2 函 数 释 放 句 柄
如 果 使 用 G ra ph ic 对 象 的 g e t H a nd le 方 法 来 检 索 对 象 的 基 本 句 柄 对 象保 留 句 柄 的 所 有 权 就 不 应 该 释 放 它
关 于 W in 3 2 句 柄 和 G ra ph ic 对 象 的 更 多 信 息 请 参 看 下 一 章 的 执 行 基于 句 柄 的 操 作
隐 式 G raph ic 对 象 的 创 建
通 过 g e t G ra ph ic s 方 法 B itm a p 和 M e ta f ile 对 象 支 持 隐 式 G ra ph ic 对 象的 创 建 在 下 面 的 代 码 段 中 使 用 B itm a p 对 象 的 g e tG ra p h ic s 方 法 来 创建 一 个 G ra ph ic 对 象 使 用 此 对 象 可 以 对 位 图 的 表 面 画 图
B itm ap b m p = n e w B it m ap (" c : \\M y Im ag e .b m p " ) ; G ra p h ics g r = b m p .get G ra ph ics ( ) ;
最 初 可 以 通 过 对 象 调 用 g e t G ra ph ic s 此 对 象 创 建 一 个 新 的 G ra ph ic 对象 实 例 并 返 回 它 通 过 原 始 的 调 用 在 所 建 对 象 的 回 送 中 通 过 相 同 对象 结 果 建 立 g e t G ra ph ic s 的 后 续 调 用
另 外 当 通 过 采 用 对 象 的 g e t G ra ph ic s 方 法 创 建 的 G ra ph ic 对 象 调 用 绘 制方 法 时 此 方 法 应 用 于 通 过 它 们 创 建 的 对 象 例 如 对 dra w T e xt 在 调用 中 指 定 的 X Y 的 坐 标 0 0 是 与 位 图 相 关 的 但 不 能 控 制 位 图 重现
检 索 G ra ph ic 对 象
在 窗 体 或 控 件 的 绘 制 事 件 中 可 以 检 索 和 使 用 G ra ph ic 对 象 实 例 绘 制事 件 处 理 程 序 把 P a in tE v e n t 对 象 作 为 一 个 参 数 并 且 此 对 象 包 含 了 公 共的 图 形 成 员 此 成 员 是 一 个 有 效 G ra ph ic 对 象 实 例 可 以 如 下 调 用
p ro tect ed v o id o n P a in t( P a in tE v en t e){
e .g ra p h ics .d ra w S t r in g ( " H e llo , w o r ld " , n e w P o in t ( 1 0 , 1 0 ) );
}
关 于 如 何 创 建 绘 制 事 件 外 的 G ra ph ic 对 象 请 参 考 以 前 的 章 节 显 式 图形 的 创 建 和 隐 式 图 形 的 创 建
G ra p h ic 对 象 作 用 域
G ra ph ic 对 象 有 方 法 作 用 域 这 意 味 着 当 使 用 G ra ph ic 对 象 返 回 某 种 方法 时 自 动 调 用 此 对 象 的 清 理 方 法 释 放 所 有 已 分 配 给 对 象 的 资 源 调用 了 清 理 之 后 可 尝 试 使 用 异 常 运 行 期 间 的 对 象 结 果
如 果 在 类 级 声 明 一 个 G ra ph ic 对 象 的 实 例 应 使 用 Fo rm 对 象 的
crea te G rap h ic s 方 法 来 初 始 化 每 个 使 用 它 的 方 法 中 的 对 象
P u b lic c la s s F o rm 1 e x te n d s F o rm {
G rap hics g = n e w G rap hics ( ) ;
p r iv a te v o id F o rm 1 _ resiz e( O b je ct s e n d e r , E v en t e){
// in it ia liz e o b ject in s ta n c e . g = th is . cr ea te G ra p h ics ();
// d isp o s e a u to m a tic a lly c a lle d …
}
priv a te v o id F o rm 1_c l ic k ( O b je c t se nde r , E v e n t e ){
/ / In itia liz e o b je c t in s ta n c e .
g = th is .c re a te G ra p h ic s ();
// d is p o s e m eth o d a u to m a t ica lly ca lled …
}
}
尽 管 清 理 方 法 的 调 用 是 自 动 的 但 在 例 程 的 最 后 最 好 是 使 用 G ra ph ic 对 象 显 式 调 用 它 在 W ind ow s 95 平 台 上 这 是 非 常 重 要 的 因 为 系 统分 配 的 设 备 上 下 文 数 量 是 有 限 的
维 护 边 框 矩 形
可 以 画 图 的 窗 口 区 是 窗 口 的 客 户 区 在 这 个 矩 形 区 域 边 框 矩 形 定 义 了
在 画 G ra ph ic 对 象 中 可 视 的 矩 形 区 域 并 且 可 以 包 括 窗 口 的 整 个 客 户 区当 一 个 窗 口 丢 失 了 然 后 又 恢 复 焦 点 时 则 边 框 矩 形 部 分 被 以 前 重 现 它的 其 他 不 自 动 重 新 显 示 的 对 象 所 覆 盖
为 确 保 正 确 的 显 示 必 须 管 理 窗 体 或 控 件 的 重 新 绘 制 绘 制 事 件 处 理 程
序 是 放 于 进 行 管 理 的 Fo rm 类 代 码 中 |
在 处 理 程 序 中 |
可 以 恢 复 边 框 矩 | |
---|---|---|---|
形 到 正 确 的 状 态 下 面 的 例 子 将 创 建 类 级 B itm a p |
对 象 |
然 后 使 用 绘 制 事 |
件 处 理 程 序 来 重 |
画 位 图 窗 体 的 客 户 区 每 次 变 成 无 效 时 W ind ow s 都 调 用 这 个 处 理 程 序并 且 图 像 重 新 绘 制 到 窗 体
B itm ap b m p = n e w B it m ap (" c : \\M y Im ag e .b m p " ) ; P rotecte d v o id onP a int( P aint E v ent e){
e .g ra phics .d ra w Im a ge( b m p , n e w Po in t ( 0, 0));
}
当 第 一 次 显 示 窗 体 时 每 次 都 重 新 获 得 焦 点 自 动 调 用 绘 制 事 件 处 理 程序 然 而 如 果 窗 体 支 持 重 设 尺 寸 则 窗 体 维 数 的 改 变 不 会 自 动 触 发 重新 绘 制 相 反 必 须 添 加 对 Fo rm 派 生 类 的 重 设 尺 寸 处 理 程 序 然 后从 处 理 程 序 中 调 用 使 对 象 无 效 的 方 法 下 面 是 在 窗 体 绘 制 事 件 处 理 程序 中 调 用 使 无 效 的 方 法
pro tect ed vo id o n R es ize( E ven t e){ t h is .inva lidate();
}
执 行 基 于 句 柄 的 操 作
句 柄 是 操 作 系 统 中 一 些 元 素 的 唯 一 编 号 例 如 桌 面 上 的 每 个 窗 口 都 有一 个 唯 一 的 句 柄 以 使 计 算 机 能 够 把 它 与 其 他 窗 口 区 别 开 每 个 设 备 上下 文 刷 子 笔 和 字 体 也 都 有 一 个 唯 一 的 句 柄
为 了 与 W in3 2 A IP 兼 容 G ra ph ic B ru s h Pe n 和 Fo n t 对 象 都 支 持 基 于句 柄 的 操 作 例 如 如 果 使 用 W in3 2 C re a t P e n 函 数 创 建 了 一 个 刷 子 此 函 数 就 会 返 回 一 个 句 柄 可 以 把 这 个 句 柄 传 给 B ru sh 对 象 构 造 器 而且 根 据 W in 3 2 笔 的 特 征 创 建 这 个 对 象
即 使 没 有 以 句 柄 为 基 础 创 建 B ru sh Pe n 或 Fo n t 对 象 也 可 以 检 索 基 于B rush, P e n 或 F ont 对 象 的 句 柄 每 个 对 象 都 支 持 c o p y H a nd le 和 g e t H a nd le 方 法 一 旦 使 用 这 些 方 法 复 制 或 检 索 对 象 的 句 柄 就 可 以 传 送 这 个 句 柄给 任 意 需 要 把 句 柄 作 为 参 数 的 W in 3 2 函 数
当 使 用 G ra ph ic 对 象 执 行 基 于 句 柄 的 操 作 时 应 记 住 以 下 几 条 重 要 规 则
- 如
果 使 用 W in 3 2 方 法 创 建 基 于 以 前 分 配 过 句 柄 的 对 象 对 象 不 会 假定 具 有 句 柄 的 所 有 权 例 如 如 果 使 用 W in3 2 G e t D C 方 法 来 检 索 窗体 的 设 备 上 下 文 句 柄 HD C 然 后 创 建 基 于 HD C 的 G ra ph ic 对 象则 就 拥 有 了 句 柄 这 意 味 着 当 调 用 G ra ph ic 对 象 的 清 理 方 法 时 句柄 在 内 存 中 不 释 放 相 反 必 须 使 用 适 当 的 W in 3 2 例 程 来 清 理 句 柄 下 例 说 明 了 适 当 的 句 柄 管 理 本 例 使 用 W in3 2 G e t D C 来 检 索 窗 体 设备 上 下 文 的 句 柄 然 后 创 建 一 个 基 于 此 句 柄 的 G ra ph ic 对 象 使 用G ra ph ic 对 象 在 窗 体 上 画 了 一 条 线 以 后 W in3 2 R e le a se D C 例 程 通 过
Ge t D C 来 释 放 已 分 配 的 设 备 上 下 文 句 柄
/ / im p o r t th e co m . m s . w f c.W in 3 2 .W in d o w s p a ck a g e . Im p o r t co m . ms . w f c .W in 3 2 .W in d o w s ;
in t hD C = W ind ow s .G e t D C ( th is . g e t H a n d le()); G rap hics g = n e w G rap hics ( h D C ) ;
g .d raw L ine( n e w P o in t ( 0 ,0), ne w P o in t ( 10 0, 0));
g.d isp ose();
W in d o w s .R e lea s e D C( h D C ) ;
注 意 本 例 中 使 用 设 备 上 下 文 的 句 柄 这 里 说 明 的 原 则 可 用 于 笔 刷子 字 体 和 位 图
-
多
数 G ra ph ic 对 象 支 持 c o p y H a nd le 方 法 通 过 这 种 方 法 可 以 复 制 对象 的 句 柄 如 果 使 用 c o p y H a nd le 方 法 复 制 一 个 对 象 的 句 柄 则 要 负责 释 放 句 柄
-
多
数 图 形 对 象 也 支 持 g e t H a nd le 方 法 这 种 方 法 返 回 对 象 的 句 柄 与句 柄 的 副 本 相 反 这 种 方 法 支 持 G ra ph ic 对 象 方 法 和 W in 3 2 图 形 例程 之 间 的 兼 容 性
通 过 g e t H a nd le 方 法 检 索 的 句 柄 不 能 是 对 象 基 本 句 柄 的 副 本 因 此不 应 该 通 过 g e t H a nd le 释 放 检 索 的 句 柄 当 清 理 对 象 时 可 释 放 这 些 句柄
G ra p h ic 对 象 坐 标 系 统
G ra ph ic 对 象 支 持 的 许 多 方 法 都 依 赖 于 数 字 坐 标 此 坐 标 可 在 G ra ph ic 对 象 中 指 定 在 G ra ph ic 对 象 中 指 定 操 作 发 生 的 区 域 或 者 在 Po in t 对 象 中 指 定 操 作 发 生 的 X 水 平 和 Y 垂 直 坐 标
坐 标 系 统 指 明 了 这 样 的 对 象 指 定 的 坐 标 如 何 映 射 到 显 示 器 或 其 他 设 备中 例 如 假 定 调 用 G ra ph ic 对 象 的 dra w S tr ing 方 法 在 坐 标 100 100 画 文 本
G rap hics g = th is .creat e G ra p h ics();
g .d raw String (" H e l lo , W F C , ne w P o in t ( 100 , 10 0 ) ) ;"
本 例 中 Po in t 对 象 指 定 了 画 一 字 符 串 的 X 和 Y 坐 标 然 而 这 次 操 作的 实 际 结 果 取 决 于 G ra ph ic 对 象 关 联 的 坐 标 系 统
关 联 G ra ph ic 对 象 的 坐 标 系 统 是 在 C oord ina te S y s te m 类 中 定 义 的 G ra ph ic 对 象 的 默 认 坐 标 系 统 是 C oord ina te S ys te m . T E X T 这 意 味 着 在 Po in t 对象 的 X 和 Y 值 增 加 时 文 本 或 位 图 或 控 件 将 水 平 向 右 或 垂 直 向 下移 动
为 了 同 带 有 G ra ph ic 对 象 的 坐 标 系 统 关 联 使 用 se t C oord ina te S ys te m 方法 如 下
G rap hics gr = th is .creat e G ra p h ics();
G r .s e t C o ord in a t e S ys te m ( C oo r d in a te S ys t e m .A N IS O T R O P IC ) ;
下 表 列 出 了 与 G ra ph ic 对 象 关 联 的 坐 标 系 统 并 描 述 了 在 绘 制 过 程 中
Po in t 对 象 中 定 义 的 X 和 Y 值 增 加 时 绘 制 的 方 向 如 何
坐标 系 统 |
X 轴增 长方向 |
Y 轴增 长方向 |
---|---|---|
Co o rd in a te S ys te m .T E X T |
右 |
下 |
Co o rd in a te S ys te m .L O M E T R IC |
右 |
上 |
Co o rd in a te S ys te m .H IM E T R IC |
右 |
上 |
C o o rd in a te S ys te m .L OE NGL IS H |
右 |
上 |
Co o rd in a te S ys te m .H IE N G L IS H |
右 |
上 |
Co o rd in a te S ys te m .T W IP S |
右 |
上 |
Co o rd in a te S ys te m .IS O T R O P IC |
用户 定 义 |
用户 定 义 |
C o o rd in a te Sys te m .A N ISO T R O P IC |
用户 定 义 |
用户 定 义 |
设 置 坐 标 原 点
坐 标 原 点 定 义 了 测 量 坐 标 的 起 始 位 置
例 如 如 果 通 过 应 用 程 序 的 主 窗 体 创 建 一 个 G ra ph ic 对 象 则 G ra ph ic 对 象 的 坐 标 系 统 是 C oord ina te S ys te m . T E X T 且 图 形 坐 标 是 从 窗 体 的 左 上角 0 0 开 始 的
然 而 如 果 使 用 用 户 定 义 的 坐 标 系 统 诸 如C oord ina te S ys te m . A N IS O T R O P IC 或 C oord ina te S yste m . IS O T R O P IC 可以 使 用 G ra ph ic 对 象 的 S e t C oord ina te O r ig in 方 法 定 义 坐 标 开 始 测 量 的点 对 页 面 或 设 备 例 如 假 设 在 应 用 程 序 的 绘 制 事 件 中 包 括 如 下 代
码
priv a te v o id F o r m 1_ pa in t ( O b ject s o u r c e , Pa in t E ven t e)
{
/ / S e t th e co ordinate s ystem .
e . g rap h ics .s et C o ord inat e S ystem ( C oo r d in ate S ys t e m . A N IS O T R O P IC ) ; e . g ra p h ics .s et C o o rd in a t e O r ig in ( n e w P o in t ( 20, 20, n e w P o in t ( 2 0 ,2 0 ) ) ; e . g ra p h ics .s et C o o rd in a t e S ca le( ne w P o in t ( 1 ,1), ne w Po in t ( 1 ,1));
e . g ra p h ics .d ra w L in e( ne w Po in t ( 0 ,0 ) , n e w P o in t ( 1 00 ,1 00));
}
代 码 设 置 坐 标 系 统 为 C oord ina te S ys te m . A N IS O T R O P IC 并 设 置 坐 标 原点 为 页 面 或 设 备 的 20 20 坐 标 在 代 码 中 以 后 出 现 的 对 dra w L in e 的 调用 是 从 原 点 开 始 的 于 是 直 线 将 从 坐 标 原 点 10 10 开 始 到 100
100 结 束
映 射 逻 辑 坐 标 到 设 备 坐 标
W ind ow s 对 设 备 的 映 射 页 面 坐 标 提 供 内 置 式 支 持 诸 如 打 印 机 或 显 示器
对 于 大 多 数 通 过 W ind ow s 定 义 的 坐 标 系 统 由 系 统 本 身 执 行 这 种 转 换例 如 如 果 使 用 C oord ina te S ys te m . H IM E T R IC 坐 标 系 统 关 联 G ra ph ic 对象 则 对 象 上 的 每 个 逻 辑 单 位 在 设 备 上 转 换 为 . 001 英 寸
然 而 使 用 用 户 定 义 的 AN IS O T R O P IC 和 IS O T O R P IC 坐 标 系 统 则 必须 使 用 S e t C oord ina te S c a le 方 法 告 诉 系 统 如 何 执 行 这 种 转 换 如 下
G rap hics g = th is .creat e G ra p h ics();
g.s et C o o rd in at e S y s te m ( C oordinate S yst em .A N IS O T R O P IC ) ; g .s e t C o o rd in a t e S ca le( n e w P o in t ( 1 ,1), ne w P o in t ( 2 ,2));
在 本 例 中 对 se t C oord ina te S c a le 的 调 用 指 示 系 统 把 一 个 逻 辑 水 平 或 垂直 单 位 转 换 为 两 个 水 平 和 垂 直 的 设 备 单 位
绘 制 文 本
G ra ph ic 对 象 的 dra w S tr ing 方 法 支 持 对 象 所 属 控 件 的 文 本 输 出 这 个 方法 编 写 文 本 到 指 定 的 位 置 如 下
G rap hics g = th is .creat e G ra p h ics();
g.d ra w S t r in g (" H e l lo, W o r ld" , n e w P o in t ( 0 , 0 ) ) ;
这 次 调 用 的 可 视 结 果 依 赖 于 诸 多 因 素 包 括 G ra ph ic 对 象 目 前 的 文 本 颜色 背 景 色 字 体 位 置 和 坐 标 系 统
关 于 如 何 设 置 文 本 颜 色 的 信 息 参 看 下 一 节 设 置 文 本 颜 色 G ra ph ic 对 象 与 字 体 关 联 的 信 息 参 看 本 章 后 面 的 使 用 字 体 对 象 关 于 坐 标系 统 的 信 息 参 看 本 章 后 面 的 G ra ph ic 对 象 坐 标 系 统
设 置 文 本 颜 色
为 设 置 文 本 中 文 本 和 背 景 的 颜 色 可 在 调 用 dra w S tr ing 之 前 调 用 G ra ph ic
对 象 的 s e tB a c kc o lor 和 se tT ex t C o lo r
// S e t th e t ex t to w h ite , th e b a c k g r o u n d to b la ck . g .s e t T ex t C o lo r(n e w C o lo r( 0 , 0 , 0 ));
g.s et B a ckC olor( n ew C o lo r ( 2 5 5 , 2 5 5 , 25 5 ) );
// D ra w th e tex t…
se t B a c kC o lor 方 法 只 影 响 文 本 的 背 景 色 为 了 设 置 背 景 或 为 其 他 对 象 填充 颜 色 如 多 边 形 或 线 分 别 使 用 se t B ru sh 和 se t P e n 方 法
使 用 Fo n t对 象
字 体 是 共 享 共 同 设 计 的 字 符 和 符 号 的 集 合 字 体 的 主 要 元 素 包 括 字 样效 果 和 尺 寸
在 W F C 中 在 字 体 对 象 中 W ind ow s 字 体 是 封 装 的 可 以 将 对 象 与 其他 字 体 相 关 的 对 象 组 合 使 用 为 了 在 G ra ph ic 对 象 上 显 示 字 体 定 义 一个 可 无 限 变 化 的 字 体
下 表 列 出 了 W F C 支 持 的 相 关 字 体 类 别
类 说 明
F o nt D e sc rip to r 提供 有 关 Fo n t 对象 的信 息
Fo n t Fa m i ly 定义 一 组 常 量 表示 字 体 可 能 属于 的系 列
Fo n t M e tr ic s 定义 字 体 映 射 到 G ra p h ic s 对象 时的 物 理 特性
Fo n tP i tc h 定义 字 体 的 间 距
Fo n t S iz e 定义 一 组 常 量 在能 被 指 定 的 字体 大小 单 元 中 表 示
Fo n tT y pe 定义 一 组 常 量 这些 常 量 表 示 将重 现字 体 的 设 备
Fo n tW e igh t 定 义 常 量 这 个 常 量 表 示 与 字 体 关 联 的 不 同 权 重
w e ig h t
创 建 F on t对 象
创 建 F ont 对 象 可 能 非 常 简 单 也 可 能 非 常 复 杂 这 主 要 取 决 于 所 要 定义 的 字 体 的 粒 度 下 面 的 代 码 说 明 了 一 种 创 建 F ont 对 象 的 简 单 方 法
F o n t fo nt = n e w F o nt(" T im es N e w R o m a n " , 2 6 ) ;
这 个 例 子 使 用 了 F ont 对 象 构 造 器 这 只 需 要 知 道 两 项 信 息 字 体 名 和字 体 尺 寸 当 创 建 F ont 对 象 时 也 可 以 指 定 字 体 系 列 类 型 权 重方 向 和 是 否 加 粗 是 否 斜 体 是 否 有 下 划 线 或 是 否 有 删 除 线 然 而 一旦 创 建 了 一 个 F ont 对 象 就 不 能 再 修 改 这 个 对 象 的 属 性
在 G raph ic 对 象 上 设 置 字 体
G ra ph ic 对 象 支 持 se t F ont 方 法 此 方 法 与 带 有 对 象 的 字 体 相 关 联 当 Fo n t 对 象 与 G ra ph ic 对 象 相 关 联 后 在 G ra ph ic 对 象 矩 形 框 内 的 所 有 文 本 都使 用 此 字 体
下 面 的 代 码 说 明 了 把 G ra ph ic 对 象 的 背 景 色 设 置 为 白 色 文 本 颜 色 设 置为 黑 色 字 体 为 26 磅 T im e s N e w R o m a n 的 过 程 文 本 显 示 在 指 定 的 位置 上
G rap hics g = th is .creat e G ra p h ics();
g.s et F o n t ( n e w F ont(" T im es N e w R o m a n " , 2 6 ) ) ; g.set B a ckC olor( n ew C o lo r ( 2 5 5 , 2 5 5 , 25 5 ) );
g .s e t T ex t C o lo r(N e w C o lo r( 0 , 0 , 0 ));
g.d ra w S t r in g (" H e l lo, W o r ld" , 0 0 ) ;
枚 举 字 体
在 许 多 实 例 中 必 须 能 枚 举 且 检 索 可 用 字 体 的 详 细 信 息 并 为 某 一 特 殊操 作 选 择 最 合 适 的 字 体
W F C F on t D e sc r ip tor 对 象 描 述 了 字 体 包 括 字 体 名 高 度 方 向 等 等系 统 中 所 有 可 用 字 体 的 详 细 描 述 可 使 用 G ra ph ic s 对 象 的g e t F on t D e sc r ip tor 方 法 获 得 这 种 方 法 返 回 F on t D e s c r ip tor 对 象 的 一 个 数组 数 组 中 的 每 个 元 素 描 述 一 种 字 体
下 面 举 例 说 明 了 如 何 使 用 g e t F on t D e sc r ip tor 方 法 此 例 检 索 了 可 用 字 体的 数 组 然 后 把 字 体 名 的 唯 一 表 列 插 入 到 列 表 框
G rap hics g = th is .creat e G ra p h ics();
// C rea te th e a rra y .
F ont D es crip tor rg F o n ts[] = g.g e t F o n t D es cr ip to rs ( ) ; fo r ( in t i = 0 ; i < r g F o n ts .len g th ; i+ + ){
if ( l is t B ox 1 .f indS t r ing( r g F o nts[ i] .fu ll N a m e = = - 1 ){
L ist B o x 1 .a ddIt e m ( rg F o nts[ i] .fu ll N a m e);
}
}
使 用 笔
笔 是 一 种 图 形 工 具 在 M ic rosoft W indow s 中 用 于 绘 制 直 线 和 曲 线 笔 可 用 于 画 徒 手 线 计 算 机 辅 助 设 计 CA D 应 用 程 序 使 用 笔 绘 制 可见 线 隐 含 线 剖 面 线 中 心 线 等 等 字 处 理 和 桌 面 出 版 应 用 程 序 使 用笔 绘 制 边 框 和 标 尺 电 子 数 据 表 应 用 程 序 使 用 笔 可 在 图 中 指 明 趋 势 并且 绘 制 条 形 图 和 饼 图
每 个 笔 由 三 个 属 性 构 成 效 果 宽 度 和 颜 色 如 果 对 笔 的 宽 度 和 颜 色 没有 特 殊 限 制 则 操 作 系 统 必 须 支 持 笔 的 效 果
W F C P e n 对 象
在 W F C P e n 和 Pe n S ty le 对 象 中 W in 3 2 笔 的 功 能 是 封 装 的 以 下 代 码段 演 示 了 如 何 创 建 Pe n 对 象
P en p = n e w P e n ( P en S t y le . DAS H ) ;
笔 效 果 是 传 递 到 构 造 器 的 常 量 在 W ind ow s 中 支 持 七 个 内 部 笔 效 果每 一 个 都 可 以 通 过 在 Pe n S tyle 类 中 定 义 一 个 常 量 来 表 示 Pe n S tyle 类 是枚 举 类 这 意 味 着 它 定 义 了 一 种 方 法 有 效 用 来 决 定 指 定 值 是 否 为Pe n S tyle 类 的 有 效 成 员
下 表 列 出 了 Pe n S tyle 常 量
常量 说明
Pe n S tyle .D A S H 表 示 画破 折 号 的笔
Pe n S T Y L E .D O T 表示 划 点 的 笔
P e n S tyle .D AS HD O T 表 示 画点 划 线 的笔
Pe n S tyle .IN S ID E F R A M E
表示 这个 笔 在 框架 或 封 闭 的 形状 内画 一条 线 这个 形状是由 G ra p h ic 对 象 指定边 框 矩 形的输 出 函 数 产 生 的 例如 d ra w Re c t , d ra w P ie 和 d ra w Cho rd
P e n S tyle .NUL L 表示 一 个 空 笔
Pe n S tyle .S O L ID 表示 一 个 实 心 笔
另 外 Pe n 对 象 包 括 了 一 组 用 于 指 定 要 创 建 的 笔 种 类 的 公 共 成 员 这 些成 员 中 的 任 何 一 个 都 是 Pe n 对 象 用 于 模 拟 W ind ow s 用 户 界 面 的 各 种
本 机 特 征
例 如 Pe n 类 定 义 了 一 个 W IND OW F A RM E 成 员 当 创 建W IND OW F A RM E 类 型 的 笔 时 使 用 笔 画 的 线 看 起 来 与 活 动 窗 口 的 边 框是 一 样 的
Pen p e n = P en . W IN D O W FR A M E;
下 表 列 出 了 定 义 为 Pe n 类 公 共 成 员 的 Pe n 对 象
对象 说明
P e n .AC T IVE E C A P T IO N T E XT 创 建 活动 窗 口 标题 文本 颜 色 的笔
P e n .CO N T RO L T E X T 表 示 控件 上 文 本颜 色的 笔
Pe n .G R A Y T E X T 表 示 禁用 文 本 颜色 的笔
P e n .H IGH L IGH T T E X T 表 示 高亮 文 本 颜色 的笔
P e n .IN A C T IV E C A P T IO N T E X T 表 示 不活 动 窗 口标 题文 本 颜 色的 笔
Pe n .IN FO T E X T 表 示 信息 工 具 提示 文本 颜 色 的笔
Pe n .M E N U T E X T 表 示 菜单 文 本 颜色 的笔
P e n .NUL L 表示 一 个 空 笔 空 笔 不做 任何 事 情
P e n .W INDO W F R A M E 表 示 活动 窗 口 边框 颜色 的 笔
P e n .W INDO W T E X T 表 示 活动 窗 口 文本 颜色 的 笔
注 意 当 根 据 系 统 常 量 使 用 笔 时 例 如 活 动 窗 口 文 本 的 颜 色 Pe n 对 应的 系 统 设 置 的 改 变 将 导 致 笔 的 变 化
在 G raph ic 对 象 上 设 置 笔
Pe n 对 象 自 身 包 括 了 无 颜 色 或 绘 制 功 能 它 只 描 述 了 GD I 功 能 的 一 个 子集 当 在 窗 体 上 使 用 Pe n 之 前 先 使 用 G ra ph ic 对 象 的 se t P e n 方 法 将G ra ph ic 对 象 与 Pe n 关 联
G rap hics g = th is .creat e G ra p h ics();
g.s et P en (n ew P e n( P enS t y le . D A S H ) ) ;
使 用 G ra ph ic 对 象 关 联 了 Pe n 后 在 G ra ph ic 对 象 矩 形 框 内 的 所 有 线 的绘 制 都 使 用 这 支 笔 另 外 可 以 在 相 同 的 G ra ph ic 对 象 上 多 次 调 用 se t P e n 方 法
下 例 演 示 了 具 有 G ra ph ic 对 象 画 线 功 能 的 Pe n 对 象 是 如 何 工 作 的 本 例中 在 Pe n 对 象 中 定 义 的 笔 效 果 存 在 于 一 个 整 数 数 组 中 在 类 的 绘 制 处理 程 序 中 通 过 笔 效 果 的 数 组 使 用 fo r 循 环 来 进 行 迭 代 使 用 任 一 效 果绘 制 一 条 线
pu b lic c la s s Fo r m 1 ex tend s F o r m
}
in t [ ] rg S tyle s = { P e n S tyle . D A S H , P e n S ty le . D A S H D O T , P e n S tyle .D A S HD OT D O T ,
P e n S t y le .D O T ,P e n S t y le. IN S ID E F R A M E , P e n S t y le .S O L ID } ;
p rot ecte d vo id o n P a in t ( P a in t E v e n t e)
{
R e cta n g le r c = th is .g et C lie n t R e ct();
rc . y + = 1 0 ;
fo r ( in t i = 0 ; i < rg S t yles .l e ngth; i+ + ){
e . g ra p h ic s . se t P e n ( n e w P e n ( C o lo r .B L A C K ,i ) ) ;
e .g ra p h ics .d ra w L in e( n e w P o in t ( 0 , rc. y ) ,
n e w P o in t ( rc. w id th , r c . y));
rc . y + = 1 0 ;
}
}
// R e st o f F o rm 1 c la ss…
使 用 刷 子
刷 子 是 一 种 图 形 工 具 基 于 W in 3 2 的 应 用 程 序 使 用 它 可 以 绘 制 多 边 形椭 圆 轨 迹 的 内 部 画 图 应 用 程 序 使 用 刷 子 可 以 绘 制 形 状 字 处 理 应 用程 序 使 用 刷 子 绘 制 标 尺 计 算 机 辅 助 设 计 CA D 应 用 程 序 使 用 刷 子绘 制 横 断 面 视 图 的 内 部 电 子 数 据 表 应 用 程 序 使 用 刷 子 绘 制 饼 图 和 条 形
图 的 断 面
刷 子 有 两 种 类 型 逻 辑 型 和 物 理 型 逻 辑 型 刷 子 是 在 代 码 中 定 义 的 是应 用 程 序 绘 制 形 状 使 用 的 颜 色 和 样 式 的 理 想 组 合 物 理 型 刷 子 以 逻 辑 型刷 子 为 基 础 由 设 备 驱 动 程 序 创 建
刷 子 的 原 点
当 某 一 应 用 程 序 调 用 绘 制 函 数 绘 制 形 状 时 W ind ow s 在 绘 制 操 作 的 开 始定 位 一 个 刷 子 并 在 刷 子 的 位 图 中 对 客 户 区 的 窗 口 原 点 映 射 一 个 像 素 窗口 原 点 位 于 客 户 区 窗 口 的 左 上 角 W ind ow s 映 射 的 像 素 点 坐 标 称 为 刷子 的 原 点
刷 子 原 点 的 默 认 值 是 刷 子 位 图 的 左 上 角 0 0 坐 标 W ind ow s 随 后 拷贝 经 过 客 户 区 的 刷 子 形 成 与 位 图 同 样 高 的 样 式 拷 贝 操 作 不 断 逐 行 进行 直 到 填 满 整 个 客 户 区 然 而 刷 子 样 式 只 有 在 指 定 形 状 的 边 界 才 是可 视 的 这 里 术 语 位 图 多 用 于 字 面 意 义 — — 如 同 安 排 位 一 样 而 不专 指 存 储 在 图 像 文 件 中 的 位
在 不 使 用 默 认 刷 子 原 点 时 有 许 多 实 例 例 如 对 于 一 个 应 用 程 序 来 说可 以 有 必 要 使 用 相 同 的 刷 子 绘 制 父 窗 口 和 子 窗 口 的 背 景 并 把 子 窗 口 的背 景 与 父 窗 口 的 背 景 相 混 合
逻 辑 型 刷 子 类 型
逻 辑 型 刷 子 的 类 型 有 三 种 实 心 影 线 样 式
实 心 so lid 刷 子 由 W ind ow s 用 户 界 面 的 一 些 元 素 定 义 的 颜 色 或 样 式组 成 例 如 可 以 通 过 W ind ow s 显 示 禁 用 按 钮 使 用 的 常 规 颜 色 和 样 式来 绘 制 一 种 形 状
影 线 ha tc he d 刷 子 由 颜 色 的 组 合 和 W in 3 2 定 义 的 六 种 样 式 之 一 组 成样 式 pa t te rn 刷 子 由 位 图 组 成 这 个 位 图 作 为 填 充 形 状 的 样 式 的 基 础它 填 充 的 区 域 比 位 图 要 大 在 显 示 中 以 水 平 和 垂 直 方 向 平 铺 位 图 样 式刷 子 能 够 创 建 由 自 定 义 样 式 组 成 的 自 定 义 刷 子
W F C B ru s h 对 象
W in 3 2 刷 子 的 功 能 封 装 在 W F C B ru sh 对 象 和 B ru sh S ty le 对 象 中 可 以 协调 使 用 这 些 对 象 来 创 建 实 心 样 式 和 影 线 型 刷 子
B ru sh 对 象 定 义 了 一 组 公 用 的 最 终 成 员 每 个 成 员 都 是 一 个 代 表 实 心 刷子 的 对 象 B ru shS tyle 类 代 表 了 作 为 一 组 整 型 常 量 的 影 线 刷 子 每 个 常量 代 表 刷 子 的 不 同 类 型
下 表 列 出 了 代 表 实 心 刷 子 的 B ru sh 对 象
常量 说明
B ru sh .AVT IV E B O R D E R 表 示 活动 窗 口 边框 颜色 的 B ru sh 对象
B ru sh .AVT IV E C A P T IO N 表 示 活动 标 题 栏颜 色的 B ru s h 对象
B ru sh .A P P W OR KS P A C E 表 示 应用 程 序 工作 区颜 色 的 B ru s h 对象
B ru sh .CO N T R O L 表示 控 件 颜 色 的 B ru sh 对象
B ru sh .CO N T R O L D A R K 表示 3D 元素 阴影 部 分 颜色 的 B ru sh 对象
B ru sh .CO N T R O L D A R K D A R K 表示 3D 元素 最深 颜 色 部分 的 B ru sh 对象B ru sh .CO N T R O L L IG H T 表示 3D 元素 高亮 部 分 颜色 的 B ru sh 对象B ru sh .CO N T R O L L IG H T L IG H T 表示 3D 元素 最亮 部 分 颜色 的 B ru sh 对象B ru sh .D E S K TO P 表 示 桌面 当 前 颜色 的 B ru sh 对象
B ru sh .HAL F T O N E 表 示 标准 半 色 调颜 色的 B ru s h 对象
B ru sh .H IG H L IG H T 表 示 高亮 元 素 背景 色的 B ru s h 对象
B ru sh .H O LLO W 表示 一 个 空 刷 子 什么 也 不 绘制
B ru sh .HO T T R ACK 表 示 指出 热 点 跟踪 颜色 的 B ru sh 对象 B ru sh .IN A C T IV E B O R D E R 表 示 不活 动 窗 口边 框颜 色 的 B ru s h 对象B ru sh .IN A C T IV E C A P T IO N 表 示 不活 动 标 题栏 颜色 的 B ru sh 对象 B ru sh .IN F O 表 示 信息 工 具 提示 背景 色 的 B ru s h 对象
B ru sh .M E N U 表 示 高亮 元 素 背景 色的 B ru s h 对象
B ru sh .NUL L 表示 一 个 空 刷 子
B ru sh .S C R O L L B A R 表 示 滚动 条 背 景色 的 B ru sh 对象
B ru sh .W INDO W 表 示 窗口 背 景 色的 B ru s h 对象下 表 列出 了 代 表影 线刷 子 的 B ru s h S ty le 常量
常量 说明
B ru sh S ty le .B A C KW A R DD IA G O NA L
表 示 反 对 角 刷 子 从 刷 子 原 点 左 上 角 到 右 下角的 平 行 线
B ru sh S ty le .D IA GONA L C R O S S 表 示 一个 交 叉 影线 的刷 子
B ru sh S ty le .F OR W A R DD IA GON A 表 示 一 个 正 斜 线 刷 子 从 刷 子 原 点 右 下 角 到
L 左上 角 的 平 行 线
B ru sh S ty le .H O LLO W 表 示 一 个 中 空 刷 子 一 个 中 空 刷 子 与 空 刷 等
同
B ru sh S ty le .H OR IZ ONT A L 表 示 由间 隔 均 等的 水平 线 构 成的 样式
B ru sh S ty le .P A T T E R N 表 示 一个 样 式 刷子
B ru sh S ty le .S O L ID 表 示 一个 实 心 刷子
B ru sh S ty le .V E R T IC A L 表 示 由间 隔 均 等的 垂直 线 构 成的 样式
创 建 B ru s h 对 象
如 何 创 建 B ru sh 对 象 取 决 于 所 需 刷 子 的 类 型 因 为 实 心 刷 子 是 B ru s h 对象 可 以 如 下 创 建 实 心 刷 子
B ru s h b r = B r u s h .BLAC K ;
样 式 刷 子 可 由 作 为 整 型 常 量 的 B ru sh 对 象 来 代 替 创 建 如 下
B rush b r = n e w B r ush( C o lo r .B L A C K , B rushS t y le .F O R W A R D D IA G O N A L ) ;
下 面 的 代 码 段 演 示 了 基 于 位 图 创 建 刷 子 的 一 种 方 法
B ru s h bm pB ru s h = ne w B r u s h ( ne w B itm a p (" c : \\ m yb itm a p .b m p " ) ) ;
本 例 中 假 定 刷 子 样 式 所 依 赖 的 位 图 存 储 在 磁 盘 上 的 文 件 中 然 而 也 可以 使 用 B itm a p 对 象 的 C rea teB i tm a p 方 法 在 运 行 期 间 定 义 一 个 位 图并 使 用 定 义 的 位 图 作 为 刷 子 样 式 的 基 础
在 G raph ic 对 象 上 设 置 刷 子
如 同 Pe n 和 F ont 对 象 一 样 B ru sh 对 象 包 含 无 颜 色 或 绘 制 功 能 它 是 GD I 功 能 的 一 个 子 集 当 使 用 刷 子 进 行 填 充 之 前 必 须 先 使 用 se t B ru sh 方 法用 G ra ph ic 对 象 关 联
P rotecte d v o id onP a int( P aint E v ent e)
{
/ / C r ea te a fo r w ard d ia g o n al b rush, a nd asso c iat e it w ith th e
// o b je c t .
B ru s h b r = n e w B ru s h ( C o lo r .B L A C K , B r u s h S t yle.F O R W A R D D IA G O N A L ) ; e .g ra p h ics .s et B ru s h ( b r);
}
当 B ru sh 对 象 与 G ra ph ic 对 象 建 立 关 联 后 使 用 G ra ph ic 对 象 实 例 绘 制的 所 有 多 边 形 都 由 关 联 的 刷 子 填 充 如 果 想 用 G ra ph ic 对 象 关 联 一 个 新刷 子 可 以 多 次 调 用 se t B ru sh
B ru s h 对 象 举 例
自 定 义 刷 子 基 于 从 文 件 加 载 或 在 内 存 创 建 的 位 图 C u s tom B rush 样 本 应用 程 序 演 示 了 如 何 创 建 和 使 用 自 定 义 刷 子
C u s tom B rus h 的 应 用 程 序 由 两 个 面 板 和 两 个 按 钮 组 成 第 一 块 面 板
pa ne l G r id 由 64 个 正 方 形 组 成 当 用 户 单 击 这 些 正 方 形 中 的 某 一 个时 应 用 程 序 寄 存 器 注 册 已 单 击 的 正 方 形 将 正 方 形 绘 制 为 黑 色 并 逐位 对 短 整 数 数 组 的 元 素 执 行 操 作 整 数 的 修 改 取 决 于 单 击 的 正 方 形
当 用 户 单 击 Te s t 按 钮 时 C u s tom B rush 应 用 程 序 根 据 短 整 型 的 数 组 创 建位 图 根 据 这 个 位 图 创 建 一 个 刷 子 然 后 使 用 刷 子 为 Te s t 按 钮 上 显 示的 面 板 pa ne l R e c t 绘 制
在 应 用 程 序 的 启 动 上 C u s tom B rush 应 用 程 序 执 行 如 下 任 务
-
调 用 用 户 定 义 的 g e t R ects 方 法 来 创 建 一 个 6 4 R ec tan g le 对 象 的 数 组并 为 应 用 程 序 的 网 格 面 板 绘 制 这 些 矩 形 pa n e l G r id
-
声 明 一 个 短 整 型 数 组 bB ru sh B i ts 存 于 数 组 中 的 整 数 值 将 最 后 形成 创 建 位 图 的 基 础 当 用 户 单 击 Te s t 按 钮 时 使 用 位 图 来 创 建 一 个刷 子 这 个 刷 子 绘 制 Te s t 按 钮 上 显 示 的 面 板
-
声
明 并 初 始 化 一 个 布 尔 型 变 量 数 组 为 假 此 数 组 用 于 跟 踪 pa n e l G r id 中 每 个 矩 形 的 状 态 当 用 户 单 击 Pa n e l G r id 中 的 一 个 矩 形 时 数 组 中相 应 的 变 量 设 置 为 真
pu b lic c la s s Fo r m 1 ex tend s F o r m
}
// R ecta n g les in to w h ich to d iv id e th e p a n e l. R e cta n g le [] r g R e cts = n e w R e cta n g le[ 6 4 ] ;
/ / T ra ck s th e s ta te o f th e r e cta n g les .
bo o lea n [ ] rg S ta tes = n e w bo o lea n [ 64 ] ;
in t [ ] b B ru s h B its = n e w in t [8 ];
pu b lic Fo r m 1 ( )
{
// s e t th e s ta te a rra y to a n in it ia l v a lu e o f fa ls e ; . f o r ( in t i = 0 ; i < rg S T A T E S .L E N G T H ; i+ + ){
rg S ta tes [i] = fa ls e;
}
// In it ia liz e th e fr o m . in it F o r m ( ) ;
/ / D iv ide th e pa n el in to 64 re c ta n gles a n d p a in t th e fo r m .
rg R e cts = g e t R e c t s (p a n elG r id . g et C li e n t R e ct(), 8 , 8 ) ; th is .inva lidate();
}
/ * *
-
T h is m e th o d d iv id es a s p e cif ied r e c ta n g u la r a r ea in to th e s p e cif ied
-
n u m b er of sub r ecta n g les ( d o w n an d a cro ss), an d r e tu rn s a n arra y
-
co n ta in ing th e s u br e c ta n g les
*/
p r iv a te R e c ta n g le [ ] g etR e cts ( R e cta n g le r c C lien t , in t n A c r o s s , in t n D o w n ){
in t d e lta x , d elta Y ;
in t x , y, r ight, b o t to m ; in t i;
R e cta n g le r g R e cts [] = n e w R e cta n g le[n A cro s s * n D o w n ] ;
/ / S to re th e rig h t a n d b o t to m o f th e r e cta n g le. r ight = rc C l ient. g e t R ig h t ( ) ;
b o tto m = r c C lie n t .g e t B o tto m ();
/ / D e term in e th e h e ig ht an d w idth of ea ch rectang le . deltaX = ( r ig ht – rc C l ien t .x ) / nA cr o s s;
d e lt a Y = (b o tto m – rcC lie n t . y) / n D o w n ;
/ / In it ia liz e t h e arra y o f cell rectan gles .
fo r ( y = r c C l ien t . y , i = 0 ; y < b o t to m ; y + = d e lta Y ) ;
f o r ( x = r c C lie nt.x ; x < ( r ig ht - n A cross) & & i < ( n A cro ss * nD o w n); x + = d e lt a X , i+ ){
r g R e c ts [ i] = ne w R e c ta n g le ( x, y ,de lta X , d e ta Y ) ;
}
}
retu rn rg R e cts ;
}
当 调 用 网 格 控 制 面 板 的 绘 制 事 件 处 理 程 序 时 使 用 存 储 于 应 用 程 序 矩 形数 组 rg R ec ts 中 的 维 数 和 存 储 于 类 类 布 尔 型 数 组 rg S ta te s 中 的 状态 来 绘 制 网 格 否 则 使 用 一 个 空 刷 子 绘 制 这 使 用 户 可 以 决 定 刷 子 的外 观 此 刷 子 是 在 网 格 面 板 上 根 据 矩 形 样 式 最 终 创 建 的
priv a te v o id pa ne l G r id_pa in t ( O b je c t s ourc e , P a in t E v e nt e )
{
e .g ra ph ic s .s e t P e n( ne w P e n( C o lo r . B L A C K , P e nS tyle . S O L ID , 1));
// D ra w th e g r id to r efle c t th e c u rr en t s ta te o f th e
// sq u a res .
fo r ( int i = 0 ; i < rg R e c ts . le ng h t; i+ + ){
if(rg S ta tes [ i] = = tru e){
// If th e squa re ha s be e n pre v io usly c l ic ke d, f ill it .
e . g rap hics .s e t B rush(n e w B ru s h ( C o lo r .B L A C K ) ) ;
} e lse {
e . g rap hics .s e t B rush( B r ush. N U L L ) ;
}
e .g ra p h ics .d ra w R e ct( rg R e c ts [ i]);
}
}
每 次 用 户 单 击 网 格 面 板 中 的 一 个 矩 形 时 都 会 激 活 面 板 单 击 事 件 在 网格 面 板 的 单 击 事 例 处 理 程 序 中 应 用 程 序 确 定 单 击 了 哪 一 个 矩 形 并 设置 相 应 的 布 尔 状 态 为 真 然 后 调 用 pa ne l G r id .in v a l id a te 强 迫 其 重 新 绘 制另 外 对 存 储 在 类 级 bB ru sh B i ts 变 量 中 适 当 的 数 组 成 员 逐 位 执 行 操 作
p r iv ate vo id p a n e lG r id_ m o useD o w n ( O b je c t s o urce, M ous eE v e nt e)
{
G rap h ics g r = th is . c rea teG ra p h ics();
gr.s e t B ru s h( n e w B rush( C o lo r .B L A C K ) ) ; In te ger n B it = ne w In t eger( 0);
// D eter m in e w h ich c ell w a s c lic k ed .
fo r(in t i = 0 ; i < 6 4 ; i+ + ){
R e cta n g le r c = n e w R e cta n g le( rg R e cts [ i] .x ,
r g R e c ts [ i] . y , rg R e c ts [ i] .h e ig h , r g R e c ts [ i] . w id th ) ;
if(rc .c o n ta in s (n e w P o in t ( e . x , e . y))){
/ / S e t th e a p p ro p r ia te b o o lea n s ta te v a ria b le .
rg S ta te s[i] = t ru e ;
/ / P erfo r m a b it w is e N O T o p era t io n o n th e a p p ro p r ia te
/ / in te ger in th e arra y of shorts on w h ic h w e’ll b a se
/ / o u r b it m a p .
i f ( i % 8 = = 0 )
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 8 0 ; if( i % 8 = = 1)
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 4 0 ; if( i % 8 = = 2)
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 2 0 ; if( i % 8 = = 3)
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 1 0 ; if( i % 8 = = 4)
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 0 8 ; if( i % 8 = = 5)
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 0 4 ; if( i % 8 = = 6)
bB N ru s h B its [ i/ 8] = bB ru s h B its [ i/ 8 ] 0 x 0 2 ; if( i % 8 = = 7)
b B ru s h B it s [i/ 8 ] = b B ru s h B its [i/8 ] 0 x 0 1 ;
b re a k ;
}
}
// R e p a in t th e g rid .
pa ne lG r id .in v a lid a te();
}
最 后 当 用 户 单 击 Te s t 按 钮 时 Te s t 按 钮 的 单 击 事 件 处 理 程 序 通 过 调用 p a n e lR e c t .in v a lid a te 对 Te s t 按 钮 上 显 示 的 面 板 ( p an e l R ec t) 进 行 重 新 绘制
P r iv ate v o id b tnT es t_ c lic k( O b je c t so urce, E v en t e)
{
p a n e lR ect.inva lidate();
}
在 pa ne l R e c t 绘 制 处 理 程 序 中 应 用 程 序 根 据 短 整 型 数 组 创 建 一 个 位 图
bB ru sh B i ts 根 据 位 图 创 建 一 个 刷 子 然 后 绘 制 Te s t 按 钮 上 显 示 的面 板 pa ne l R e c t
P r iv ate v o id p a n e lR ect_ p a in t ( O b je ct source, P a in t E v e nt e)
{
s hort [ ] rg S horts = n e w sh ort[ 8 ] ;
fo r ( in t i = 0 ; i < b B ru sh B its. le n g th ; i+ + ){
rg s h o rts [i] = ( s h o rt) b B ru s h B its [ i];
}
e .g ra ph ic s . se t B rus h( ne w B rush( ne w B i tm a p ( 8 , 8 ,1 , 1 ,rg S horts ) ) ) ;
e .g ra phics .f il l( p a nelR e ct . get C lie n t R e c t ( ) ) ;
}
绘 制 位 图
位 图 是 一 个 可 绘 制 的 表 面 此 表 面 可 用 于 显 示 笔 刷 子 或 图 像 包 括
W ind ow s 位 图 元 文 件 .g if 和 .jp g 图 像
B itm a p 对 象 支 持 对 位 图 的 创 建 和 加 载 可 以 使 用 此 对 象 加 载 一 个 来 自文 件 流 或 资 源 的 位 图 图 像 或 在 内 存 创 建 位 图 另 外 B itm a p 对象 支 持 在 位 图 中 定 义 透 明 色
创 建 B itm a p 对 象 后 使 用 G ra ph ic 对 象 的 dra w Im a g e 方 法 在 显 示 器中 重 现 B itm a p 对 象
下 面 的 代 码 创 建 了 一 个 新 的 B itm a p 对 象 然 后 使 用 Fo rm 类 的
crea te G rap h ic s 方 法 创 建 G ra ph ic 对 象 来 绘 制 图 像
B itm ap b m p = n e w B it m ap (" c : \\M y Im ag e .b m p " ) ; G rap hics g = th is .creat e G ra p h ics();
g .d raw Im a g e( b m p , ne w Po in t ( 10, 10));
缩 小 和 放 大 位 图
W F C 支 持 的 所 有 图 像 M e ta f ile Ic o n B itm a p 和 Cu rso r 都 支 持dra w S tre tc hT o 和 d ra w T o 方 法 通 过 这 些 方 法 执 行 G ra ph ic 对 象 可 实现 所 有 图 像 的 重 现 调 用 G ra ph ic 对 象 的 d raw Im ag e 方 法 时 对 象 决 定是 否 在 图 像 对 象 上 调 用 dra w S tre tc hT o 或 dra w T o 方 法
D ra w S t re tc h T o 方 法 放 大 或 缩 小 图 像 以 适 应 特 定 的 矩 形 区 域 dra w T o 方法 放 大 图 像 以 适 合 特 定 的 区 域 但 如 果 对 目 标 区 域 来 讲 图 像 太 长
dra w T o 方 法 会 剪 切 图 像 另 外 两 种 方 法 都 支 持 绘 制 图 像 部 分 到 G ra ph ic
边 框 矩 形 的 指 定 部 分
不 能 直 接 调 用 D ra w S t re tc h T o 或 dra w T o 方 法 它 们 是 在 W F C 图 像 类 中作 为 保 护 对 象 而 定 义 的 为 决 定 调 用 哪 一 种 方 法 须 调 用 d raw Im ag e 方法 的 一 种 版 本 且 带 有 一 个 布 尔 标 量 参 数 下 面 是 G ra ph ic 对 象 定 义 的一 种 方 法
P u b li c f in a l v o id d ra w Im a g e ( Im a g e I, R e cta n g le r , b o o le a n s ca le)
如 果 scale 参 数 是 真 则 放 大 或 缩 小 图 像 以 适 合 剪 切 矩 形 域 否 则 则剪 切 图 像
透 明 重 现 映 射
在 一 个 图 像 中 B itm a p 对 象 支 持 一 种 或 多 种 颜 色 的 透 明 重 现
如 果 需 要 以 透 明 的 方 式 重 现 单 一 的 颜 色 可 使 用 se t T ra ns pa re n t C o lo r 和
se t T ra ns pa re n t 方 法 S e t T ra ns pa re n t C o lo r 方 法 须 带 有 一 个 Co lo r 对 象 参数 此 参 数 指 定 透 明 重 现 的 位 图 颜 色 S e t T ra ns pa re n t 方 法 需 带 一 个 布尔 值 以 指 定 是 否 重 现 设 定 的 透 明 颜 色
例 如 以 下 代 码 段 指 定 黑 色 作 为 透 明 色 当 调 用 G ra ph ic 对 象 的
d raw Im ag e 方 法 来 绘 制 图 像 时 图 像 中 的 黑 色 像 素 点 并 不 重 现
p ro tect ed v o id o n P a in t( P a in tE v en t e)
{
B it m a p bm p = ne w B itm a p (" c :\ \M y Im a g e .b m p " ) ; B m p .s etT ra n s p a ren t C o lo r( C o lo r.B L A C K ) ;
B m p .s etT ra n s p a ren t(fa ls e);
e .g ra phics .d ra w Im a ge( b m p , n e w Po in t ( 0 ,0));
}
也 可 以 根 据 位 屏 蔽 创 建 B itm a p 对 象 来 获 得 透 明 性 在 两 个 位 屏 蔽 中一 个 是 彩 色 另 一 个 是 单 色 在 彩 色 屏 蔽 中 透 明 绘 制 位 图 的 每 一 部 分都 应 为 黑 色 在 单 色 屏 蔽 中 透 明 绘 制 位 图 的 每 一 部 分 都 应 为 白 色
光 栅 操 作
光 栅 操 作 是 对 GD I 图 元 显 示 的 一 种 逻 辑 操 作 例 如 刷 子 笔 图 像 或形 状 以 获 得 可 视 效 果 能 够 使 用 G ra ph ic 对 象 执 行 的 光 栅 操 作 是 在R a s te r O p 对 象 中 定 义 的 当 检 查 G ra ph ic 对 象 支 持 的 这 种 方 法 时 会 发
现 每 一 个 基 础 操 作 如 画 线 或 图 像 显 示 等 这 些 方 法 都 带 有 一 个 R a s te r O p
作 为 参 数
在 最 简 单 的 情 形 中 G ra ph ic 对 象 的 绘 制 方 法 只 对 一 些 显 示 区 支 持 白 色或 拷 贝 的 像 素 重 写 最 近 显 示 的 内 容 添 加 光 栅 操 作 后 重 写 就 变 得 非常 复 杂
例 如 假 设 要 对 最 近 被 图 像 覆 盖 的 区 域 绘 制 一 个 黑 色 的 矩 形 框 但 想 逻辑 组 合 这 些 黑 色 像 素 使 之 与 目 标 图 像 中 的 像 素 对 应 并 对 结 果 进 行 显示 光 栅 操 作 可 以 实 现 这 些 组 合 操 作
在 逻 辑 上 R a s te r O p 对 象 支 持 的 变 化 太 多 了 以 整 本 书 的 篇 幅 都 不 能 介绍 完 全 下 面 的 语 句 演 示 了 调 用 R a s te r O p 对 象 的 基 本 语 法 这 些 语 句设 置 了 窗 体 的 背 景 色 并 且 用 背 景 色 的 反 色 绘 制 了 一 条 线
P rotecte d v o id onP a int( P aint E v ent e)
{
th is .s et B a c k C o lo r ( n e w C o lo r ( 255 , 25 5, 2 5 5);
e . g ra p h ics .d ra w L in e( ne w Po in t ( 10, 10), n e w Po in t ( 10 0, 1 0 ) , R a s terO p .T A R G E T .in v ert());
}
绘 制 形 状
G ra ph ic 对 象 支 持 绘 制 线 矩 形 弦 弧 线 弧 线 角 和 贝 塞 尔 Be z ie r
样 条
直 线
直 线 是 显 示 器 上 一 组 高 亮 显 示 像 素 可 以 用 两 点 来 确 定 起 点 和 终 点在 W ind ow s 中 位 于 起 点 的 像 素 总 是 包 括 在 线 中 而 位 于 终 点 的 像 素总 是 排 除 在 外 的 这 些 线 有 时 被 称 为 包 括 - 排 除 in c lu s iv e -ex c lu s iv e 通 过 调 用 G ra ph ic 对 象 的 dra w L ine 方 法 可 以 画 一 条 线 这 种 方 法 带 有两 个 参 数 来 指 明 线 的 起 点 和 终 点
P rotecte d v o id onP a int( P aint E v ent e){
R e c ta n g le r c C lien t = th is .g e t C lien t R e ct();
// D ra w lin es th a t d iv id e th e s cr e e n a r ea eq u a lly in to f o u r s q u a res . e .g ra p h ics .d ra w L in e( n e w P o in t( rc C lie n t .x , rc C lie n t .h e ig h t / 2 ) ,
n e w P o in t ( rc C lie n t . w id th , r c C lie n t .h e ig h t / 2 ) ) ;
e .g ra p h ics .d ra w L in e( n e w P o in t( rc C lie n t . w id th / 2 , r c C lien t.y ) ,
n e w P o in t( rc C lie n t .W id th / 2 , rc C lien t.h e ig h t ) ) ;
}
矩 形
为 M ic rosoft W indow s 编 写 的 应 用 程 序 使 用 矩 形 指 定 屏 幕 上 或 窗 口 中 的
矩 形 区 域 使 用 矩 形 描 述 窗 口 的 客 户 区 屏 幕 的 重 绘 制 区 或 格 式 文 本 的显 示 区 也 可 以 使 用 矩 形 来 进 行 填 充 画 边 框 或 转 换 带 给 定 刷 子 的 部 分客 户 区 并 检 索 窗 口 坐 标 或 窗 口 客 户 区
矩 形 区 的 维 数 在 W F C R ec tan g le 对 象 中 描 述 这 个 对 象 由 描 述 矩 形 的 屏幕 位 置 和 维 数 的 X Y 高 度 和 宽 度 整 数 组 成 另 外 使 用 对 象 的 ge t R ig h t 和 g e t B o tto m 方 法 可 以 检 索 右 边 和 底 边 的 屏 幕 位 置
更 多 信 息 请 参 看 下 节 矩 形 操 作 和 矩 形 举 例
矩 形 操 作
R ec tan g le 对 象 提 供 了 许 多 使 用 矩 形 的 方 法 这 个 对 象 的 等 价 方 法 确 定是 否 有 两 个 R e gta n gle 对 象 是 一 样 的 — — 也 就 是 说 它 们 是 否 具 有 相 同的 坐 标
In f la teR ect 方 法 增 加 或 减 少 矩 形 的 宽 度 或 高 度 或 两 者 它 可 以 从 矩 形 的两 个 端 点 增 加 或 减 少 宽 度 也 可 以 从 矩 形 的 两 个 顶 部 和 底 部 增 加 或 减 少高 度
过 载 的 包 含 方 法 可 以 确 定 一 个 矩 形 描 述 的 区 域 是 否 存 在 于 另 一 个 矩 形 描述 的 区 域 中 或 确 定 矩 形 中 是 否 存 在 一 个 给 定 的 点
In te rs e c ts 和 in te rs e c ts W i th 方 法 确 定 了 两 个 R ec tan g le 对 象 的 相 交 结 果
矩 形 举 例
本 节 的 例 子 说 明 如 何 把 应 用 程 序 的 客 户 区 分 成 几 个 子 矩 形 以 及 在 这 些 区内 如 何 工 作
启 动 应 用 程 序 时 把 主 窗 体 的 客 户 区 分 成 16 16 的 子 区 并 在 这 些 矩形 区 中 以 指 定 的 颜 色 显 示 每 个 阴 影 为 修 改 显 示 的 矩 形 数 量 可 以 使用 D im e nsions 菜 单 项 来 显 示 一 个 对 话 框 在 对 话 框 中 可 以 指 定 显 示矩 形 的 新 数 量
下 例 中 给 出 了 把 屏 幕 划 分 成 几 个 R ec tan g le 对 象 的 方 法 此 方 法 ge t R e c ts 带 有 三 个 参 数 指 定 划 分 区 域 的 一 个 矩 形 两 个 整 数 表 明 划 分 矩 形 长 和宽 的 单 位 这 种 方 法 返 回 一 个 矩 形 数 组 此 数 组 中 包 括 相 应 的 坐 标
p riv a te R e c ta n g le [ ] g e tR e c ts ( R e c ta n g le rc C lie n t , in t n D o w n , in t n A c ro s s ){
in t d e ltaX , d e ltaY ; / / T h e h e ig ht an d w idth of ea ch ce l l. in t x , y ;
in t i;
R ec tan g le rg R ec ts [ ] = n e w R e c tan g le [ n D o w n * n A cro ss];
/ / D e t erm in e th e h e ig ht an d w idth of ea ch R e c tan gle.
d e lta X = ( rc C lie n t.g e tR ig h t ( ) – rc C l ie tn . x ) / n A c ro ss;
delta Y = ( r c C li e tn .g e t B o t to m ( ) – r c C l ien t . y) / n D ow n ;
// C rea te a n d in i tia liz e th e R e c tan g le a r ra y .
fo r ( y= r c C l ient. y , i = 0 < rc C l ien t .g e t R igh t ( ) – nA cro s s) & & i < ( n A cro s s * n D o w n ) ; x + = d e lt a X , i+ + ){
rg R e c ts [ I] = n e w R e c ta n g le ( x ,y , d e l ta X , d e l ta Y ) ;
}
}
// R e tu rn th e in itia liz e d a r ra y .
retu rn rg R e c ts ;
}
启 动 应 用 程 序 时 Fo rm 类 构 造 器 初 始 化 两 个 类 级 整 数 nA c ross 和
nD ow n 为 16 并 调 用 以 前 列 出 的 g e t R ects 方 法
pu b lic Fo r m 1 ( ){ in it F o r m ( ) ;
nA cr oss = 1 6 ; nD o w n = 1 6 ;
// In it ia liz e c la s s - lev e l a rra y .
r g R e c ts = g e t R ects ( th is.g e t C lient R ect(), nA cr o s s, nD o w n);
}
类 构 造 器 返 回 后 自 动 调 用 类 绘 制 事 件 处 理 程 序
事 件 处 理 程 序 通 过 类 级 rg R ec ts 数 组 循 环 执 行 使 用 G ra ph ic 对 象 的
se t B ru sh 方 法 设 置 新 的 颜 色 然 后 调 用 d raw R ec ts 方 法 来 绘 制 数 组 矩 形
p ro tect ed v o id o n P a in t( P a in tE v en t e){
f o r( in t i = 0 ; i < rg R e cts .len g th ; i+ + ){
e . g rap hics .s e t B rush(n e w B ru s h ( n e w C o lo r ( 0 ,0 ,i) ) ) ;
e . g ra p h ics .d ra w R e ct( rg R e cts [ i]);
}
}
最 后 Fo rm 类 的 重 设 大 小 处 理 程 序 简 单 地 重 新 初 始 化 数 组 然 后 强 制窗 体 的 客 户 区 重 新 绘 制
pro tect ed vo id o n R es ize( E ven t e){
R e c ta n g le r c C lien t = th is .g e t C lien t R e ct();
r g R e c ts = g e t R ects ( rc C l ient, nD o w n, nA cr oss); t h is .inva lidate();
}
弦
弦 是 椭 圆 和 直 线 段 称 为 割 线 的 交 点 界 限 内 的 区 域 我 们 可 以 使 用 当前 的 笔 来 画 弦 的 轮 廓 使 用 当 前 的 刷 子 来 填 充 在 割 线 的 一 边 剪 辑 部 分椭 圆
要 画 一 条 弦 可 以 使 用 G ra ph ic s 对 象 的 dra w C hord 方 法 语 法 如 下
dra w C h o rd R e c tan gle p1 po in t p2 po in t p3
dra w C hord 方 法 的 R ec tan g le 参 数 指 定 了 绘 制 椭 圆 的 区 域 其 他 两 个 Po in t
参 数 指 定 了 割 线 与 椭 圆 的 两 个 交 点
下 例 是 对 dra w C hord 的 两 次 调 用 第 一 次 调 用 在 显 示 器 的 左 下 角 画 了 一
个 弦 第 二 次 调 用 在 右 上 角 画 了 一 个 弦 每 次 调 用 dra w C hord 都 有 不同 的 刷 子 关 联 了 G ra ph ic 对 象 来 确 保 两 个 弦 组 成 一 个 圆 分 别 绘 制 黑 色和 白 色
pro te c te d v o id onP a in t( P a in tE v e n t e ){
R e c ta n g le r c C lien t = th is .g e t C lien t R e ct();
// A s so c ia te a b la c k brus h w i th th e ob je c t a nd d ra w a c hord.
e .g ra phics .s e t B ru s h ( ne w B r u s h ( n e w C o lo r ( 0 ,0 ,0)));
e.g rap h ics .d ra w C hord( r c C l ient, n ew P o in t ( rc C li e nt.x , rc C l ient. y), n e w P o in t ( r c C l ien t .g et R ig h t ( ) ,r c C lie n t .g e t Bo t to m ( ) ) ;
// A s so c ia te a w h i te brush w i th th e ob je c t a nd dra w a c hord.
e .g ra phics .s e t B ru s h ( ne w B r u s h ( n e w C o lo r ( 25 5 ,25 5 ,2 5 5)));
e.g rap h ics .d ra w C hord( r c C l ient, n e w P o in t ( r c C l ient.g et R ight(), r c C li e n t .g e t B o tto m ()), n e w P o in t(rc C li e n t .x , r c C l ie n t.y));
}
弧
通 过 调 用 dra w A rc 方 法 应 用 程 序 可 以 画 一 个 椭 圆 或 椭 圆 的 一 部 分 这种 方 法 可 以 在 不 可 视 矩 形 的 周 边 画 一 条 曲 线 称 之 为 边 框 矩 形 椭 圆 的尺 寸 可 以 通 过 从 矩 形 中 心 到 矩 形 两 边 放 大 的 两 个 可 视 半 径 来 指 定
调 用 dra w A rc 方 法 时 应 用 程 序 要 指 定 带 边 框 矩 形 的 坐 标 和 半 径
下 例 画 了 一 条 弧 填 充 了 窗 体 的 客 户 区 并 使 用 G ra ph ic 对 象 的 dra w L ine 方 法 从 弧 的 顶 端 到 半 径 画 了 一 条 线 然 后 从 半 径 到 椭 圆 的 最 右 边 画 了 一条 线
p ro tect ed v o id o n P a in t( P a in tE v en t e){
R e c ta n g le r c C lien t = th is .g e t C lien t R e ct();
e .g ra p h ics .d ra w A r c( r c C lien t , n e w P o in t ( r c C lien t.w id th /2 ,rc C lien t.y ) , n e w P o in t ( rc C lie n t.w id th , r c C lie n t .h e ig h t / 2 ));
e .g ra p h ics .d ra w L in e( n e w P o in t( rc C lie n t . w id th / 2 , r c C lien t.y ) , n e w P o in t( rc C li e n t . w id th / 2 , r c C lien t.h e ig h t / 2 ));
e .g ra p h ics .d ra w L in e( n e w P o in t( rc C lie n t . w id th , r c C lie n t .h e ig h t / 2 ) , n e w P o in t( rc C li e n t . w id th / 2 , r c C lien t.h e ig h t / 2 ));
}
弧 线 角
弧 线 角 类 似 于 弧 线 两 者 之 间 最 基 本 的 实 用 性 区 别 是 当 应 用 程 序 使 用
dra w A rc 画 一 个 弧 时 须 指 明 弧 线 径 向 的 X 和 Y 位 置
对 照 来 说 应 用 程 序 使 用 dra w A rc A n g le 方 法 画 一 个 弧 线 角 需 指 明 角的 度 数 方 法 本 身 需 要 照 管 画 线 始 点 和 终 点 的 坐 标 及 定 位
dra w A r A n g le 方 法 的 语 法 如 下
p u b lic f in a l v o id d ra w A n g le A r c( P o in t cen te r , in t ra dius , f lo a t sta r t A n g le , f lo a t e n dA ng le )
Po in t 参 数 定 义 了 屏 幕 上 的 径 向 位 置 此 位 置 是 在 ra d ius 参 数 中 指 出 的S ta rtA n g le 指 明 了 起 始 的 度 数 e ndA n g le 参 数 指 出 了 从 S ta rtA n g le 开 始画 多 少 度 角
下 例 说 明 了 此 种 方 法 的 使 用 方 式 在 30 度 角 处 开 始 延 伸 了 300 度 画了 一 个 弧 度 角
p ro tect ed v o id o n P a in t( P a in tE v en t e){
R e c ta n g le r c C lien t = th is .g e t C lien t R e ct(); in t x = r c C lien t.w id th / 2 ;
in t y = r c C lien t .h e ig h t / 2 ; in t ra d iu s = 100 ;
f lo a t s ta rtA n g le = 3 0 ; f lo a t e n dA n g le = 30 0;
e.g rap h ics .d ra w A n g leA rc( n ew P o in t ( x ,y) , ra d ius, start A nlg e , end A n g le);
}
贝 塞 尔 Be z ie r 样 条
用 四 点 可 确 定 一 个 Be z ie r 样 条 包 括 两 个 端 点 和 两 个 控 制 点 这 些 点组 合 在 一 起 定 义 一 个 曲 线 两 个 端 点 定 义 曲 线 的 开 始 和 结 束 控 制 点 把曲 线 拉 离 由 始 点 和 终 点 形 成 的 线 段
为 绘 制 Be z ie r 样 条 需 使 用 d raw B e z ier 曲 线 方 法 这 种 方 法 需 要 一 个 Po in t 对 象 数 组 作 为 参 数 数 组 中 的 四 个 元 素 定 义 了 样 条 的 始 点 两 个 控 制 点和 终 点
要 绘 制 多 个 样 条 每 个 样 条 在 第 一 个 元 素 之 后 包 括 三 个 数 组 元 素 第一 个 样 条 的 终 点 作 为 下 一 个 的 始 点 三 个 数 组 元 素 定 义 了 控 制 点 和 终点
下 面 的 代 码 使 用 d raw B e z ier 方 法 绘 制 了 一 条 贝 塞 尔 曲 线 表 明 每 次 窗口 重 置 的 大 小
p ro tect ed v o id o n P a in t( P a in tE v en t e)
{
P o in t [] p t = n e w P o in t [ 4 ] ;
R e cta n g le r c = th is .g et C l ien t R e ct(); in t rig h t = r c.g e t R ig h t ( ) ;
in t b o tto m = r c .g e t B o t to m ( ) ;
p t [ 0 ] = n e w P o in t( rig h t / 4 , b o tto m / 2 ) ; p t [ 1 ] = n e w P o in t( rig h t / 2 , b o tto m / 4 ) ;
pt[ 2 ] = ne w P o in t ( r ig h t / 2, 3 * bo t to m / 4); p t [ 3 ] = n e w p o in t ( 3 * r ig h t / 4 , b o tto m / 2 ) ;
e .g ra p h ics .d ra w B ez ier( p t ) ;
}
pro tect ed vo id o n R es ize( E ven t e)
{
t h is .in v la id a te();
}
第 16 章 建 立 和 导 入 Ac tiv e X 控 件
Ac t iv e X 技 术 的 基 础 是 组 件 对 象 模 型 CO M 另 外 为 创 建 Ja va 组件 W ind ow s F o unda t ion C la s se s W F C 可 以 使 用 V is u a l J + + 来 建 立 和导 入 Ac t iv e X 控 件 由 于 Ac t iv e X 是 基 于 CO M 的 可 以 像 其 他 CO M 对 象 一 样 很 容 易 地 合 并 Ac t iv e X 可 以 在 其 他 开 发 环 境 中 诸 如 M ic rosoft V isu al B a s ic 和 M ic rosoft V isu a l J+ + 开 发 控 件 进 行 应 用 并 在 HTM L 页 中 提 供 高 级 特 征 此 外 可 以 导 入 第 三 方 Ac t iv e X 控 件 来 增 强 W F C 应 用 程 序
在 本 章 中 将 学 到
-
如 何 从 现 有 W F C 组 件 建 立 Ac t iv e X 控 件
-
如 何 把 Ac t iv e X 控 件 导 入 W F C 应 用 程 序
建 立 A c tiv e X 控 件
使 用 Ja va 的 W F C 的 组 件 模 型 可 以 创 建 A c tiv e X 控 件 用 以 在 W F C 应 用 程 序 中 或 其 他 开 发 环 境 中 支 持 Ac t iv e X 为 从 W F C 控 件 中 创 建 一个 Ac t iv e X 控 件 以 便 注 册 W F C 控 件 的 类 作 为 CO M 类 一 旦 注 册 了控 件 的 类 作 为 CO M 类 就 可 以 为 控 件 打 包 一 个 类 文 件 到 CO M D L L
并 在 注 册 表 中 注 册 它 为 Ac t iv e X 控 件 一 旦 注 册 了 控 件 为 A c t iv e X 控 件就 可 以 从 Ac t iv e X 客 户 访 问 它
在 本 方 案 中 可 以 使 用 第 1 章 创 建 控 件 中 说 明 的 控 件 如 果 没 有 创建 它 则 建 立 本 节 中 说 明 的 控 件 然 后 继 续 这 个 过 程 你 将 学 到
-
如 何 公 布 W F C 控 件 作 为 CO M 对 象
-
如 何 通 过 其 他 应 用 程 序 打 包 控 件 到 CO M D L L
-
如 何 注 册 CO M D L L 作 为 Ac t iv e X 控 件
-
如 何 导 入 基 于 W F C 的 Ac t iv e X 控 件 到 V isu a l B a s ic
注 意 下 面 的 过 程 假 设 在 Visual J++ 中 已 存 在 一 个 打 开 的 WFC 组件 项 目
定 义 W F C 控 件 作 为 CO M 对 象
为 了 从 其 他 Ac t iv e X 客 户 中 访 问 你 的 控 件 要 把 控 件 定 义 为 CO M 对 象使 类 作 为 CO M 对 象 公 布 需 要 在 类 定 义 上 放 一 个 @ C O M .R e g iste r 注 释标 记 V isu a l J + + 为 类 提 供 了 一 种 自 动 生 成 @ C O M . R e g is te r 注 释 的 方 法
注 意 如 果 已 使 用 Control 模 板 创 建 了 控 件 的 项 目 则 控 件 已 经 包含 了 一 个 注 释 标 记 来 注 册 它 作 为 C O M 对 象 删 除 前 斜 杠 // 来启 用 注 释 标 记
定 义 W F C 组 件 作 为 CO M 对 象
- 在 P ro ject 菜 单 上 单 击 < P ro je c t> P rope rtie s 这 里 的 < P ro je c t> 是 控 件
项 目 名
-
在 < P ro je c t> P rope rtie s 对 话 框 中 单 击 CO M C la ss 标 记
-
在 类 列 表 中 选 择 控 件 的 类
-
单 击 O p t ions 按 钮
-
可 选 在 T ype L ibra r y O p t ions 对 话 框 中 改 变 创 建 的 类 型 库 文 件 的 名字 来 定 义 与 控 件 库 名 控 件 名 的 接 口 作 为 开 发 环 境 和 帮 助 文 件的 信 息 来 显 示 然 后 单 击 O K
-
在 < P ro je c t> P rope rtie s 对 话 框 中 单 击 OK
V isu a l J + + 在 控 件 类 定 义 的 上 端 添 加 了 一 个 注 释 标 记 来 注 册 此 类 为
CO M 对 象
注 意 如 果 不 需 要 定 义 多 个 类 作 为 C O M 类 可 以 在 Class Properties 对 话 框 中 定 义 一 个 C O M 类 为 显 示 Class Prop erties 对 话 框 在Class Outline 中 右 击 类 名 然 后 单 击 Class Properties 在 Class Properties 对 话 框 中 选 择 COM Class 复 选 框
在 CO M D L L 中 打 包 控 件
定 义 了 W F C 控 件 作 为 CO M 对 象 后 就 可 以 打 包 控 件 的 类 文 件 到 CO M D L L 文 件 中 控 件 必 须 在 CO M D L L 文 件 中 打 包 才 能 作 为 A c tiv e X 控件 使 用 CO M D L L 提 供 Ac t iv e X 客 户 使 用 的 接 口 来 访 问 控 件 及 其 成员
注 意 为 了 在 Internet 上 发 布 ActiveX 控 件 可 以 在 C A B 文 件 中打 包 控 件 而 不 是 在 COM DLL 中
建 立 控 件 作 为 CO M D L L
-
在 P ro ject 菜 单 上 单 击 < P ro je c t> P rope rtie s 这 里 < P ro je c t> 是 指 控 件项 目 名
-
在 < P ro je c t> P rope rtie s 对 话 框 中 单 击 O u tput F o rm a t 选 项 卡
-
选 择 E n ab le P a c k ag in g 复 选 框
-
选 项 卡 上 的 其 他 控 件 都 是 启 用 的
-
在 P ack ag in g ty p e 下 拉 列 表 中 选 择 CO M D L L
-
在 F ile n a m e 框 中 键 入 CO M D L L 的 名 字 默 认 名 是 使 用 项 目 名 创建 的
-
在 关 联 的 下 拉 列 表 中 选 择 ou tpu ts of type 和 J a v a C lass e s & R eso u rces
选 项
- 单 击 O K
建 立 项 目
为 项 目 配 置 了 打 包 选 项 后 需 要 建 立 项 目 V isu a l J + + 为 项 目 添 加 了 一个 类 型 库 此 项 目 为 控 件 定 义 CO M 接 口 类 型 库 也 包 含 了 注 册 表 注 册CO M 类 作 为 控 件 时 使 用 的 信 息 当 生 成 类 型 库 时 V isu a l J + + 使 用 创 建的 类 型 库 文 件 在 注 册 表 中 注 册 项 目 中 的 CO M 类 注 册 了 控 件 的 类 之 后 V isu a l J + + 打 包 项 目 的 类 文 件 和 类 型 库 到 CO M D L L 中
建 立 项 目
- 在 Bu i ld 菜 单 上 单 击 Bu i ld
注 册 CO M D L L
- 旦 注 册 了 W F C 控 件 的 类 为 CO M 类 然 后 打 包 它 们 到 CO M D L L 就 在 系 统 注 册 表 中 注 册 了 CO M D L L 为 了 做 到 这 一 点 可 以 使 用R e gsvr 3 2 . e x e 程 序 因 为 项 目 的 类 型 库 标 记 W F C 控 件 的 CO M 类 为 一个 控 件 则 R e gsvr 3 2 注 册 CO M D L L 为 一 个 A c t iv e X 控 件 当 注 册 CO M
D L L |
时 |
其 他 应 用 程 序 可 以 看 |
到 系 统 上 注 |
册 的 |
A c tiv e X |
控 件 列 表 中 的 |
---|---|---|---|---|---|---|
W F C |
控 件 |
注 册 CO M D L L
-
单 击 S ta r t 按 钮 然 后 单 击 Ru n
-
在 O p e n 框 中 键 入
R e gsvr 3 2 . e x e < D L L 路 径 和 文 件 名 >
这 里 的 <D LL 路 径 和 文 件 名 > 是 指 控 件 的 D L L 路 径 和 文 件 名 本 方 案中 键 入
R e g s v r 32 c :\p ro je c t \p ro je c t 1 .d ll
- 单 击 O K
如 果 收 到 注 册 失 败 的 信 息 请 确 认 控 件 的 D L L 的 路 径 是 否 正 确 文件 是 否 存 在
测 试 M ic ros o f t V is ual B a s ic 中 的 控 件
为 了 测 试 Ac t iv e X 控 件 可 以 为 编 程 工 具 和 支 持 A c t iv e X 的 应 用 程 序 添加 控 件 在 本 方 案 中 可 以 使 用 M ic rosoft V is u a l B a s ic 5 .0 版 或 以 后 版本 添 加 一 个 控 件 然 后 测 试 其 特 性
为 V isu a l B a s ic 窗 体 添 加 基 于 W F C 的 A c t iv e X 控 件
-
运 行 V isu a l B a s ic
-
在 V isu a l B a s ic 中 的 F ile 菜 单 上 单 击 N e w P ro je c t
-
在 N e w P ro je c t 对 话 框 中 单 击 S ta n d a rd EX E 图 标 然 后 单 击 OK
-
右 击 工 具 箱 然 后 单 击 C o m pone n ts
-
在 C o m pone n ts 对 话 框 中 选 择 控 件 然 后 单 击 OK
对 本 方 案 选 择 P ro je c t 1 控 件
-
在
工 具 箱 中 双 击 控 件 以 在 窗 体 中 添 加 它控 件 添 加 到 窗 体 中 心
-
按 F5 运 行 项 目
则 显 示 了 带 控 件 的 窗 体
如 果 使 用 在 第 1 章 创 建 控 件 一 节 说 明 的 控 件 则 可 以 滚 动 水 平 滚 动条 控 件 中 的 文 本 随 着 滚 动 条 的 变 化 而 变 化
关 于 在 W F C 应 用 程 序 中 导 入 Ac t iv e X 控 件 的 信 息 请 参 看 下 一 节 导入 Ac t iv e X 控 件
导 入 A c tiv e X 控 件
Ac t iv e X 控 件 可 以 对 W F C 应 用 程 序 提 供 许 多 增 强 功 能 许 多 第 三 方Ac t iv e X 控 件 可 用 于 添 加 功 能 诸 如 定 制 按 钮 的 形 状 电 话 学 技 术 图标 绘 制 图 形 和 电 子 表 格 可 以 使 用 V isu a l J + + 中 导 入 Ac t iv e X 控 件其 过 程 与 导 入 CO M 对 象 类 似
在 本 方 案 中 将 导 入 用 M ic rosoft In te rn e t E xp lo re r 4 .0 版 安 装 的 M ic rosoft A c t ive M o vie 控 件 将 学 到
-
如 何 在 系 统 注 册 表 中 注 册 Ac t iv e X 控 件
-
导 入 Ac t iv e X 控 件 时 如 何 创 建 项 目
-
如 何 把 Ac t iv e X 控 件 导 入 到 项 目 中
-
如 何 为 窗 体 添 加 Ac t iv e X 控 件 并 设 置 其 属 性
-
如 何 建 立 和 运 行 项 目 来 测 试 Ac t iv e X 控 件
注 册 控 件
为 了 使 Ac t iv e X 控 件 对 V isu a l J + + 可 用 必 须 在 系 统 注 册 表 中 注 册 此 控件
注 意 本 方 案 中 由 于 在 安 装 Internet Explorer 时 已 注 册 了ActiveMovi e 控 件 所 以 不 需 要 再 注 册
注 册 A c tiv e X 控 件
-
单 击 S ta r t 按 钮 然 后 单 击 Ru n
-
在 O p e n 框 中 键 入
R egsvr 3 2 . ex e< C o ntro l 路径 和文 件名 >
这 里 的 < C on tro l 路 径 和 文 件 名 > 是 指 控 件 的 路 径 和 文 件 名 本 方 案中 键 入
R egsvr 3 2 c : \W in do w s \s ys te m \ A M O V IE .O C X
- 单 击 O K
如 果 收 到 注 册 失 败 的 信 息 请 确 认 控 件 的 路 径 是 否 正 确 文 件 是 否 存在
创 建 W F C 项 目
当 导 入 Ac t iv e X 控 件 时 V isu a l J + + 在 项 目 中 创 建 软 件 包 目 录 并 在 这些 软 件 包 目 录 中 添 加 类 封 装 器 w ra ppe r 来 访 问 Ac t iv e X 控 件 因 此必 须 有 有 效 的 项 目 来 导 入 Ac t iv e X 控 件
创 建 W F C 控 件
-
在 F ile 菜 单 上 单 击 N e w P ro je c t
-
在 N e w 选 项 卡 上 展 开 V isu a l J + + P ro je c t 文 件 夹 单 击 A pp lic a tions
然 后 单 击 W ind ow s A pp lic a t ions 图 标
-
在 N a m e 框 中 键 入 项 目 名
-
在 L o c a tio n 框 中 键 入 要 保 存 项 目 的 路 径 或 单 击 B ro w s e 来 导 入 文件 夹
-
单 击 O p e n
则 在 P ro ject E x p lo rer 中 出 现 项 目 的 折 叠 视 图 如 果 P ro je c t E x p lore r 没有 显 示 则 在 V ie w 菜 单 上 单 击 P ro ject E x p lo rer
- .在 P ro ject E x p lo rer 中 展 开 项 目 节 点
添 加 到 项 目 中 的 文 件 具 有 默 认 名 Fo rm 1 . J a v a
- 在
Fo rm D e s ig n e r 中 打 开 窗 体 在 P ro je c t E xp lore r 中 单 击 Fo rm 1 . J a v a
导 入 A c tiv e X 控 件
创 建 了 项 目 之 后 就 可 以 在 项 目 中 导 入 Ac t iv e X 控 件 使 用 Cu s to m iz e T oo lbox 对 话 框 从 系 统 中 安 装 的 Ac t iv e X 控 件 表 中 选 择 A c tiv e X 控 件
注 意 一 旦 对 某 个 工 具 箱 添 加 了 ActiveX 控 件 则 控 件 会 一 直 保 留在 工 具 箱 中 其 他 所 有 项 目 都 可 以 使 用 直 到 删 除 它 为 止
导 入 A c tiv e X 控 件
- 在 工 具 箱 中 单 击 Ge n e ra l 选 项 卡 如 果 工 具 箱 没 有 出 现 则 单 击 V ie w
菜 单 上 的 T oo lbox
-
右 击 工 具 箱 然 后 单 击 C u s tom iz e T o o lbox
-
在 C u s tom iz e T o o lbox 对 话 框 中 单 击 A c tiv e X C o n t ro ls 选 项 卡
-
在
Ac t iv e X 控 件 列 表 中 选 择 要 导 入 的 控 件 也 可 以 选 择 多 个 控 件对 本 方 案 选 择 A c t iv e M o v ie C on tro l O b je c t
-
单 击 O K
把 选 择 的 控 件 添 加 到 工 具 箱
为 窗 体 添 加 控 件
当 对 窗 体 添 加 Ac t iv e X 控 件 时 V isu a l J + + 在 项 目 目 录 中 创 建 一 个 或 多个 软 件 包 并 为 这 些 控 件 添 加 类 封 装 器 通 过 V isu a l J + + 使 用 类 封 装 器可 以 访 问 类 及 Ac t iv e X 控 件 的 成 员 如 果 要 导 入 的 A c t iv e X 控 件 包 含 在某 文 件 中 而 此 文 件 又 包 含 多 个 Ac t iv e X 控 件 则 V is u a l J + + 将 对 文 件中 的 所 有 控 件 提 供 类 封 装 器 但 只 把 指 定 的 控 件 添 加 到 工 具 箱
为 窗 体 添 加 控 件
- 在 Fo rm D e s ig n e r 中 显 示 使 用 的 窗 体 双 击 要 添 加 的 控 件
在 本 方 案 中 双 击 A c t ive X M o vie 控 件 此 控 件 添 加 到 窗 体 的 中 央
设 置 控 件 的 属 性
为 窗 体 添 加 了 Ac t iv e X 控 件 后 就 可 以 使 用 P ro p e rtie s 窗 口 来 设 置 属 性创 建 事 件 处 理 程 序
为 A c tiv e X M o v ie 控 件 设 置 属 性
-
在 Fo rm D e s ig n e r 中 选 择 A c tiv e X M o v ie 控 件
-
在 P rope r t ie s 窗 口 中 选 择 file n a m e 属 性
-
键
入 .a v i 文 件 的 路 径 和 文 件 名 以 在 控 件 中 显 示或
单 击 file n a m e 属 性 值 部 分 的 省 略 号 按 钮 显 示 对 话 框 浏 览 计 算 机 中的 文 件
建 立 项 目
对 窗 体 添 加 了 Ac t iv e X 控 件 并 设 置 了 其 属 性 之 后 就 可 以 建 立 并 运 行此 项 目 来 测 试 控 件 的 函 数 性
创 建 并 运 行 窗 体
- 在 Bu i ld 菜 单 上 单 击 Bu i ld
如 果 收 到 编 译 错 误 的 信 息 请 改 正 错 误 后 重 新 建 立 项 目
-
为 运 行 窗 体 在 D e bug 菜 单 上 单 击 S ta r t
-
显
示 窗 体 时 单 击 控 件 上 的 播 放 按 钮 这 就 显 示 了 file n a m e 属 性 中 指 定 的 影 片
第 17 章 建 立 和 导 入 C O M 对 象
组 件 对 象 模 型 CO M 是 面 向 对 象 的 体 系 结 构 用 于 创 建 可 从 应 用 程序 之 间 重 用 的 对 象 也 可 以 使 用 CO M 编 写 可 从 其 他 编 程 环 境 中 访 问 的对 象 诸 如 M ic rosoft V isu a l B a s ic 和 M ic rosoft V isu a l C + + 以 及 M ic rosoft O ffic e 这 样 的 应 用 程 序 CO M 对 连 接 对 象 提 供 标 准 协 议 即 使 它 们 是用 不 同 的 编 程 语 言 设 计 的 当 建 立 了 连 接 后 对 象 就 可 以 通 过 标 准 的 用户 界 面 进 行 通 信
V isu a l J + + 支 持 建 立 和 导 入 CO M 对 象 通 过 在 V isu a l J + + 中 建 立 CO M 对 象 就 能 够 提 供 可 重 用 的 组 件 以 便 由 许 多 应 用 程 序 以 及 用 不 同 的 语言 编 写 的 应 用 程 序 所 共 享 利 用 CO M 导 入 特 征 可 以 从 其 他 应 用 程 序中 使 用 对 象 以 便 在 W ind ow s F ounda t ion M ic ros oft O f f ic e W F C 应 用程 序 中 提 供 附 加 的 特 征 例 如 可 以 使 用 M ic rosoft O f f ic e 的 M ic rosoft W o rd 中 的 访 问 拼 写 检 查 特 征 或 M ic rosoft E x c e l 中 数 学 函 数 这 样 的 CO M 对 象 通 过 在 V isu a l J + + 项 目 中 使 用 CO M 在 应 用 程 序 的 开 发 中 可 以提 供 可 重 用 的 代 码 在 本 章 中 将 学 到
-
如 何 建 立 CO M 对 象
-
如 何 导 入 现 有 CO M 对 象 到 W F C 应 用 程 序 中
建 立 CO M 对 象
V isu a l J + + 通 过 提 供 易 用 的 界 面 把 要 使 用 的 项 目 选 择 类 作 为 CO M 类从 而 简 化 了 CO M 对 象 的 建 立 任 何 公 用 的 非 抽 象 的 类 都 可 用 来 建 立CO M 对 象 V isu a l J + + 使 用 类 的 公 共 成 员 作 为 对 CO M 对 象 的 接 口 当建 立 项 目 时 选 择 类 作 为 建 立 的 CO M 类 并 在 系 统 中 进 行 注 册 作 为 CO M 对 象 一 旦 建 立 了 CO M 对 象 就 可 以 在 CO M D L L 中 打 包 它 们 并 从其 他 编 程 环 境 或 支 持 CO M 的 程 序 中 访 问 它 们
在 本 方 案 中 要 建 立 CO M 对 象 在 CO M D L L 中 打 包 给 出 相 关 的 活动 统 计 函 数 性 在 此 将 学 到
-
创 建 具 有 作 为 CO M 对 象 给 出 的 类 的 项 目
-
在 P ro je c t P rope r tie s 对 话 框 中 使 用 CO M C la s se s 选 项 卡 来 选 择 在 项目 给 出 的 作 为 CO M 对 象 的 类
-
为 使 用 其 他 编 程 语 言 和 应 用 程 序 打 包 CO M 类 到 CO M D L L
-
建 立 项 目
创 建 项 目
V isu a l J + + 提 供 CO M D L L 模 板 创 建 带 有 已 注 册 为 CO M 类 的 项 目 这 种 模 板 在 CO M D L L 中 也 可 用 于 打 包 项 目 至 于 更 多 的 关 于 使 用 模 板创 建 CO M D L L 项 目 的 信 息 请 参 看 第 1 章 的 创 建 CO M D L L
尽 管 CO M D L L 模 板 可 用 但 本 方 案 并 不 使 用 它 因 为 对 于 理 解 如 何 在
多 个 项 目 中 选 择 类 作 为 CO M 类 是 非 常 重 要 的 在 本 方 案 中 要 创 建 空项 目 并 为 项 目 加 上 Ja va 类 作 为 CO M 对 象
注 意 启 动 下 列 过 程 之 前 关 闭 所 有 打 开 的 项 目 在 File 菜 单单 击 Close All
创 建 空 项 目
-
在 F ile 菜 单 上 单 击 N e w P ro je c t
-
在 N e w 选 项 卡 中 选 择 V isu a l J + + P ro je c ts 文 件 夹 然 后 单 击 Em p ty P ro ject 图 标
-
在
N a m e 框 中 键 入 项 目 名对 于 本 方 案 键 入 S ta ts
-
在 Loc a t ion 框 中 键 入 项 目 的 保 存 路 径 或 单 击 B ro w s e 来 定 位 目 录
-
单 击 O p e n
在 P ro ject E x p lo rer 中 显 示 项 目 但 不 包 含 文 件为 项 目 加 入 类
-
在 P ro ject E x p lo rer 中 右 击 项 目 名
-
在 快 捷 菜 单 中 指 向 Ad d 然 后 单 击 A dd C la ss
-
要 添 加 空 的 Ja va 类 选 择 C la ss 图 标
-
在
N a m e 框 中 键 入 Ja v a 类 名在 本 方 案 中 类 名 为 S ta ts .J a v a
-
单 击 O p e n
对 类 添 加 代 码
对 于 CO M D L L 客 户 要 操 纵 CO M 对 象 必 须 在 CO M 类 中 提 供 公 共方 法 V isu a l J + + 通 过 CO M 对 象 的 接 口 给 出 了 Ja v a 类 的 所 有 公 共 方 法包 括 那 些 从 超 类 继 承 的 方 法 在 本 方 案 中 为 类 添 加 代 码 有 两 种 方 法 这 些 方 法 对 CO M 对 象 的 用 户 提 供 了 与 获 得 相 关 的 统 计 函 数
S ta ts C O M 对 象 需 要 的 第 一 种 公 共 方 法 是 W in los s P e rc e n ta g e 方 法 这 种方 法 用 于 计 算 某 队 在 比 赛 中 赢 的 百 分 比
添 加 W in L o ss P erc en ta g e 方 法
- 对 S ta ts 类 添 加 以 下 方 法 定 义
p u b lic f lo a t w inL ossP er centag e( in t ga m esP la yed, in t gam e sW on)
{
f loat retu rnV a lu e = ga m esW on % ga m es P la y e d * .1 0 0 f ; if ( r e turnV a lu e = = 0 .0 f )
r e tu r n 1 .0 f ; e ls e
retu rn retu r n V a lu e ;
}
本 代 码 采 用 模 运 算 符 来 获 得 余 数 此 数 是 本 队 所 赢 比 赛 数 与 比 赛 总 数相 除 得 到 的 然 后 将 此 数 乘 上 . 100f 转 换 成 此 队 的 显 示 值 此 值 确 定后 代 码 检 查 它 是 否 为 0 如 是 则 说 明 没 有 余 数 此 队 赢 了 所 有 的
" 赛 返 回 1 否 则 代 码 返 回 实 际 数 值
S ta ts C O M 对 象 需 要 公 布 的 最 终 公 共 方 法 是 g o a ls A g a in s t A v erag e 方 法这 种 方 法 计 算 射 门 的 平 均 数 确 定 的 方 法 是 在 所 有 比 赛 中 用 射 门 次 数除 以 比 赛 次 数
添 加 go a ls A g a in s t A v e r age 方 法
- 对 S ta ts 类 添 加 下 列 方 法 定 义
p u b lic f lo a t G o alsA ga in st A v era g e( in t ga m esP la yed, in t g o a lsA l lo w ed )
{
r e tu r n ( f lo at) g o alsA llo w ed/ g a m es P la y ed;
}
本 代 码 用 射 门 次 数 除 以 比 赛 次 数 并 将 结 果 转 换 为 浮 点 数
定 义 类 作 为 CO M 类
当 创 建 了 类 并 定 义 了 通 过 CO M 公 布 的 公 共 方 法 之 后 就 定 义 了 类 作 为CO M 类 在 P ro je c t P rope r t ie s 对 话 框 中 使 用 CO M C la s se s 选 项 卡 来从 项 目 中 选 择 类 作 为 CO M 类
注 意 如 果 不 需 要 定 义 多 个 类 作 为 C O M 类 可 以 在 Class Properties 对 话 框 中 定 义 C O M 类 为 显 示 Class Properties 对 话 框 在 Class Outline 中 右 击 类 名 然 后 单 击 Class Properties 在 Class Properties 对 话 框 中 选 择 COM Class 复 选 框
定 义 类 作 为 CO M C la ss
-
在 P ro ject 菜 单 中 单 击 <P ro je c t > P ro p e rtie s <P ro je c t > 是 指 控 件 项目 的 名 字
-
单 击 CO M C la ss 选 项 卡
-
在 CO M C la ss e s 选 项 卡 中 选 择 A u to m a t ic a lly G e n e ra te T yp e L ib ra r y 选项
-
在
类 列 表 中 选 择 想 公 布 为 CO M 对 象 的 类对 这 种 方 案 选 择 sta ts 类
-
单 击 O K
V isu a l J + + 在 类 定 义 的 上 边 添 加 了 @ c o m . re g iste r 注 释 标 记 当 编 译 项目 时 编 译 器 使 用 注 释 标 记 中 的 信 息 在 注 册 表 中 注 册 作 为 CO M 类的 类
打 包 项 目 作 为 CO M D L L
为 了 使 其 他 应 用 程 序 可 以 使 用 CO M 对 象 可 在 CO M D L L 中 打 包 它
注 意 如 果 想 在 Internet 上 分 布 COM 对 象 可 以 在 C A B 文 件 中 打包 控 件 来 代 替 COM DLL
在 CO M D L L 中 打 包 CO M 对 象
-
在 P ro ject 菜 单 中 单 击 < P ro je c t > P ro p e rtie s <P ro je c t > 是 指 控 件 项目 的 名 字
-
单 击
O u tput F o rm a t 选 项 卡
-
选 择
E n ab le P a c k ag in g 复 选 框
-
在
P ack ag in g ty p e 下 拉 菜 单 中 选 择 CO M D L L
-
在 F ile N a m e 框 中 键 入 CO M D L L 名 字 默 认 名 是 使 用 项 目 名 创 建的
-
选 择
O u tpu ts of type 和 J a v a C la sse s & R e so u rc e s 选 项
-
单
击 O K
建 立 项 目
在 建 立 过 程 中 V isu a l J + + 在 CO M D L L 中 打 包 CO M 类 并 注 册 D L L 和 CO M 类 作 为 CO M 对 象 当 类 在 注 册 表 中 时 可 用 于 其 他 应 用 程 序关 于 在 V isu a l J + + 中 导 入 CO M 对 象 的 更 多 信 息 请 参 看 下 节 导 入 CO M 对 象
建 立 项 目
- 在
Bu i ld 菜 单 上 单 击 Bu i ld 如 果 收 到 一 些 编 译 错 误 信 息 更 正 错误 然 后 重 新 建 立 项 目
注 意 注 册 了 C O M 类 后 就 可 以 执 行 附 加 的 注 册 对 COM 类 可 以添 加 一 种 名 为 onCOMRegis ter 的 用 户 定 义 的 方 法 可 以 使 用 这 种 方法 执 行 诸 如 注 册 Visual J++ 加 载 项 到 Visual J++ 加 载 项 表 中 这 样的 任 务 在 C O M 类 在 C O M 注 册 过 程 中 和 使 用 Visual J++在 COM DLL 建立 注 册 的 过 程 中 Visual J ++可 调 用 此 方 法 onCOMRegis ter 方 法的 特 征 必 须 与 下 列 特 征 相 匹 配
P u b li c s ta t ic vo id on C O M R e g is ter( boo lean r eg is ter)
{
/ / A d d your custom registra t ion co d e h ere
}
导 入 CO M 对 象
CO M 对 象 提 供 多 种 方 法 来 封 装 功 能 并 在 多 个 应 用 程 序 中 可 重 用 它可 以 使 用 CO M 对 象 在 应 用 程 序 中 公 布 具 体 的 功 能 以 便 在 其 他 应 用 程序 中 使 用 或 者 创 建 一 组 要 在 多 个 应 用 程 序 中 使 用 的 例 程 因 为 CO M 不 是 针 对 具 体 的 语 言 所 以 CO M 对 象 可 以 集 成 到 在 各 种 编 程 语 言 中开 发 的 应 用 程 序 中 可 以 使 用 V isu a l J + + 来 查 看 和 导 入 在 系 统 中 注 册 的CO M 对 象 在 导 入 过 程 中 V isu a l J + + 创 建 类 封 装 器 以 使 CO M 对 象的 访 问 与 其 他 Ja va 对 象 一 样
在 本 方 案 中 可 以 导 入 在 本 章 前 面 的 建 立 CO M 对 象 一 节 中 建 立 的
CO M 对 象 在 此 将 学 到
-
如 何 为 Ja va W F C 项 目 导 入 CO M 对 象
-
CO M 对 象 的 访 问 方 法
-
建 立 并 运 行 项 目 来 测 试 CO M 对 象 的 功 能
注 意 本 节 假 设 已 在 本 章 前 面 的 建 立 C O M 对 象 中 创 建 了 C O M 对象 然 后 已 关 闭 了 所 有 打 开 的 项 目
创 建 项 目
当 导 入 CO M 对 象 时 V isu a l J + + 在 项 目 中 创 建 目 录 并 在 这 些 目 录 中加 上 类 封 装 器 以 访 问 CO M 对 象 为 导 入 CO M 对 象 必 须 有 有 效 的 Ja va 项 目
创 建 项 目
1. 在 |
F ile 菜 单 上 |
单 击 |
N e w P ro je c t |
||
---|---|---|---|---|---|
2. 在 |
N e w 选 项 |
卡 中 |
选 择 V isu a l J + + |
P ro je c ts |
文 件 夹 然 后 单 击 |
A p p lic a tio n s 然 后 选 择 W ind ow s A pp lic a t ions 图 标
-
在 N a m e 框 中 键 入 项 目 名
-
在 Loc a t ion 框 中 键 入 项 目 的 保 存 路 径 或 单 击 B ro w s e 来 定 位 文 件夹
-
单 击 O p e n
在 P ro ject E x p lo rer 中 显 示 项 目 的 封 装 视 图
- 在 P ro ject E x p lo rer 中 展 开 项 目 的 节 点
则 在 项 目 中 添 加 了 以 Fo rm 1 . J a v a 为 默 认 名 的 文 件
导 入 CO M 对 象
创 建 了 项 目 后 就 可 以 为 此 项 目 导 入 CO M 对 象 导 入 的 CO M 对 象 在每 个 项 目 中 必 须 是 可 访 问 的 当 为 项 目 导 入 了 CO M 对 象 后 V isu a l J + + 创 建 类 封 装 器 来 为 访 问 CO M 对 象 提 供 接 口 这 些 类 封 装 器 添 加 到 项 目目 录 下 的 软 件 包 中 这 取 决 于 CO M D L L 中 存 储 的 对 象 数 量 V is u a l J + + 可 以 创 建 多 个 软 件 包
注 意 为 了 从 另 一 个 项 目 中 访 问 特 定 的 C O M 对 象 可 以 通 过 在Classpath 中 放 置 COM 封 装 器 类 防 止 为 每 个 项 目 封 装 对 象
导 入 CO M 对 象
- 在 P ro ject 菜 单 上 单 击 A dd C O M W ra ppe r
出 现 C O M W ra ppe rs 对 话 框
- 在 包 含 CO M D L L s 的 表 中 键 入 计 算 机 上 注 册 的 库 选 择 想 导 入 的
CO M 对 象 的 名 字
在 本 方 案 中 选 择 S ta ts C O M 对 象
- 单 击 O K
V isu a l J + + 为 所 选 CO M D L L 中 包 含 的 每 个 CO M 对 象 添 加 软 件 包 目 录和 类 封 装 器
为 访 问 CO M 对 象 添 加 代 码
V isu a l J + + 创 建 了 类 封 装 器 后 就 可 以 为 CO M 对 象 的 访 问 方 法 编 写 代
码 在 本 方 案 中 可 以 对 项 目 窗 体 构 造 器 添 加 代 码 此 代 码 创 建 了 CO M 对 象 的 实 例 并 生 成 对 CO M 对 象 两 种 方 法 的 调 用 使 用 硬 编 码 的 值 调用 方 法 然 后 在 O u tput 窗 口 显 示 结 果
为 窗 体 构 造 器 添 加 代 码
- 在 P ro ject E x p lo rer 中 右 击 Fo rm 1 然 后 单 击 V ie w C ode
在 文 本 编 辑 器 中 显 示 Fo rm 1 的 源 代 码
- 在 Fo rm 1 构 造 器 内 部 调 用 in it F o rm 添 加 如 下 代 码 行
s ta t ist ics o b ject.S ta ts s ta ts = n e w s ta t is t ics o b je ct.S ta ts ();
S ys te m .o u t .p r in t ln (" O u r t ea m ha s a w inn in g p er ce n ta g e o f " + S tats .w inL ossP er centag e( 1 0 , 4 ) ) ;
S ystem .o ut.p r intln (" O u r g o a lte nd er has a G o als A g ainst A v era g e of " + S ta t s .g o a ls A g a in s t A vera ge( 1 2, 1 5 ) ) ;
这 些 代 码 创 建 了 S ta ts C O M 对 象 的 实 例 在 S ta ts 对 象 之 前 对s tatis t icso b jec t 的 引 用 是 创 建 S ta ts 类 封 装 器 的 软 件 包 的 名 称 定 义 了 S ta ts 实 例 后 代 码 使 用 硬 编 码 值 调 用 w in L o ss P erce n tag e 和g o a ls A g a in s t A v erag e 方 法 并 通 过 调 用 S y s te m . O u t .p r in tln 发 送 结 果 到O u tput 窗 口
建 立 和 运 行 项 目
当 合 并 了 调 用 CO M 对 象 的 方 法 之 后 就 可 以 建 立 并 运 行 此 项 目
建 立 和 运 行 项 目
-
在 Bu i ld 菜 单 上 单 击 Bu i ld 如 果 收 到 一 些 编 译 错 误 或 信 息 更 正 错误 后 重 新 建 立 项 目
-
要 运 行 窗 体 单 击 D e bug 菜 单 上 的 S ta r t
启 动 项 目 之 后 就 可 以 在 O u tput 窗 口 中 看 到 来 自 对 S ta ts C O M 对 象 调用 的 输 出 为 显 示 O u tput 窗 口 在 V ie w 菜 单 上 单 击 O the r W indow s 然 后 单 击 O u tput
第 18 章 W F C 中 的 数 据 绑 定
为 了 从 Ja va 项 目 中 访 问 数 据 通 常 可 以 使 用 A c tiv e X D a ta O b je c ts AD O 组 件 此 组 件 定 义 了 W F C 应 用 程 序 的 数 据 编 程 模 型 AD O
对 象 的 核 心 包 括 C onne c t ion, C o m m a nd 和 Re c o rd se t 对 象
利 用 C onne c t io n 对 象 可 连 接 到 数 据 库 一 旦 建 立 了 连 接 就 可 以 查 询数 据 库 检 索 记 录 集 R eco rd se t 对 象 表 示 查 询 返 回 的 记 录 可 以 使 用 SQ L 字 符 串 或 C o m m a n d 对 象 来 指 定 查 询
AD O 也 提 供 D a ta S ourc e 组 件 它 组 合 C onne c t io n C o m m a n d 和 Re c o rd se t
对 象 的 功 能 关 于 使 用 AD O 对 象 编 程 的 信 息 请 参 看 M ic rosoft A c t iv e X
D a ta Ob je c ts 在 线 文 档 中 的 AD O Tu to r ia V J + + 在 c o m .m s. w fc .d a ta
和 c o m .m s. w fc .d a ta .u i 软 件 包 中 定 义 AD O 类
注 意 Form Desig ner 中 的 Toolbox 只 提 供 DataSource 控 件 在代 码 中 只 可 使 用 Connection Command 和 Recordset 对 象
- 旦 通
过 R eco rd se t 对 象 或 D a ta S ourc e 组 件 检 索 了 记 录 集 就 可 以 对 W F C
组 件 绑 定 记 录 集 W F C 支 持 简 单 的 或 复 杂 的 数 据 绑 定 说 明 如 下
绑定 类 型 说明
简 单 的 指 记 录 集 中 的 字 段 与 W F C 组 件 属 性 之 间 的 关 系 称 之 为 简 单绑 定 是因 为 组 件不 需要 知 道 数据 协议 或数 据 提供者
复杂 的 指 记 录 集和 W F C 组件 之间 的 直 接关 系
注 意 记 录 集 的 光 标 和 锁 定 类 型 决 定 了 记 录 集 中 的 数 据 是 否 动 态 反 映 了数 据 库 中 的 数 据 以 及 记 录 集 中 的 数 据 是 否 可 以 改 变
关 于 AD O 的 更 多 信 息 请 参 看 M ic ro so f t A c tiv e X D a ta O b je c ts 在 线 文档 中 的 G e ttin g S ta r te d w i th A D O 2 .0
简 单 数 据 绑 定
简 单 数 据 绑 定 指 的 是 在 记 录 集 中 的 字 段 与 W F C 组 件 属 性 之 间 的 关 系绑 定 了 属 性 之 后 就 可 以 自 动 在 字 段 与 属 性 之 间 传 递 数 据
-
如 果 改 变 了 字 段 的 值 则 新 值 也 传 给 属 性
-
如 果 在 记 录 集 中 导 入 了 新 的 记 录 则 当 前 字 段 值 也 传 给 属 性
-
如 果 属 性 的 值 改 变 了 并 且 组 件 支 持 属 性 改 变 的 通 知 则 新 值 也 传 给记 录 集 中 的 字 段
注 意 如 果 想 尝 试 改 变 只 读 记 录 集 则 记 录 集 将 会 产 生 A D O 异 常可 以 捕 捉 这 个 异 常 然 后 把 绑 定 的 属 性 返 回 到 原 来 的 值 否 则属 性 的 值 和 字 段 的 值 将 是 不 一 致 的
可 绑 定 属 性
通 过 D a ta B inde r 组 件 可 执 行 W F C 中 的 简 单 数 据 绑 定 这 个 组 件 创 建 并
管 理 字 段 与 属 性 间 的 绑 定 D a ta B inde r 组 件 可 以 通 过 与 下 面 的 设 计 模 式相 匹 配 的 方 法 来 绑 定 可 访 问 的 属 性
pu b lic < Pro p e r ty T y p e > g e t< Pro p e r ty N a m e >()
pu b lic vo id s e t< Pro p e r ty N a m e >(< Pro p e r ty T y p e >)
注 意 如 果 属 性 也 可 以 用 BindableAt tribute.YES 在 组 件 的ClassInfo 中 标 记 则 在 Properties 窗 口 和 在 DataBinder 组 件 的设 计 页 中 将 列 举 出 此 属 性 依 旧 可 以 在 Properties 窗 口 或 设 计页 中 手 工 键 入 名 称 或 通 过 编 程 绑 定 属 性 来 绑 定 没 有 标 记 为 可 绑 定的 属 性
属 性 改 变 通 知
绑 定 属 性 的 组 件 可 以 提 供 < P rope r ty N am e > C ha ng e d 事 件 来 声 明 属 性 值 已经 改 变 了 当 触 发 了 此 事 件 时 D a ta B inde r 组 件 标 记 此 绑 定 为 无 效 然后 当 用 户 定 位 到 新 记 录 或 在 代 码 中 调 用 D a ta B in d e r . c o m m it C h a n g e s 方 法时 D a ta B inde r 组 件 决 定 哪 些 绑 定 是 无 效 的 并 在 记 录 集 上 更 新 这 些 绑定
注 意 如 果 组 件 没 有 提 供 < PropertyNa me >Changed 事 件 来 通 过DataBinder 组 件 绑 定 属 性 则 绑 定 是 只 读 的 且 将 禁 用 组 件 为在 这 种 限 制 下 工 作 可 以 设 法 在 代 码 中 通 过 直 接 对 记 录 集 进 行 读 写来 管 理 绑 定
D a ta B in d e r组 件
AD O 定 义 了 D a ta B inde r 组 件 来 执 行 简 单 的 数 据 绑 定 这 个 组 件 在 记 录集 中 的 字 段 和 W F C 组 件 的 绑 定 属 性 间 建 立 和 管 理 记 录 关 于 属 性 是 否可 以 绑 定 的 信 息 请 参 看 前 面 的 绑 定 属 性 一 节
尽 管 单 一 的 D a ta B inde r 组 件 可 以 管 理 多 重 绑 定 但 它 只 与 单 一 的 记 录集 关 联 为 在 第 二 个 记 录 集 中 绑 定 字 段 必 须 使 用 另 一 个 D a ta B inde r 组 件 另 外 D a ta B inde r 组 件 只 可 用 于 绑 定 相 同 窗 体 上 存 在 的 组 件
如 果 绑 定 属 性 的 组 件 支 持 属 性 的 改 变 通 知 则 当 属 性 值 改 变 时
D a ta B inde r 组 件 标 记 绑 定 无 效 当 用 户 定 位 到 新 记 录 或 在 代 码 中 调 用D a ta B in d e r . c o m m it C h a n g e s 方 法 时 就 改 变 了 记 录 集 更 多 的 信 息 请参 看 前 面 的 一 节 属 性 改 变 标 记 信 息
示 例
下 例 表 明 了 如 何 编 程 带 有 D a ta B inde r 组 件 的 简 单 数 据 绑 定 注 意
D a ta B inde r 组 件 使 用 D a ta B ind ing 对 象 的 数 组 来 管 理 绑 定
im p o r t co m . m s . w fc .d a ta .* ;
im p o r t co m . m s . w fc. d ata.u i.* ; im p o r t c o m . m s .w f c.u i.* ;
/* U se th e C o n n ectio n an d R eco rd se t co m p o n en ts to
co n n e c t to a d a ta b a s e a n d r etrie v e a r e co r d s et. */ C o n n e c t io n c= ne w C o nn e c t ion ( ) ;
c.s e t C o n n e ctio n S t r in g ( " dsn= m y D S N ; u id= m y U ID ; p w d= m y P W D ");
c. o p e n ();
R e c o rd se t rs = n e w R e c o rd s e t(); rs . se t A c t iv e C onne c t ion( c ) ;
rs .s etS o u r c e( " s e le c t * f ro m a u thors "); rs .o p en ( ) ;
/* C r ea t e a D a ta B in d er co m p o n en t . T o associate th is co m p o n e t w ith rs , s e t th e data S ource p rop ert y . */
D a ta B ind er db = n e w D a ta B in d er(); db .s et D a ta S ource( rs);
/* C re a te th e c o m pone n ts w hos e prope r t ie s w i l l be bound. * /
E d it e d it 1 = n e w E d it( ) ; E d it e d it 2 = n e w E d it( ) ;
/* S e t th e D a ta B inde r c o m p o e n t’ s b ind in g s prop e r ty to
a n arra y of D a ta B in d in g ob je c ts. T h is arra y d efin es th e b ind in gs b et w een th e tex t p rop ert y of ea ch E d it co m p o n ent a n d th e f ields in th e record s e t . */
db .s et B in d ings( n ew D a ta B ind in g[] {
n e w Da ta B in d in g ( ed it 1 , " tex t " , " firs t N a m e "),
n e w Da ta B in d in g ( ed it 2 , " tex t " , " la s t N a m e " ) } );
}
关 于 D a ta B inde r 组 件 da ta S ourc e 属 性 的 更 多 信 息 请 参 看 第 4 章
复 杂 数 据 绑 定
复 杂 数 据 绑 定 是 指 记 录 集 之 间 直 接 相 互 作 用 的 组 件 复 杂 数 据 绑 定 组 件提 供 da ta S ourc e 和 da ta M e m b e r 属 性 这 些 属 性 标 识 了 绑 定 的 记 录 集 注 意 复 杂 绑 定 组 件 的 属 性 可 以 借 助 于 D a ta B inde r 组 件 而 仍 然 为 简 单的 绑 定
da taS ou rc e 和 da ta M em be r属 性
da ta S ourc e 属 性 确 定 了 实 现 ID ataS o u rc e 接 口 的 对 象 此 对 象 公 布 了 一个 或 多 个 记 录 集 D a ta M e m b e r 属 性 随 后 指 定 组 件 目 前 绑 定 的 记 录 集 名称 例 如
/* B in d th e c o m p o n e n t to th e r e co r d s e t n a m ed " P ro d u c ts " , w h ic h is ex p o s e d b y th e d a ta s o u r c e , d s . */
dhC o m p o n e n t .s e t D a ta S o ur ce(ds);
d b co m p onen t .s e t D a ta M e m b er(" P rod ucts " ) ;
如 果 不 能 设 置 da ta M e m b e r 属 性 则 绑 定 数 据 源 的 默 认 记 录 集 可 以 通过 设 置 da ta M e m b e r 属 性 为 空 来 明 确 指 定 默 认 记 录 集
/* b in d th e co m p o n en t to th e d efa u lt r e co r d s e t
ex p o sed b y th e data source, ds. */ db C o m p on en t .set D ataS o u r c e( ds);
d b C o m p o n e n t.s etD a ta M e m b er( n u l l); /* T h is lin e is o p tio n a l . */
注 意 R eco rd se t 和 D a ta S ourc e 组 件 已 经 实 现 了 ID ataS o u rce 接 口 所 以可 以 直 接 设 置 D a ta S ourc e 属 性 为 组 件 中 的 一 员 本 例 中 不 必 设 置D a ta M e m b e r 属 性
/* s et th e d a ta S o u r c e p ro p ert y d ir e c t ly to th e R e co r d s e t
co m p o n ent,rs, w ith out settin g th e data M e m b er p rop ert y . */ db C o m p on en t .set D ataS o u r c e( rs ) ;
在 V is ual J + + 中 的 复 杂 绑 定 组 件
V isu a l J + + 提 供 下 列 复 杂 数 据 绑 定 组 件
组件 说明
D a ta B in d e r 绑 定 记录 集 字 段到 W F C 组件 的属 性 尽管 使 用 Da ta B in d e r 组 件 可 用 来 执 行 简 单 的 绑 定 但 组 件 本 身 公 布 了D a ta S o u rc e 和 D a ta M e m b e r 属性
D a ta G rid 绑 定 记录 集 的 多个 字段 并 以 网格 格式 显 示 此 数 据
D a ta N a v ig a to r 允 许 用 户 改 变 记 录 集 中 的 当 前 记 录 绑 定 相 同 记 录 集 合的 其 他组 件 可 随后 更新 以 反 应新 的当 前 行
关 于 在 Fo rm D e s ig n e r 中 使 用 这 些 组 件 的 信 息 请 参 看 第 4 章
第 19 章 使 用 J /D ire ct 编 写 W ind ow s 应 用 程 序
J /D i rect 是 M ic rosoft V is u a l J+ + 提 供 的 一 项 新 特 征 可 以 很 容 易 地 对M ic rosoft W indow s 的 动 态 链 接 库 D L L s 进 行 访 问 使 用 J /D i rect 可以 直 接 调 用 标 准 的 W in 3 2 系 统 D L L s 诸 如 KE R N E L 3 2 和 U S E R 3 2 和第 三 方 D L L s 使 用 J /D i rect 要 比 使 用 旧 的 R a w N a t iv e In te r fa ce 和 Ja v a N a tiv e In te r fa c e 分 别 为 RN I 和 JN I 要 简 单 得 多 这 二 者 都 要 求 编 写专 门 的 封 装 器 D L L 然 后 自 己 执 行 所 有 数 据 类 型 转 换 使 用 J /D i rect 通 过 简 单 声 明 并 调 用 函 数 就 可 以 调 用 大 多 数 以 前 存 在 的 D L L 函 数
J /D i rect 使 用 @ d l l .im port 伪 指 令 此 伪 指 令 与 V isu a l B a sic 的 DE C L AR E
功 能 很 相 似
为 使 用 J /D i rect 需 要 安 装 M ic rosoft V isu a l J+ + 和 M ic rosoft In te rn e t E xp lore r 4 .0 版 或 更 高 版 本 为 了 快 速 建 立 利 用 J /D i re c t 的 本 机 能 力 的 应用 程 序 需 使 用 J /D i rect C a l l b u ild er 它 是 V isu a l J + + 开 发 环 境 的 一 部 分本 章 解 释 如 何 使 用 @ d l l . im port 伪 指 令 来 调 用 来 自 Ja v a 的 D L L 函 数 也提 供 了 如 何 传 送 和 接 收 任 一 数 据 类 型 的 有 关 细 节 并 说 明 了 如 何 使 用@ d l l . im port 伪 指 令 来 传 送 和 接 收 来 自 D L L 方 法 的 结 构
消 息 框 示 例
本 节 提 供 使 用 @ d l l . im port 伪 指 令 的 消 息 框 应 用 程 序
使 用 J /D i rect 可 以 直 接 从 Ja va 代 码 调 用 W in3 2 D L Ls 下 面 是 显 示 消 息框 的 Ja va 应 用 程 序
C lass S h o w M s gB ox {
P u b l ic s ta tic v o id m a in ( S t r in g a rg s [ ] )
{
M es s a g eB o x (0 , " It w o rk e d !" ,
" T his m essag eb o x b roug ht to you usin g J/ D r ie c t" , 0 ) ;
}
/ * * @ d ll. im p o r t (" U S E R 3 2 " ) */
p r iv ate s tatic n a t iv e in t M ess a g e B ox ( int h w ndO w n er, S t r in g t ex t ,
S t r in g t it le , in t f u S t r y le);
}
@ d l l . im port 伪 指 令 告 诉 编 译 器 M e ss a g e B o x 方 法 将 使 用 J /D i rect 协 议
链 接 到 W in3 2 |
U S E R 32 .D L L |
而 不 使 用 以 前 版 本 支 持 的 R a w |
N a t iv e |
---|---|---|---|
In te r fa c e RN I |
协 议 另 外 |
Ja va 的 M ic rosoft V i r tua l M a c h in e |
VM |
提 供 自 动 类 型 度 从 S tr in g 对 象 到 C 中 使 用 的 以 空 字 符 结 尾 的 字 符 串 没 有 必 要 指 出 是 否 调 用 AN S I M e s s a g e B o x M e s sa g e B o x A 函 数 或U n ic ode M e ss a g e B ox 函 数 M e ss a g e B o x W 在 上 面 的 例 子 中 总 是调 用 AN S I 版 本 在 本 章 后 面 的 V M 如 何 在 AN S I 和 U n ic ode 之 间 进
行 选 择 一 节 解 释 了 如 何 使 用 au to 修 饰 符 来 调 用 函 数 的 最 优 版 本此 函 数 依 赖 于 支 持 应 用 程 序 的 M ic rosoft W indow s 版 本
J /D ire c t C a ll B u i ld e r
使 用 J /D i rect C a l l B u i ld e r 可 以 快 速 对 W in3 2 A P I 创 建 J /D i rect 调 用
J /D i re c t C a ll B u ild e r 对 W in3 2 A P I 元 素 自 动 插 入 Ja va 定 义 到 代 码 中 以及 适 当 的 @ d l l . im port 标 记
使 用 J / D ire ct C a l l B u i ld er 访 问 W in 32 A P I
-
打 开 J /D i re c t C a ll B u ild e r 在 V ie w 菜 单 上 指 向 O the r W indow s 然 后单 击 J /D i re c t C a ll B u ild e r
-
默 认 情 况 下 J /D i re c t C a ll B u ild e r 显 示 下 面 W in3 2 D L L 中 定 义 的 元 素 a d v a p i 32 .d ll g d i 32 .d ll ke rn e l 32 .d ll sh e l l 3 2 .d ll spoo ls s .d l l use r 32 .d ll 和 w in m m .d l l 这 些 D LLs 都 是 通 过 在 S ourc e 下 选 择 W IN 32 .T X T 文件 来 指 定 的
-
Ta rg e t 框 标 识 了 包 含 J /D i rect 调 用 的 类 默 认 类 名 为 W in 3 2 它 将 添
加 到 项 目 中 并 包 含 这 些 调 用 如 果 解 决 方 案 中 包 含 了 多 个 Ja va 项目 W in 3 2 类 将 添 加 到 第 一 个 项 目 中
要 指 定 不 同 的 目 标 类 单 击 省 略 号 按 钮
- 在
Se le c t C la ss 对 话 框 中 在 P ro ject V iew 或 C la ss V ie w 中 选 择想 要 查 看 的 类 项 目 视 图 显 示 了 解 决 方 案 中 .J a v a 文 件 的 分 层 列 类这 里 每 个 文 件 节 点 都 列 出 了 此 文 件 中 包 含 的 名 称 类 视 图 显 示 了
类 名 的 分 层 列 表
- 一
旦 选 择 了 视 图 就 可 以 选 择 包 含 J /D i re c t 调 用 的 类 名 为 了 对
W ind ow s C l ipboa rd 而 不 是 对 类 进 行 复 制 调 用 选 择 C l ipboa rd
- 单
击 O K
- 为 了 过 滤 W in 3 2 方 法 结 构 和 常 量 的 显 示 选 择 或 清 除 M e thods S tru c ts
和 C ons ta n ts 选 项
- 现 在 选 择 要 插 入 的 方 法 结 构 和 常 量 可 以 使 用 SH IF T 和 CT R L
键 选 择 多 个 项 注 意 W in 3 2 结 构 将 被 作 为 嵌 套 类 添 加 到 类 中
注 意 为 通 过 首 字 符 搜 索 项 在 Find 框 中 键 入 字 符 这 将 自 动 选择 匹 配 这 些 字 符 的 第 一 项
- 在 类 中 插 入 关 联 的 Ja va 定 义 单 击 Co p y T o T a rg e t 也 可 以 双 击 方法 结 构 或 常 量 把 它 插 入 到 类 中
当 在 J /D i re c t C a ll B u ild e r 中 选 择 了 W in3 2 A P I 元 素 时 下 面 的 预 览 窗 格显 示 关 联 的 Ja va 定 义 可 以 把 文 本 拷 贝 或 剪 切 到 任 何 文 件 中 为 了 W in 3 2 AP I 元 素 快 速 查 找 在 线 参 考 信 息 右 击 项 然 后 在 快 捷 菜 单 上 单 击 D isp la y AP I H e lp
关 于 编 译 器 默 认 设 置 的 信 息 请 参 看 下 一 节 设 置 J /D i re c t C a ll B u i ld e r
选 项
设 置 J /D ire c t C a ll B u ilde r选 项
V isu a l J + + 允 许 用 户 设 置 两 个 选 项 来 定 制 J /D i re c t Ca l l Bu i ld e r 的 功 能设 置 J / D ire ct C a l l B u i ld er 选 项
-
在 T oo ls 菜 单 上 单 击 J /D i re c t Ca l l Bu i ld e r 选 项
-
在 J /D i re c t C a l l B u i lde r O p t ions 对 话 框 中 选 择 或 清 除 以 下 设 置
选项 说明
S h o w T a rge t w in d o w wh e n cop y to ta rg et
D isa b le s ta c k c ra w l se curity che c k
- 单 击 O K 保 存 设 置
默认 状态 为选 择 当在 类 中 插 入 J/ D ire c t 调 用时 编译 器会 自动 在 Te x t 编 辑 器 中 打 开 Ja v a 文件 如 果 它没 有打 开 的 话
默认 状 态 为 清 除 VM 将对 每个 J / D i re ct C h ec k 调 用 启动 堆栈 安全 检查 如 果 栈 上 的 任 何 调 用程 序 不是 完全 信任 的话 则 发 出 安 全 异 常 然后就 不 再 调 用 J/ D ire c t 调用 这主 要影 响 W e b 页上 的 Ja v a 代码
当 选 择这 个选 项来 关闭 安全 检 查 时 @ se c u r i ty c h e c k D L L C a lls = o ff 标 记 自动 添加 到 下 次 插
入 J/ D i re c t 调用 的类 中 如 果 清除 了这 个 选 项则任 何 现 有 @ s e c u rity 标 记 依然 在 文 件中 但将不 会 添加 新 的 实例
快 速 语 法 参 考
下 面 介 绍 @ d l l . im port @ d ll . s t ru c t 和 @ d ll . s t ru c tm a p 伪 指 令 的 快 速 参 考对 每 个 伪 指 令 都 给 出 并 解 释 所 需 的 句 法
@ d ll.im po rt的 语 法
@ d l l . im port 伪 指 令 应 位 于 方 法 声 明 的 上 边 伪 指 令 句 法 如 下
/* * @ d ll.im p o rt(" L ib N am e ",< M odifie r >)*/
… m etho d d e c laratio n … ;
L ibna m e 是 D L L 的 名 称 它 包 含 了 要 调 用 的 函 数 M od if ie r 是 可 选 项 其 值 可 根 据 需 要 确 定 在 方 法 声 明 中 可 以 使 用 D L L 使 用 的 函 数 名或 通 过 使 用 别 名 来 给 出 方 法 的 不 同 名 称 关 于 别 名 的 信 息 请 参 看 本 章
后 面 的 别 名 方 法 重 命 名 一 节 为 参 数 和 方 法 返 回 值 选 择 的 Ja va 类 型 应 该 是 映 射 到 D L L 函 数 的 参 数 和 返 回 值 的 类 型 关 于 Ja va 数 据 类型 如 何 映 射 到 本 机 类 型 的 更 多 信 息 请 参 看 本 章 后 面 的 如 何 安 排 数 据类 型 一 节
下 表 给 出 了 本 节 说 明 的 几 种 形 式 的 @ d l l . im port 句 法
情形 |
句法 |
解释 |
---|---|---|
调用 W in 3 2 D LLs 调用 O LE A P Is |
/* * @ d ll.im p o rt(" L ib n a m e ")* / /* * @ d ll.im po r t( " L ib n a m e ", o le )*/ |
别名 使 用 /* * @ d ll.im p o rt(" L ib n a m e ",
e n t ry p o in t= " D L L F unc tionN a m e ")
*/
按 O rd in a l 链接 /* * @ d ll.im p o rt(" L ib n a m e ",
e n t ry p o in t= "#o rd in a l")* /
@ d ll.s tru c t的 句 法
在 方 法 声 明 中 使 用 选择的 Ja v a 名称
o rd in a l 是 16 位整 数 以
10 进 制 的 方 式 给 出 指出正 在 导 入 的 DL L 函数
@ d l l . s t ru c t 伪 指 令 应 位 于 类 声 明 的 上 边 @ d l l . s t ru c t 的 句 法 是
/* * @ d ll.s tru ct(< L in k Ty p e M o d ifier > ,> p a ck = n >) */
… c la ss d eclaratio n … ;
L inkT y p e M od if ie r 告 诉 编 译 器 在 本 机 格 式 中 字 符 串 和 字 符 类 型 的 字段 是 否 表 示 AN S I 或 U n ic ode 字 符 L inkT yp e M od if ie r 可 以 是 an s i
un ic ode 或 au to 如 果 没 有 指 定 L inkT yp e M od if ie r 将 使 用 默 认 的 AN S I
参 看 本 章 后 面 的 VM 如 何 在 AN S I 和 U n ic ode 之 间 选 择 一 节 可 以
帮 助 了 解 关 于 可 用 L inkT y p e M od if ie r |
值 的 更 多 信 息 |
||||
---|---|---|---|---|---|
也 可 以 指 定 p ack = n 来 告 诉 编 译 器 |
设 置 结 构 的 紧 缩 尺 寸 为 |
1 |
2 |
4 |
或 |
8 这 主 要 依 赖 于 指 定 的 n 值 如 果 省 略 了 p ack = n 则 紧 缩 尺 寸 默 认 为
8 关 于 设 置 紧 缩 尺 寸 的 更 多 信 息 请 参 看 本 章 后 面 的 结 构 紧 缩 一节
在 类 声 明 中 需 要 提 供 字 段 此 字 段 的 Ja va 类 型 以 它 们 在 本 机 结 构 中
出 现 的 次 序 映 射 为 本 机 结 构 中 字 段 的 类 型 关 于 选 择 字 段 数 据 类 型 的 信息 请 参 看 本 章 后 面 的 结 构 中 类 型 之 间 的 一 致 性 一 节
下 表 给 出 了 可 能 使 用 的 @ d l l . s t ru c t 伪 指 令 的 几 种 形 式 的 句 法
情形 |
需要 的 句 法 |
解 释 |
---|---|---|
声明 结 构 |
/* *@ d ll.s tru c t( )*/ |
在 不 指 定 L in k T y pe M o d ifie r |
时 假定 cha r 或 S tr ing 字段 |
设 置 结构 的 紧 缩尺 寸 /* *@ d ll.s tru c t( p a c k=
n )*/
表示 AN S I 字符
n 可以 是 1 2 4 或 8
声 明 具 有 字 段 或 类 型 字 符的结 构
使 用 字 段 或 类 型 字 符 串 声明 一 个 结 构 并 设 置 紧 缩尺寸
d ll.s tru c tm a p 的 语 法
/* * @ d ll.s tru c t( a n s i)*
/
/* *@ d ll.s tru c t( u nic o de . p a c k = n )* /
字符 字 段 表 示 一 个 AN S I 字符
S tr ing 字段 将以 U n ic ode 的格 式 而 且 紧 缩 尺 寸 根 据n 值 设 置 为 1 2 4 或 8
@ d ll. s t ru c tm a p 伪 指 令 用 于 声 明 在 结 构 中 嵌 入 的 定 长 字 符 串 和 数 组 它位 于 使 用 @ d l l . s t ru c t 声 明 的 结 构 中 定 长 字 符 串 或 数 组 字 段 声 明 的 上 边关 于 如 何 使 用 @ d ll. s t ru c tm a p 的 更 多 信 息 请 参 看 本 章 后 面 的 两 节 在结 构 中 嵌 入 定 长 字 符 串 和 在 结 构 中 嵌 入 定 长 标 量 数 组
下 表 给 出 了 @ d ll. s t ru c tm a p 伪 指 令 的 句 法
情形 需要 的 句 法 解 释
包 含 定长 字 符 串的 结构 //* * @ d ll.s tru c tm a p ( [ ty p e = T C
H A R [ S iz e ]])* /
包 含 定长 数 组 的结 构 //* * @ d ll.s tru c tm a p ( [ ty p e = F I
X E -D A R R A Y , s iz e = n ])* /
siz e 是 十 进 制 整 数 它指 出 字 符 串 中 的 字 符数 包括 空 字 符终 止 的空格
n 是实 进制 整数 它 表示数 组 的 大 小
数 据 类 型 转 换
M ic rosoft V M 计 算 Ja va 参 数 然 后 把 它 们 转 换 成 本 机 C+ + 类 型 M ic rosoft VM 根 据 编 译 时 声 明 的 Ja va 参 数 类 型 推 断 每 个 参 数 和 返 回 值 的 本 机类 型 例 如 已 声 明 为 Ja va 整 数 的 参 数 是 作 为 32 位 整 数 传 送 的 已声 明 为 Ja va 字 符 S tr in g 对 象 的 参 数 是 作 为 空 字 符 结 尾 的 字 符 串 传 送的 等 等 这 没 有 不 可 见 的 属 性 来 提 供 本 机 类 型 的 信 息 在 Ja va 中
所 见 即 所 得
快 速 参 考
下 面 两 个 表 列 出 了 每 个 Ja va 类 型 对 应 的 本 机 类 型 第 一 张 表 描 述 了 参数 与 返 回 值 的 映 射 第 二 张 表 展 示 了 @ d ll. s t ru c t 伪 指 令 使 用 的 映 射
参 数 与 返 回 值 映 射
Ja v a |
本机 |
说明 /限制 |
|
---|---|---|---|
byte sh o r t |
BY T E 或 CH A R SH O R T 或 W O R D |
||
in t |
INT , U INT , |
L ONG, |
|
UL ONG, D W OR D |
|||
cha r |
T C H A R |
||
long |
_ _ in t64 |
||
flo a t |
flo a t |
||
do u b le |
do u b le |
||
Bo o le a n |
B O O L |
||
S tr ing |
L P C T ST R |
除了 o le 模式 外 不允 许作 |
为返 回值 |
在 |
o le 模式 中 |
---|---|---|
S tr ing 映 |
射 为 |
LP W S T R |
M ic roso ft |
V M |
通 过 使 用 |
Cp T a s k M e m F re e 来释 放字 符 |
||
串 |
||
byte [] sh o r t [] cha r [] in t[] long [] do u b le [] |
B Y T E * W O R D * T C H A R * D W O R D * floa t* do u b le * |
long [] _ _ in t64 *
B o o le a n [] B O O L []
Ob je c t 结构 指 针 在 o le 模 式 中 是传递 一个
IU n kno w n *
In te r fa c e CO M 接口 使 用 ja c t iv e x 或 类 似 的 工 具生成 接 口 文 件
co m .m s .c o m .S afeA r ra y
SA FE A R R A Y * 不 允 许作 为 返 回值
c o m .m s .c o m ._ G u id GU ID, IID, C L S ID
c o m .m s .c o m .V a r ia n t
VA R IA N T *
@ d ll.s tru c t 类 结 构 的 指 针
@ c o m .s tru c t 类 结 构 的 指 针
vo id V O ID |
只作 为 返 回 值 |
||
---|---|---|---|
co m .m s .d ll.C a llb ac 函数 指 针 |
只作 为 参 数 |
||
k |
|||
使 用 @ d l l . s tr u c t 映 射 |
|||
Ja v a |
本机 |
||
byte |
BY T E |
或 |
CH A R |
cha r |
T C H A R |
||
sh o r t |
SH O R T 或 W O R D |
||
in t |
IN T U IN T L ONG |
UL ONG 或 |
DW O R D |
floa t _ _ in t6 4
long floa t
do u b le do u b le
Bo o le a n B O O L []
Ja va N a tiv e
S tr ing 字符 串 的 指 针 或 嵌 入的 定长 字 符 串
使用 @ d ll.s tru c t 标记 的类 嵌入 的 结 构
cha r [] 嵌入 的 TCH A R 的数 组
byte [] 嵌入 的 BY T E 的数 组
sh o r t [] 嵌入 的 SH O R T 的数 组
in t[] 嵌入 的 LO N G 的数 组
long [] 嵌入 的 _ _ in t6 4 的数 组
flo a t [] 嵌入 的 flo a t 的数 组
do u b le [] 嵌入 的 d o ub le 的数 组
基 本 标 量 类 型
下 表 给 出 了 映 射 的 基 本 标 量 类 型
Ja v a 类型 DL L
in t 有符 号 32 位整 数
byte 有符 号 8 位整 数
sh o r t 有符 号 16 位整 数
long 有符 号 64 位整 数
flo a t 32 位浮 点数
do u b le 64 位双 精度
注 意 Ja va 中 没 有 无 符 号 整 型 的 直 接 表 示 由 于 Ja va 没 有 无 符 号 类型 则 可 使 用 与 整 数 类 型 相 同 长 度 的 Ja va 类 型 例 如 对 于 常 见 的 DW ORD 类 型 无 符 号 32 位 可 以 使 用 Ja va in t 类 型 如 果 在 表 示 数 据 中 没 有什 么 丢 失 的 话
字 符 型
如 果 un ic od le 或 ole @ d l l . s t ru c t 修 饰 符 是 无 效 的 则 Ja v a 字 符 类 型 是CH A R 8 位 AN S I 字 符 在 另 一 种 情 况 中 它 是 W C H A R 16 位 U n ic ode 字 符
布 尔 值
J a v a B oo le a n 类 型 映 射 于 W in3 2 B O O L 类 型 是 32 位 类 型 作 为 参 数
Ja va 真 为 1 假 为 0 作 为 返 回 值 则 非 0 为 真
注 意 BO O L 和 V A R IA N T _ B O O L M ic rosoft V is u a l B a s ic 中 的 内 部B oo le a n 类 型 是 不 能 互 换 的 为 了 把 V A R IA N T _ B O O L 传 送 到 V is u a l Ba s ic D L L 必 须 使 用 J a v a short 类 型 使 用 -1 代 表 V A R IA N T_ TR U E
0 代 表 V A R IA N T _ F A L S E
字 符 串
本 节 解 释 在 AN S I 和 U n ic ode 格 式 中 如 何 把 字 符 串 传 送 到 D L L 函 数本 节 还 讨 论 从 D L L 函 数 返 回 字 符 串 的 两 种 方 法
把 字 符 串 传 送 到 D L L 函 数
为 了 把 标 准 的 空 字 符 结 尾 的 字 符 串 传 送 到 D L L 函 数 只 传 送 Ja va S tr in g
例 如 为 了 改 变 当 前 目 录 可 以 如 下 访 问 Ke rn e l 3 2 函 数 C o p y F ile
c lass sho w C o p y F il e
{
p u b lic s ta t ic v o id m a in (S tr in g a rg s [ ] )
{
C o p y File(" o ld .tx t" , " n e w .txt", t ru e);
}
/ * * @ d ll. im p o r t (" K ER N EL3 2 " ) */
p riv a te n a tiv e s ta t ic b o o lea n C o p y F ile( S t r in g ex is tin g f ile, S t r in g n e w F ile, b o o lea n f ) ;
}
在 Ja va 中 字 符 串 是 只 读 的 所 以 M ic rosoft V M 将 只 把 S tr in g 对 象 作为 输 入 为 了 允 许 虚 拟 机 实 现 来 转 换 字 符 串 而 不 用 拷 贝 字 符 S tr in g 对 象 参 数 不 能 传 递 到 可 修 改 字 符 串 的 DL L 函 数 如 果 D L L 函 数 可 以 修改 字 符 串 就 可 传 递 S trin g B u ffe r 对 象
如 果 不 使 用 U n ic ode 或 o le 修 饰 符 在 这 种 情 况 下 字 符 串 以 打 算 以
U n ic ode 格 式 传 递 则 字 符 串 将 转 换 为 AN S I
除 非 在 o le 模 式 中 否 则 字 符 串 不 能 作 为 D L L 函 数 的 返 回 类 型 声 明在 o le 模 式 中 本 机 返 回 类 型 是 使 用 C o T a sk M e m A llo c 函 数 指 定 的LP W S T R
从 D L L 函 数 接 收 字 符 串
从 函 数 中 传 回 字 符 串 有 两 种 方 法 一 种 是 调 用 程 序 分 配 函 数 填 充 的 缓 冲区 另 一 种 是 函 数 分 配 字 符 串 然 后 把 它 返 回 给 调 用 程 序 大 多 数 W in 3 2函 数 使 用 第 一 种 方 法 但 O L E 函 数 使 用 第 二 种 方 法 参 看 本 章 后 面 的调 用 O L E A P I 函 数 可 以 了 解 J/ D i re ct 为 调 用 O L E 函 数 提 供 的 特
殊 支 持 使 用 第 一 种 方 法 的 函 数 是 Ke rn e l 3 2 函 数 G e t T e m pP a th ,它 具有 如 下 原 型
DW O R D G e t T e m p P a th ( D W O R D s iz e o fb u f f er, L P TS TR b u f fer);
此
函 数 只 返 回 系 统 暂 时 文 件 目 录 的 路 径 诸 如 c :\tm p \
Bu f fe r 参数 指 向 一 个 调 用 程 序 分 配 的 缓 冲 区 在 这 个 缓 冲
区 中 将 接 收 路 径
s iz e o fb u ffe r 指 出 了 写 入 缓 冲 区 的 字 符 数 这 不 同 于 U n ic ode 版 本 中 的 字节 数 在 Ja va 中 字 符 串 是 只 读 的 所 以 不 能 把 字 符 S tr in g 对 象 作为 缓 冲 区 来 传 递 相 反 可 以 使 用 Ja va 的 S tr in g B u f fe r 类 来 创 建 可 写 的S trin g B u ffe r 对 象 下 面 是 调 用 Ge t T e m p P a th 函 数 的 例 子
c lass S h o w G e t T em p P ath
{
s ta tic f in a l in t M A X _ P A T H = 2 6 0 ;
p u b lic s ta t ic v o id m a in (S tr in g a rg s [ ] )
{
S trin g B u ffer te m p p a th = n e w S trin g B u ff er( M A X _ P A T H ) ; G e t T em p P ath( te m p p a th . cap acit y(), t e m p p a th ) ;
S ys t e m .o u t .p rin tln (" T e m p p a th = " + t e m p p a th );
}
/ * * @ d ll. im p o r t (" K ER N EL3 2 " ) */
p riv a te s ta t ic n a tiv e in t G etT e m p P a th ( in t s iz eo fb u f f er, S trin g B u ff er b u ff er);
}
要 理 解 本 例 区 别 S trin g B u ffe r 的 长 度 和 容 量 是 很 重 要 的 长 度 是 指 在S trin g B u ffe r 中 当 前 存 储 字 符 串 的 逻 辑 字 符 个 数 容 量 是 指 S t r ingB uffe r 当 前 分 配 的 实 际 存 储 量 执 行 下 列 语 句 之 后
S trin g b u f f er s b = n e w S trin g B u f f er( 2 5 9 );
Sb . le n g th 的 值 是 0 sb . c a p acity 的 值 是 259 当 调 用 一 种 D L L 方 法 传 递S trin g B u ffe r 时 M ic rosoft V M 检 查 S t r ingB uffe r 的 容 量 并 为 空 终 止 符将 这 个 容 量 加 1 如 果 U n ic ode 是 默 认 字 符 长 度 则 将 容 量 乘 以 2 然后 为 传 递 到 D L L 函 数 的 缓 冲 区 分 配 多 个 字 节 的 内 存 换 言 之 可 以 使用 容 量 而 不 是 长 度 来 设 置 缓 冲 区 的 尺 寸 注 意 只 要 不 犯 以 下 错 误
S t r in g B u f fer s b = ne w String B u f f er(); / / W ro ng!
G e t T em p P ath( M A X _ P A T H , sb ) ;
不 带 参 数 调 用 S trin g B u ffe r 构 造 器 创 建 容 量 为 16 的 S t r ingB uffe r 对 象此 容 量 可 能 太 小 了 对 Ge t T e m p P a th 方 法 传 递 M A X _ P A T H 指 出 在缓 冲 区 中 是 有 足 够 的 空 间 来 容 纳 260 个 字 符 这 样 Ge t T e m p P a th 缓 冲区 可 能 会 溢 出 如 果 想 大 量 使 用 Ge t T e m p P a th 应 该 以 如 下 方 法 在 Ja v a 友 好 的 封 装 器 中 封 装 它
p u b lic s tatic S t r ing G e t T em p P ath()
{
S t r ing B u f f er t e m p pa th = n e w S t r ing B u f f er( M A X _ P A T H - 1 ) ; in t res = G etT e m p P a th ) M A X _ P A T H , t e m p p a th );
if ( r es = = 0 || r es > M A X _ P A T H ) {
th ro w ne w R u n t im e E xc ep t ion (" G e t T e m pP a th erro r !" ) ;
}
r etu r n t e m p p a th .to S rrin g (); // ca n ’ t r e tu rn a S t r in g B u ff er
}
这 种 方 法 既 方 便 又 安 全 并 且 它 映 射 了 Ja va 异 常 下 函 数 的 错 误 返 回 值注 意 不 能 返 回 S trin g B u ffe r 对 象
数 组
J /D i rect 自 动 处 理 标 量 的 数 组 下 面 的 Ja va 数 组 类 型 直 接 转 换 到 本 机 指针 类 型
Ja v a |
本 机 |
每 个 元素 的字 节数 |
||||
---|---|---|---|---|---|---|
B yte [] |
BY T E * |
1 | ||||
Sh o r t [] |
S H O R T * |
2 | ||||
in t[] |
D W O R D * |
4 | ||||
flo a t [] |
F L O A T * |
4 | ||||
d o u b le [] |
DOUBL E * |
8 | ||||
long [] |
_ _ IN T 64 * |
8 | ||||
B o o le a n [] |
B O O L * |
4 | ||||
如 果 U n ic ode 效 则 转 换 为 |
修 饰 符 无 效 W C H A R * |
则 |
ch ar[ |
] 数 组 类 型 转 换 为 |
CH A R * |
如 果 有 |
通 过 调 用 程 序 可 以 修 改 所 有 的 标 量 数 组 参 数 诸 如 [in ou t] 参 数 数 组 类 型 不 能 作 为 返 回 类 型 这 里 不 支 持 对 象 或 字 符 串 数 组
通 常 这 种 机 制 由 O L E 函 数 用 来 返 回 值 O L E 函 数 保 留 函 数 返 回值 来 返 回 HR ES U L T 错 误 代 码 参 看 本 章 后 面 的 调 用 O L E A P I 函数 一 节 会 了 解 到 O L E 函 数 是 如 何 获 得 返 回 值 的
结 构
Ja va 语 言 不 直 接 支 持 结 构 的 概 念 尽 管 使 用 Ja va 类 包 含 的 字 段 可 以 在Ja va 语 言 中 模 拟 结 构 的 概 念 也 不 能 使 用 普 通 的 Ja va 对 象 在 本 机 D L L 调 用 中 模 拟 结 构 这 是 因 为 Ja va 语 言 不 能 保 证 字 段 的 布 局 因 为 无 用单 元 收 集 程 序 可 以 在 内 存 中 自 由 移 动 对 象
然 而 为 了 传 递 和 接 收 来 自 D L L 方 法 的 结 构 需 要 使 用 @ d l l . s t ru c t 编译 器 伪 指 令 当 对 Ja va 类 定 义 应 用 它 时 这 个 伪 指 令 将 对 内 存 块 中 分配 的 类 产 生 类 的 所 有 实 例 此 内 存 块 在 无 用 单 元 回 收 期 间 是 不 可 移 动的 另 外 使 用 p ack 修 饰 符 可 以 控 制 内 存 中 字 段 的 格 式 参 看 本 章后 面 的 结 构 封 装 例 如 W in3 2 S Y S T E M T IM E 结 构 在 C 编 程语 言 中 有 如 下 定 义
typ e d ef s tru c t {
W O R D w Y ea r ; W O R D w M o n th ;
W O R D w D a y O f W eek;
W O R D w D a y;
W O R D w H o u r ; W O R D w M in u te ; W O R D w S econ d ;
W O R D w M illis e co n d s ;
} SY ST E M T IM E ;
在 Ja va 中 此 结 构 正 确 的 声 明 如 下
/* * @ d l l.s tru ct() */
c lass S Y S T E M T IM E { pu b lic s h o r t w Y ea r ;
p u b lic s h ort w M on t h ;
pub lic short w D a y O f W e e k ;
pu b lic s h o r t w D a y; p u b lic s h ort w H o ur;
p u b lic s h ort w M inute; pu b lic s h o r t w S e c o nd ;
p u b lic s h o r t w M ill is e co n d s ;
}
下 面 的 例 子 在 D L L 方 法 调 用 中 使 用 S Y S TEM T IM E 结 构
cla s s S h o w S tru ct {
/ * * @ d ll. im p o r t (" K ER N EL3 2 " ) */
s ta t ic n a tiv e v o id G etS ys te m T im e( S Y S T E M T IM E p s t) ;
p u b lic s ta tic v o id m a in ( S trin g a rg s [ ] )
{
S Y S T EM T IM E s ys te m t im e = n e w SY ST E M T IM E ( ) ; G etS ys te m T im e( s ys te m t im e);
S ys t e m .o u t.p r in t ln (" Y ea r is " + s ys te m t im e . w Y ea r ) ;
S ys t e m .o u t .p rin tln (" M o n th is " + s ys te m tim e . w M o n th ) ;
/ / et c.
}
}
注 意 已 声 明 的 带 有 @dll.struc t 的 类 是 不 安 全 的 不 能 被 不 信 任的 小 应 用 程 序 使 用
结 构 内 部 各 类 型 间 的 一 致 性
下 表 描 述 了 在 结 构 内 部 标 量 类 型 是 如 何 映 射 的
Ja v a 本机
byte B Y T E
vh a r TCH A R ( C H A R 或 W C H A R 这取 决于 @ d ll.s tru c t 定义 )
sh o r t S H O R T
in t L ONG
long _ _ in t64
flo a t flo a t
do u b le do u b le
bo o le a n BO O L ( 3 2 位 Bo o le a n )
引 用 类 型 Ja va 对 象 和 类 通 常 映 射 到 嵌 套 结 构 和 数 组 下 表 给 出 各 种支 持 的 映 射
Ja v a |
本机 |
||
---|---|---|---|
strin g 使用 @ d ll.s tru c t |
标记 的类 |
指针 或 字 符 串嵌套 结 构 |
或 嵌 套的 定长 字 符 串 |
cha r [] TCH A R C H AR / W CHAR 的嵌 套数 组
byte [] BY T E 的嵌 套数 组
sh o r t [] SH O R T 的嵌 套 数 组
in t[] L ONG 的嵌 套数 组
long [] _ _ in t64 的嵌 套数 组
flo a t [] 浮点 的 嵌 套 数 组
do u b le [] 双 精 度的 嵌 套 数组
由 于 有 许 多 种 方 法 可 完 成 引 用 对 象 的 分 配 和 清 理 所 以 这 里 不 直 接 支持 结 构 内 部 的 指 针 为 了 表 示 带 嵌 套 指 针 的 结 构 需 声 明 此 指 针 字 段 为整 数 类 型 需 要 对 适 当 的 分 配 函 数 生 成 显 式 D L L 调 用 然 后 初 始 化 内存 块 可 以 使 用 D ll L ib . p tr T o S tru c t 将 这 块 内 存 映 射 到 @ d l l . S t ru c t 类
嵌 套 的 结 构
结 构 可 通 过 命 名 其 他 结 构 作 为 字 段 类 型 来 简 单 地 嵌 套 另 一 个 结 构 例如 如 下 将 W ind ow s M S G 结 构 嵌 套 一 个 PO IN T 结 构
typ e d ef s tru c t { LO N G x ;
LO N G y;
} P O IN T ;
typ e d ef s tru c t { in t h w n d ;
in t m essage; in t w P a ra m ; in t lP a ra m ;
in t t im e ;
PO IN T p t ;
} M S G ;
下 面 直 接 翻 译 进 Ja va
/* * @ d l l.S tru c t ( ) */ c lass P O IN T {
in t x ; in t y;
}
/* * @ d l l.s tru ct() */ c lass M S G {
p u b lic in t h w n d ;
p u b lic in t m es s a g e ; p u b lic in t w P a ra m ; p u b lic in t lP a ra m ;
p u b lic in t t im e;
p u b lic P O IN T p t ;
}
提 示 尽 管 嵌 套 结 构 是 很 方 便 的 但 实 际 上 Java 并 不 真 正 支 持嵌 套 的 对 象 而 只 支 持 对 象 的 嵌 套 引 用 Microsoft VM 必 须 在 每次 传 递 嵌 套 结 构 时 在 两 种 格 式 之 间 进 行 转 换 然 而 在 关 键 性 的 代码 路 径 中 可 以 通 过 人 为 嵌 套 结 构 来 改 善 性 能 通 过 把 嵌 套 结 构 的字 段 拷 贝 到 包 含 结 构 中 例 如 M S G 结 构 中 的 Pt 字 段 可 以 很 容易 地 声 明 为 两 个 整 型 字 段 Pt_x 和 Pt_y
在 结 构 中 嵌 套 定 长 字 符 串
在 一 些 结 构 中 可 嵌 套 定 长 字 符 串 LO G F O N T 结 构 定 义 如 下
typ e d ef s tru c t {
LO N G lf H e ig h t ; L O N G lf W idth;
/* < m an y oth er f ields d e le te d f o r b revit y> */ TCHAR lf F a c e N a m e[ 3 2 ] ;
} L O G F O N T ;
在 Ja va 中 使 用 展 开 的 句 法 指 定 长 度 来 描 述 这 种 结 构
/* * @ d l l.s tru ct() */
c la s s L O G F O N T { in t lf H e ig h t ;
in t lf W id th ;
/ * < m an y oth er f ields d e le te d for b revit y> */
/ * * @ d ll.s tru c t m a p ([ typ e= T C H A R [3 2 ]]) */ S t r in g lf F aceN a m e ;
}
@ d l l . s t ru tm a p 伪 指 令 指 明 了 固 定 字 符 串 的 长 度 作 为 字 符 的 测 量 尺 度 对空 字 符 结 尾 的 串 包 括 空 格
更 多 的 信 息 请 参 看 在 结 构 中 嵌 套 定 长 标 量 数 组
在 结 构 中 嵌 套 定 长 标 量 数 组
使 用 @ d ll. s t ru c tm a p 伪 指 令 可 以 指 定 在 结 构 中 嵌 套 的 定 长 标 量 数 组下 面 是 包 括 定 长 标 量 数 组 的 C 语 言 结 构
stru c t E m b e dd edA r ra ys
{
B Y T E b[ 4]
CHA R c[ 4 ]
SH O R T s [ 4 ]
IN T i[ 4 ]
_ _ in t 64 l[ 4]
flo a t f [ 4 ]
do ub l d [ 4 ]
};
在 下 面 的 方 法 中 通 过 使 用 @ d ll. s t ru c tm a p 可 指 定 E m b e dde dA r ra ys 结 构
/* * @ d l l.s tru ct() */
c lass E m b ed d ed A r ra ys
{
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */ byte b[];
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */ ch a r c[];
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */ short s[];
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */ in t i[ ] ;
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */ lo ng l[ ] ;
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */ flo a t f[];
/* * @ d ll.s t ru c t m a p ([ typ e= F IX E D A R R A Y , s iz e= 4 ]) */
do ub le d[];
}
结 构 装 填
在 AN S I C 草 案 3 .5 .2 .1 中 说 明 了 结 构 字 段 的 填 充 和 对 齐 可 通 过 使 用
p ack 修 饰 符 来 设 置 装 填 长 度
/* * @ d l l.s tru ct( p a c k = n ) */
这 里 的 n 可 为 1 2 4 或 8 默 认 为 8 对 于 M ic rosoft V isu a l C + + 编 译器 的 用 户 p ack = n 等 价 于 #pra g m a pa c k ( n )
理 解 @ d ll. s tru c t 和 @ c o m . s tru c t 之 间 的 关 系
@ d l l . s t ru c t 伪 指 令 与 @ c o m . s t ru c t 伪 指 令 非 常 类 似 这 个 伪 指 令 包 括 在ja c tiv e x 工 具 并 隐 含 包 括 在 Ja va t lb 工 具 中 Ja v a t lb 工 具 包 含 在 以 前 的M ic rosoft V is u a l J + + 版 本 中 现 在 已 经 被 ja c tiv e x 所 代 替 最 重 要 的不 同 点 是 默 认 类 型 映 射 适 于 M c i rosoft W indow s 函 数 调 用 而 不 是 CO M 对 象 调 用 这 样 就 可 以 在 类 型 库 中 描 述 这 个 结 构 并 使 用 ja c tiv e x 工具 生 成 Ja va 类 以 生 成 @ d l l . s t ru c t 类 然 而 通 常 情 况 下 手 工 生 成 类更 快 些
指 针
Ja va 不 支 持 指 针 数 据 类 型 然 而 用 户 可 以 传 递 一 个 元 素 的 数 组 而 不是 传 递 指 针 可 以 在 Ja va 整 数 中 存 储 指 针 然 后 从 原 始 指 针 中 读 写 数据
返 回 值 指 针
通 常 具 有 多 个 返 回 值 的 W in 3 2 函 数 可 通 过 调 用 程 序 给 更 新 的 变 量 传递 指 针 来 进 行 处 理 例 如 G e tD isk F re e S p a c e 函 数 具 有 如 下 原 型
BO O L G e t D is k F r e e S p a c e( L P C TS TR s z Ro o t P a th Na m e ,
DW O R D * lp S e c to rs P er C lu s ter, DW O R D * lp B ytes P er C lu s ter, DW O R D * lp F re e C lu s ters ,
DW O R D * lp C lu s ters ) ;
G e tD isk F re e S p a c e 的 典 型 调 用 如 下
D W O R D s e c to rs P er C lu s ter, b ytes P er C lu s ter, fr e e C lu s ters , c lu s ters ; G e t D is kF r e e S p ace( r o o tn a m e, & s ecto r s P er C lu ster,
& b ytes P er C lu s ter, & f r e eC lu s ters , & c lu s ters ) ;
在 Ja va 中 这 是 传 递 元 素 标 量 数 组 的 典 型 例 子 下 例 显 示 了 如 何 调 用
G e tD isk F re e S p a c e 函 数
cla s s S h o w G e t D is k F r e eS p a c e
{
p u b lic s ta t ic v o id m a in (S tr in g a rg s [ ] )
{
in t s e cto r s P er C lu s ter[] = { 0 } ; in t b ytes P er C lu s ter[] = { 0 } ;
in t f r e e C lu s ters [ ] = { 0 } ; in t c lu s ters [ ] = { 0 } ;
G e t D is k F r e eS p a c e( c :\ \" , s e cto rs P er C lu s ter" b yt es P erC lu s ter ,
f r e e C lu s ters , c lu s ters ) ;
S yst em .o ut.p r in t ln (" sectors/ clu s ter = " + s e c tors P er C luster[ 0 ] ) ; S ys t e m .o u t .p rin tln (" b y tes / c lu s ter = " + b ytes P er C lu s t er[ 0 ]);
S ys t e m .o u t .p rin tln (" f r e e c lu s ters = " + fr e e C lu s ters [0 ]); S ystem .o ut.p r in t ln (" c lusters = + " c lu sters[ 0 ] ) ;
}
/* * @ d l l .im port( K E R N E L 32) */
p riv a te n a tiv e s ta t ic b o o lea n G etD is k F r e e S p a c e(S tr in g ro o tn a m e , in t p S e c to rs P erC lu s ter[], in t p B yt es P erC lu s ter[] , in t p F re e C lu sters[], in t p C lu sters[]);
}
原 始 指 针
未 知 的 或 难 以 实 现 的 结 构 指 针 可 存 放 于 普 通 的 Ja va 整 数 中 如 果 应 用程 序 只 需 存 储 指 针 而 不 需 要 引 用 它 那 就 是 是 最 简 单 且 最 有 效 的 方 法可 以 使 用 此 技 术 来 存 储 分 配 内 存 块 的 DL L 函 数 返 回 的 指 针 实 际 上可 以 使 用 这 种 技 术 来 存 储 任 何 D L L 函 数 返 回 的 指 针 不 用 说 使 用 原始 指 针 消 除 了 许 多 Ja va 安 全 性 的 优 点 只 要 可 能 都 应 使 用 其 他 方 法然 而 还 是 有 可 能 选 择 使 用 原 始 指 针 的 情 况 记 住 从 原 始 指 针 中 读 写数 据 有 两 种 方 式
转 换 引 用 为 @ D ll. S tru c t 类
通 过 原 始 指 针 中 读 写 数 据 的 一 种 方 法 是 将 原 始 指 针 转 换 为 对 @ d l l . s t ru c t 类 的 引 用 一 旦 完 成 了 这 一 步 就 可 以 使 用 正 常 字 段 访 问 句 法 来 读 写 数据 例 如 假 设 有 一 个 要 访 问 RE CT 的 原 始 指 针 可 以 使 用 系 统 方 法D ll L ib . p tr T o S tru c t 如 下
/* * @ d ll. stru c t() * /
c la s s RE CT { in t left;
in t to p ;
in t r ig h t;
in t b o tto m ;
}
im p o r t c o m .m s . d l l .* ;
in t ra w p tr = … ;
RE CT r e c t = ( R E C T ) D l lL ib .p t r To S t ru c t ( R E C T .c la s s .ra w p t r ) ; r e ct. left = 0 ;
r e c t .to p = 0 ;
ret.rig h t = 1 0 ;
r e c t .b o t to m = 10;
在 RE CT 实 例 中 p tr T oS t ru c t 方 法 封 装 原 始 指 针 这 个 RE C T 实 例 与 N e w 运 算 符 创 建 的 实 例 不 同 它 不 会 通 过 无 用 单 元 收 集 来 释 放 原 始 指 针 因为 RE CT 对 象 没 有 办 法 知 道 指 针 的 位 置 另 外 由 于 本 机 内 存 在 调 用p tr T oS t ruc t 时 已 经 构 成 所 以 不 调 用 RE CT 类 构 造 器
使 用 D llL ib 拷 贝 方 法
从 原 始 指 针 中 读 写 数 据 的 另 一 种 方 法 是 在 D ll L ib 中 使 用 重 载 拷 贝 方 法这 些 方 法 在 各 种 类 型 的 Ja va 数 组 和 原 始 指 针 之 间 拷 贝 数 据 如 果 需 要把 原 始 指 针 作 为 指 向 字 符 串 的 指 针 L P TS TR 可 以 使 用 D ll L ib 方 法p tr T oS t r in g A n s i p tr T oS t r in g U ni 或 p tr T oS t r in g 来 从 句 法 上 分 析 字 符 串并 把 它 转 换 成 ja v a ..la n g .S trin g 对 象
Im p o r t co m . ms . d l l.* ;
in t ra w p t r = … ;
S t r in g s = d llL ib .p t r T o S trin g A n s i(ra w p tr);
警 告 所 有 Java 对 象 都 在 内 存 中 移 动 或 被 无 用 单 元 收 集 程 序 回收 所 以 不 能 试 图 通 过 调 用 具 有 常 规 类 型 转 换 的 D L L 函 数 来 为 Java 数 组 获 得 指 针 下 例 给 出 了 获 得 指 针 的 一 种 不 正 确 的 方 法
// D o n o t d o th is !
/* * @ d ll.im p o rt(" M Y D L L " ) */
p r iv ate nativ e static in t C a st( int ja vaarra y[]);
/ / In s id e M Y D L L . D L L
L P VO ID Ca s e( L P V O ID p t r )
{
// D o n o t d o th is !
R e tu rn p t r ; / / co m es in a s a J a v a a r ra y; g o es o u t a s a J a v a in t
}
多 态 参 数
p t r 值 只 在 调 用 Cast 函 数 期 间 才 能 保 证 是 有 效 的 这 是 因 为 允 许 V M 实 现 通 过 拷 贝 来 执 行 数 组 的 传 递 并 且 因 为 在 对 Cast 函 数 的 调 用返 回 后 无 用 单 元 回 收 可 能 会 使 数 组 的 物 理 存 储 位 置 变 得 不 同
— 些 W in 3 2 函 数 声 明 参 数 的 类 型 依 赖 于 另 一 个 参 数 的 值 例 如 W in H e lp
函 数 声 明 如 下
B O O L W inH e lp( in t hw n d , L P C T S T R s z H e lp File, U IN T c m d, D W O R D dw D a ta ) ;
看 似 简 单 的 dw D a ta 参 数 实 际 上 可 以 为 以 下 几 种 形 式 指 向 字 符 串 的 指针 指 向 M U L T IK E Y H E L P 结 构 的 指 针 指 向 HE L P W IN IN F O 指 针 或普 通 整 数 这 取 决 于 cm d 参 数 的 值
J /D i rect 提 供 两 种 方 法 来 声 明 这 种 参 数
-
声 明
此 参 数 作 为 O b ject 类 型
-
对
每 种 可 能 的 类 型 使 用 过 载 来 声 明 分 离 方 法
关 于 这 两 种 方 法 的 比 较 请 参 看 本 章 后 面 的 两 种 方 法 的 比 较
声 明 参 数 为 O b je c t 类 型
下 面 给 出 了 如 何 通 过 声 明 dw D a ta 为 O b ject 类 型 来 声 明 W in H e lp
/* * @ d l l.im p ort(" U S E R 3 2 " ) */
s ta t ic n a t ive bo o lea n W in H e lp ( in t hw nd , S t r in g s z H e lp F i le ,
in t c m d , O b je c t d w D a ta ) ;
当 调 用 W in H e lp 时 J /D i rect 将 使 用 运 行 时 间 类 型 来 决 定 如 何 传 递
dw D a ta 下 表 描 述 了 类 型 是 如 何 转 换 的
类型 转换 为
ja v a .la n g .In te g e r 4 字节 整数
ja v a .la n g .B oo le a n 4 字节 BO O L
ja v a .la n g .C h a r CH A R 如 果 un ic od e 或 o le 修 饰 符 有 效 则 是
W C H A R
ja v a .la n g .sh o rt 2 字节 SH O R T
ja v a .lan g .F loat 4 字节 FL O A T
ja v a .la n g .S tr in g LP C S T R ( 如 果 u n ic ode 或 o le 修 饰 符 有 效 则 是
LP CW S T R )
或 o le 修 饰 符 有 效 则 是
或 o le 修 饰 符 有 效 则 是
重 载 函 数
声 明 W in H e lp 函 数 的 另 一 种 方 法 是 对 每 种 可 能 的 类 型 进 行 重 载 函 数
/* * @ d l l.im p ort(" U S E R 3 2 " ) */
s ta t ic n a t ive bo o lea n W in H e lp ( in t hw nd , S t r in g s z H e lp F i le ,
in t c m d , in t d w D a ta ) ;
/* * @ d l l.im p ort(" U S E R 3 2 " ) */
s ta t ic n a t ive bo o lea n W in H e lp ( in t hw nd , S t r in g s z H e lp F i le ,
in t c m d , S t r in g d w D a ta ) ;
/* * @ d l l.im p ort(" U S E R 3 2 " ) */
s ta t ic n a t ive bo o lea n W in H e lp ( in t hw nd , S t r in g s z H e lp F i le ,
in t c m d , M U L T IK E Y H E L P d w D a ta ) ;
/* * @ d l l.im p ort(" U S E R 3 2 " ) */
s ta t ic n a t ive bo o lea n W in H e lp ( in t hw nd , S t r in g s z H e lp F i le ,
in t c m d , H E L P W IN IN F O d w D a ta ) ;
使 用 重 载 技 术 不 能 处 理 多 态 返 回 值 因 为 在 单 一 返 回 值 上 不 能 重 载 Ja va 方 法 因 此 必 须 给 函 数 的 每 种 变 体 起 不 同 的 Ja va 名 称 然 后 使 用en t ryp o in t 修 饰 符 来 把 它 们 链 接 到 相 同 的 D L L 方 法 要 了 解 其 他 D L L 方 法 的 更 多 信 息 请 参 看 本 章 后 面 的 别 名 方 法 重 命 名
两 种 方 法 的 比 较
在 大 多 数 实 例 中 优 先 考 虑 重 载 方 法 因 为 它 运 行 性 能 高 还 有 较 好 的类 型 检 查 另 外 重 载 避 免 了 在 In te g e r 对 象 内 部 封 装 整 数 参 数
然 而 在 有 多 个 多 态 参 数 的 情 况 中 声 明 参 数 为 类 型 O b je c t 是 很 有 用的 当 要 访 问 大 量 类 型 的 服 务 时 诸 如 可 以 接 受 使 用 @ d l l . s t ru c t 伪 指 令声 明 的 任 意 对 象 的 函 数 也 可 以 选 择 这 种 方 法
回 调
几 种 W in3 2 A P I 要 求 程 序 提 供 具 有 回 调 函 数 地 址 的 W in d o w s 在 Ja va
中 可 以 通 过 展 开 系 统 类 c o m .m s. d l l .c a llb a c k 来 写 回 调 函 数
声 明 带 有 回 调 的 方 法
在 Ja va 中 为 了 表 示 回 调 参 数 需 声 明 Ja va 类 型 为 类 型c o m .m s . d ll. C a llb a c k 或 从 中 派 生 出 来 的 类 例 如 M ic rosoft W in 3 2 E num W indow s 原 型 化 如 下
B O O L En um W in d ow s ( W N D E N U M P R O C w n denu m p ro c , LP A R A M lp a ra m ) ;
对 应 的 Ja va 原 型 为
im p o r t co m . m s .d ll .C allb ack;
/ * * @ d ll. im p o r t (" U S E R 3 2 " ) */
s ta t ic n a t ive bo o lea n E n um W in d ow s ( C a l lb a c k w n denum proc , in t lp a ram ) ;
调 用 带 回 调 的 函 数
为 了 调 用 带 回 调 的 函 数 必 须 定 义 展 开 的 类 为 C a l lb a c k 派 生 类 必 须 公布 一 个 非 静 态 的 方 法 它 的 名 称 是 ca l lb ac k 全 部 小 写
W NDE N U M P R O C 的 C 语 言 定 义 如 下
B O O L C A L L B A C K E num W indow s P ro c ( H W N D hw nd, LP A R A M lp a ra m ) ;
为 了 在 Ja va 中 创 作 E num W indow s P ro c 必 须 声 明 展 开 C a l lb a c k 的 类如 下
c las s E n u m W in d o w s P ro c ex te n d s C a llb a ck
{
pu blic bo o lea n ca llback ( in t hw n d , in t lp a ra m )
{
S t r ing B u f f er t ext = ne w Strin g B u f f er( 5 0);
G e t W in d o w T ex t ( h w nd , t ext, text.ca p acit y()+ 1);
i f ( te x t .le n g h ( ) != 0 ){
S ys te m . o u t .p r in t ln (" hw n d =" + In te ger.to H exS t r in g ( hw n d ) + " h: T ext =" + t ext);
}
r e tu r n tru e ; // retu r n T R U E to co n t in u e e n u m era tio n .
}
/* * @ d ll. im p o r t("U S E R 3 2 " ) * /
p r iv a te s ta t ic n a tiv e in t G e t W in d o w T ex t ( in t h w n d ,S tr in g B u f f er tex t ,in t c c h ) ;
}
可 以 使 用 如 下 方 法 调 用 带 有 ca l lb ac k 的 E n u m W indow s
bo o lea n r es u lt = E n um W in d ow s ( ne w E n u m W in d o w s P ro c(), 0);
回 调 方 法 接 受 类 型 的 限 制
回 调 方 法 的 返 回 类 型 必 须 是 vo id in t boo le a n 或 short 当 前 允 许 的 唯一 参 数 类 型 是 整 型 幸 运 的 是 这 并 不 像 听 起 来 有 那 么 多 限 制 可 以 使用 D ll L ib 方 法 p tr T oS t r in gA n s i p tr T oS t r in g U ni 和 p tr T oS t r in g 把 参 数 作为 L P TS TR 可 以 使 用 p tr T oS t ruc t 方 法 把 参 数 作 为 指 向 @ d l l . s t ru c t 类 的指 针
用 回 调 关 联 数 据
经 常 需 要 把 一 些 数 据 从 函 数 的 调 用 程 序 传 到 回 调 程 序 这 解 释 了E num W indow s 带 有 额 外 的 lp a ra m 参 数 的 原 因 大 多 数 带 有 回 调 的 W in 3 2 函 数 都 有 无 条 件 接 受 传 到 回 调 函 数 的 特 殊 的 32 位 参 数 使 用 回 调 机 制可 以 不 必 使 用 lp a ra m 参 数 来 传 递 数 据 因 为 回 调 方 法 是 非 静 态 的 所以 可 以 在 E num W indow s P ro c 对 象 中 把 数 据 作 为 字 段 来 存 储
回 调 的 生 存 期
需 要 注 意 要 完 成 本 机 函 数 之 前 无 用 单 元 回 收 程 序 不 回 收 回 调 如 果回 调 是 短 期 的 只 对 函 数 调 用 的 生 存 期 可 用 则 不 需 要 特 殊 的 行 为因 为 对 D L L 函 数 传 递 的 回 调 可 以 保 证 在 调 用 过 程 中 不 必 由 无 用 单 元 回收 程 序 来 回 收
如 果 回 调 是 长 期 的 整 个 函 数 调 用 过 程 中 都 使 用 将 必 须 在 Ja va 数据 结 构 中 通 过 存 储 它 的 引 用 防 止 回 调 被 回 收 也 可 以 在 本 机 数 据 结 构 中通 过 使 用 c o m .m s. d l l . ro o t 类 在 根 句 柄 内 封 装 此 回 调 来 存 储 回 调 的 引 用
根 句 柄 是 32 位 句 柄 它 可 以 防 止 回 调 被 回 收 直 到 句 柄 显 式 释 放 为 止例 如 W ndP ro c 的 根 句 柄 可 存 储 在 HW ND 结 构 的 应 用 数 据 区 中 并 且在 W M _ N C D ES TR O Y 消 息 中 显 式 释 放
在 结 构 内 部 嵌 套 回 调
为 把 回 调 嵌 套 到 结 构 内 部 必 须 先 调 用 c o m .m s . d ll. R o o t.a llo c 方 法 以 在根 句 柄 中 封 装 回 调 然 后 把 根 句 柄 传 递 到 D ll L ib . a d d r O f 方 法 以 获 得回 调 的 实 际 本 机 地 址 然 后 把 这 个 地 址 作 为 整 数 存 储
例 如 在 Ja va 中 如 下 声 明 W NDC L A S S 结 构
/* * @ d l l.s tru ct() */
class W N D C L A S S { in t s ty le ;
in t lp fn W n d P ro c ; ; / / C A L L B A C K
… / * < o th er f ield s d e le te d fo r b rev it y > * /
}
假 设 已 经 展 开 回 调 如 下
c la s s W N DP RO C ex ten d s Ca l lb a c k
{
pu b l ic in t ca llback ( in t hw n d , in t m s g, in t w p a ra m , in t lp a ra m )
{
…
}
}
为 了 在 W N C L A S S 对 象 内 部 存 储 指 向 回 调 的 指 针 使 用 如 下 序 列
im p o r t c o m . m s .d ll .* ;
W N DC L A S S w c = n e w W N DCLAS S ( ) ;
in t ca l lb a c k ro o t = Ro o t .a l lo c( n e w W N DP RO C ()); W c .lpfnW nd Proc = D l lL ib .a d d r O f ( ca l lb a c k ro o t ) ;
调 用 O L E A P I函 数
本 节 提 供 关 于 O L E A P I 函 数 的 信 息
O L E 模 式 句 法
@ d l l . im port 伪 指 令 包 括 为 导 入 O L E A P I 函 数 而 设 计 的 特 殊 模 式 为 使用 这 种 模 式 在 下 面 的 例 子 中 只 包 括 o le 修 饰 符
/* * @ d l l.im p ort(" O L E 3 2 " , o le) */ p u b lic class O L E 3 2 {
…
}
O L E 函 数 与 W in 3 2 函 数 的 比 较
理 论 上 O L E 32 .D L L 和 O L E A U T 3 2 .D L L 的 导 出 函 数 不 同 于 其 他 任 何D L L 函 数 实 际 上 O L E 函 数 具 有 自 己 一 致 的 调 用 风 格 在 以 下 几 个方 面 O L E 函 数 不 同 于 W in 3 2 函 数
-
O
L E 函 数 只 在 U n ic ode 中 出 现 这 里 没 有 AN S I O L E 函 数
-
实 际 上 所 有 O L E 函 数 都 通 过 标 准 函 数 返 回 值 来 返 回 32 位 状 态 码即 HR ES U L T 高 位 指 出 函 数 是 成 功 高 位 关 闭 还 是 失 败 高 位 打开 少 量 函 数 可 返 回 多 个 成 功 值 通 常 有 S_ O K 和 S_ F A LS E
但 大 多 数 只 返 回 一 个 成 功 值 S_ O K
-
如 果 O L E 函 数 除 状 态 码 外 还 返 回 多 个 值 则 调 用 程 序 应 提 供 指 向 变量 的 指 针 这 个 变 量 将 接 收 退 出 值 通 常 返 回 值 指 针 作 为 最 后 的 参数
-
返 回 字 符 串 的 W in 3 2 结 构 是 填 充 在 调 用 程 序 分 配 的 缓 冲 区 中 O L E 函 数 通 过 使 用 C o T a sk M e m A llo c 来 返 回 字 符 串 并 期 望 调 用 程 序 使 用Co T a sk M e m F re e 来 释 放 它 们
比 较 W in 3 2 代 码 与 O L E 代 码
简 单 Ad d 函 数 的 代 码 看 起 来 像 W in 3 2 编 码 结 构 中 的 代 码
in t s u m ;
s u m = A d d ( 10, 20);
在 O L E 风 格 中 Ad d 函 数 如 下
HRE S UL T h r ;
in t s u m ;
hr = A dd( 1 0 , 2 0 , & s um ) ; if (F A IL E D ( h r)) {
… h a n d le err o r ..
}
调 用 O L E 函 数
o le 模 式 利 用 一 致 性 的 编 码 风 格 为 调 用 O L E 函 数 提 供 一 种 友 好 的 Ja va 方 法 从 Ja va 调 用 O L E 风 格 的 A d d 函 数 看 起 来 像 调 用 传 统 的 W in 3 2 风 格 的 函 数
/* * d ll .im p o r t (" O L E L IK E M A T H D L L " , o le) * / p riv a te n a tiv e s ta t ic in t A d d ( in t x , in t y);
in t s u m = A d d ( 10, 20);
/ / if w e got h ere, A d d su cceed e d.
O L E 模 式 的 工 作 方 式
由 于 o le 修 饰 符 M ic rosoft V M 自 动 假 设 本 机 Ad d 函 数 返 回 HR E S U L T VM 通 知 Ad d 函 数 返 回 整 数 当 调 用 Ad d 时 V M 自 动 分 配 整 型 的 临
时 变 量 并 插 入 指 向 它 的 指 针 作 为 第 三 个 参 数 本 机 Ad d 函 数 返 回 后VM 自 动 检 查 HR ES U L T 并 且 如 果 它 指 出 了 失 败 高 位 打 开 则发 出 类 型 c o m .m s. c o m . C o m F a i l E x c e p t io n 的 Ja v a 异 常 如 果 HR ES U L T 没 有 指 出 失 败 则 VM 从 它 创 建 的 临 时 变 量 中 检 索 A d d 函 数 的 真 正 返回 值 并 返 回 此 值
S_ F A LS E 与 Ja va /C O M 的 集 成 不 同 它 的 返 回 值 不 会 导 致 发 出C o m S u ccess E x cep t io n 如 果 要 区 别 成 功 的 结 果 则 必 须 使 用 正 规 的 D L L 调 用 模 式 并 把 HR ES U L T 作 为 整 数 返 回 值
o le 模 式 修 改 D L L 调 用 的 语 义 概 括 如 下
-
所 有 字 符 串 和 字 符 都 假 设 为 U n ic ode
-
本 机 函 数 的 函 数 返 回 值 假 设 是 HR ES U L T 如 果 返 回 的 HR E S U L T 指出 失 败 则 M ic rosoft V M 发 出 C o m F ail E x c ep t io n
-
如 果 Ja va 方 法 返 回 类 型 不 是 vo id 则 M ic rosoft V M 将 被 假 设 本 机 函数 通 过 指 针 返 回 附 加 结 果 此 指 针 是 函 数 的 最 后 一 个 参 数 在 调 用 获得 附 加 返 回 值 之 后 VM 将 提 供 这 个 指 针 的 参 数 和 引 用 这 个 值 将 作为 Ja va 方 法 的 值 来 返 回
传 递 和 接 收 来 自 O L E 函 数 的 字 符 串
在 o le 模 式 函 数 上 声 明 一 个 参 数 为 S tr in g 类 型 来 传 递 LP C O L E ST R M ic rosoft V M 也 包 括 长 度 前 缀 所 以 这 个 字 符 串 可 以 作 为 BS T R
在 o le 模 式 中 声 明 返 回 值 为 S tr in g 类 型 可 使 M ic rosoft V M 传 递 指 向 未
初 始 化 的 LPC O L E ST R 的 指 针 当 本 机 函 数 返 回 时 M ic rosoft V M 将把 返 回 的 LPC O L E ST R 转 换 成 字 符 串 然 后 调 用 Co T a sk F e e 来 释 放 字符 串
传 递 GU ID s 及 IID s 和 C L S IDs
使 用 系 统 类 c o m .m s. c o m ._ G u id s 来 表 示 GU ID s 作 为 参 数 传 递 _G u id 对象 也 就 是 对 本 机 函 数 传 递 了 指 向 GU ID 的 指 针 声 明 _G u id 的 返 回 类型 可 使 M ic rosoft V M 传 递 指 向 函 数 填 充 的 只 在 o le 模 式 中 未 初 始化 的 GU ID 的 指 针
例 如 O L E 3 2 导 出 函 数 C L S ID F ro m P ro g I D 和 P ro g ID F ro m C L S ID 以 在C L S ID s 和 通 过 V isu a l B a s ic 函 数 C rea teO b jec t 使 用 的 可 读 名 称 之 间 进 行映 射
这 些 方 法 具 有 如 下 原 型
HRE S UL T CL S IDF ro m P r o g ID ( L P CO LE S T R s z P ro g ID , L P C L S ID p c ls id ) ; H R ES U L T P ro g ID F r o m C LS ID ( R EF C L S ID c ls id , L P O LES T R * lp s z P ro g Id ) ;
在 Ja va 中 以 如 下 方 式 声 明 这 些 方 法
im po r t c o m . m s . com ._ G u id ; class O L E {
/ * * @ d ll.im p o rt(" O L E 3 2 " , o le) */
p u b l ic s ta t ic n a t iv e _G u id C L S ID F ro m P ro g ID ( S tr in g s z P rog ID ) ;
/ * * @ d ll.im p o rt(" O L E 3 2 " , o le) */
p u b l ic static nativ e S t r ing P r og ID F ro m C L S ID (_ G uid c lsid);
}
注 意 com.ms.com ._Guid 取 代 了 com.ms.com .Guid 去 掉 了 下 划线
传 递 VAR IA N T s
声 明 类 型 c o m .m s. c o m . V a ria n t 的 参 数 来 为 本 机 函 数 传 递 指 向 VA R IANT 的 指 针 声 明 类 型 c o m .m s. c o m . V a ria n t 只 对 ole 模 式 的 返 回 值 来为 本 机 函 数 传 递 指 向 未 被 初 始 化 的 V a r ia n t 的 指 针 以 进 行 填 充
传 递 CO M 接 口 指 针
为 传 递 CO M 接 口 指 针 必 须 使 用 诸 如 ja c tiv e x . e x e 之 类 的 工 具 来 生 成Ja va /C O M 接 口 类 然 后 通 过 声 明 接 口 类 型 的 参 数 来 传 递 或 接 收 CO M 接 口
例 如 系 统 类 c o m .m s. c o m . IS t re a m 是 Ja va /C O M 接 口 此 接 口 代 表 了 s t ru ctu re d S to ra g e IS t rea m * 接 口 O L E 3 2 函 数 C rea t S tream O n H G lo b a l 的声 明 如 下
im po r t c o m . m s . com .* ;
/* * @ d l l.im p ort(" O L E 3 2 " , o le) */
p u b lic s ta t ic n a tiv e IS tr ea m C r ea te S t r ea m O n H G lo b a l( in t h g lo b a l, b o o lea n fD e le te O n R e lea s e);
别 名 方 法 重 命 名
有 时 可 能 想 使 用 Ja va 方 法 的 名 称 此 名 不 同 于 导 出 函 数 时 D L L 使 用的 名 称 例 如 可 能 有 以 小 写 字 母 开 头 的 Ja va 名 称 以 便 符 合 Ja va 命名 约 定 为 了 做 到 这 一 点 在 下 例 中 使 用 带 有 en t ryp o in t 修 饰 符 的@ d l l . im port 伪 指 令
/* * @ d l l.im p ort(" U S E R 3 2 " , en t r yp oint= " G e t S ys C o lo r" ) */ s ta t ic n a tiv e in t g etS ys C o lo r( in t n In d ex );
不 需 要 用 别 名 来 执 行 W in3 2 A P I 的 A N S I /U n ic ode 后 缀 M ic rosoft V M 自 动 承 担 这 些 工 作 请 参 看 本 节 后 面 的 VM 如 何 在 AN S I 和 U n ic ode 之 间 进 行 选 择 当 访 问 通 过 a .d e f 文 件 导 出 的 函 数 时 也 不 必 使 用别 名 方 式 通 常 这 些 名 称 是 使 用 破 坏 标 准 调 用 s td ca ll m a n g in g
的 方 式 导 出 的 以 下 范 例 给 出 了 _sa m p le @ 8 重 新 命 名 的 方 法 这 里 的 8
表 示 函 数 接 受 的 参 数 类 型 数 量
ex tern " C "
_ _ d eclsp ec( d ll ex p o r t )
V O ID s a m p le(in t x , in t y ){
…
}
如 果 没 有 显 式 入 口 点 则 J /D i rect 自 动 对 破 坏 的 标 准 调 用 std c a l l - m a n g le d 名 称 进 行 绑 定 M ic rosoft V M 自 动 为 以 下 KER N E L 3 2 AP I 函数 提 供 别 名
K e rn el 3 2 F u n c t ion A l ia s
Co p y M e m o ry R tlM o v e M e m o ry
M o ve M e m o ry R t lM o v e M e m o ry
F illM e m o ry R tlF i llM e m o ry
Z e ro M e m o ry R t lZ e roM e m ory
按 序 号 链 接
— 些 D L L 是 通 过 序 号 16 位 整 数 而 不 是 名 称 导 出 函 数 的 为 了 调 用这 样 的 D L L s 需 要 使 用 方 法 级 @ d l l . im port 伪 指 令 来 确 定 序 号 序 号 链接 的 句 法 是
/* * @ d l l.im p o r t. im p o rt(" L ib n a m e" , e n tr y P o in t= " # o rd in a l" ) */
注 意 ord ina l 是 以 十 进 制 形 式 指 定 的
例 如 要 以 D L L M y D l l . D L L 中 的 序 号 82 链 接 导 出 的 函 数 其 代 码如 下
/* * @ d l l.im p ort(" M yD ll" , en t r yp oint= " # 8 2 " ) */ p u b lic s ta t ic n a t ive vo id M y S a m p le ( ) ;
为 整 个 类 指 定 @ d ll. im p o r t
在 类 定 义 之 前 可 以 使 用 @ d l l . im port 伪 指 令 来 为 所 有 在 此 类 中 声 明 的本 机 方 法 设 置 库 名 以 下 声 明 是 为 整 个 类 使 用 了 @ d l l . im port
/* * @ d l l . im port (" K E R N E L 32 " ) */
cla s s E n v iro n m en t S t r in g s
{
p u b lic s ta t ic n a t iv e in t G etE n v ir o n m e n t S trin g ();
p u b lic s ta t ic n a t iv e in t G etE n v ir o n m e n t V a r ia b le(S tr in g n a m e ,
S t r in g B u f fer v a lu e , in t c cb V a lu e);
p u b ic static nativ e b o olea n S e t E n v ir on m e nt V a r iab le( S t r in g na m e ,S t r in g va lu e);
}
为 每 种 方 法 指 定 @ d l l . im port 是 等 效 的 如 下 例
cla s s E n v iro n m en t S t r in g s
{
/ * * @ d ll. im p o r t (" K ER N EL3 2 " ) */
p u b lic s ta t ic n a t iv e in t G etE n v ir o n m e n t S trin g s ();
/* * @ d ll.im p o r t(" K E R N E L 3 2 " ) * /
p u b lic s ta t ic n a t iv e in t G etE n v ir o n m e n t V a r ia b le(S tr in g n a m e ,
S t r in g B u f fer v a lu e , in t c cb V a lu e);
/* * @ d ll.im p o r t(" K E R N E L 3 2 " ) * /
p u b lic sta t ic nativ e b o o lea n S e t E nv iro n m en t V a riab le( S t r in g nam e ,S t r in g valu e);
}
在 类 级 使 用 @ d l l . im port 伪 指 令 可 以 节 省 .c la ss 文 件 中 的 空 间 并 消 除 了冗 余 的 信 息 然 而 类 级 的 @ d l l . im port 伪 指 令 不 是 通 过 子 类 来 继 承 的
VM 如 何 在 AN S I和 U n ic o d e 之 间 选 择
考 虑 介 绍 J /D i rect 基 础 知 识 中 M e ss a g e B o x 的 例 子 一 个 重 要 的 事 实 是US E R 3 2 并 不 会 导 出 名 为 M e ss a g e B ox 的 函 数 因 为 M e s sa g e B o x 函 数带 有 字 符 串 它 像 所 有 W in 3 2 函 数 那 样 处 理 字 符 串 必 须 存 在 于 两个 版 本 中 AN S I 版 本 和 U n ic ode 版 本 分 别 命 名 为 M e ss a g e B o x A 和M e ss a g e B o x W 当 在 C 或 C+ + 中 调 用 M e ss a g e B o x 时 调 用 的M e ss a g e B o x 函 数 实 际 上 是 一 个 宏 此 宏 根 据 是 否 定 义 了 U N IC O D E 宏 而 扩 展 到 M e ss a g e B o x A 或 M e ss a g e B o x W
调 用 D L L 函 数 的 ANS I版 本
默 认 情 况 下 M ic rosoft V M 假 设 M e ss a g e B o x 函 数 的 AN S I 版 本 是 唯 一需 要 的 如 果 使 用 @ d l l . im port 不 带 修 饰 符 导 入 M e ss a g e B o x 函 数代 码 如 下
/* * @ d l l.im p ort(" U S E R 3 2 " ) */
s ta t ic n a t ive in t M es s a g e B o x ( in t hw nd , S t r in g text, S t r ing t it le , in t s t yle);
M ic rosoft V M 将 采 取 如 下 步 骤
-
字 符 串 的 文 本 和 标 题 转 换 成 AN S I 空 字 符 结 尾 的 字 符 串
-
VM 试 图 在 U S E R 32 .D L L 中 找 到 名 为 M e ss a g e B o x 的 出 口
-
若 此 尝 试 失 败 则 VM 在 名 称 上 追 加 A 然 后 寻 找 名 为 M e s sa g e B o x A
的 出 口
- 若 此 尝 试 成 功 则 VM 调 用 M e ss a g e B o x A 函 数
调 用 D L L 函 数 的 U n ic ode 版 本
假 设 不 想 调 用 M e ss g e B o x 函 数 的 AN S I 版 本 而 是 想 调 用 U n ic ode 版 本可 以 通 过 使 用 具 有 @ d l l . im port 伪 指 令 的 修 饰 符 来 完 成
/* * @ d l l.im p ort(" U S E R 3 2 " ,u n icod e) * /
s ta t ic a n tiv e in t M es s a g e B o x ( in t h w n d , S t r in g tex t , S trin g t itle, in t s tyle);
既 然 已 给 出 了 U n ic ode 修 饰 符 则 M ic rosoft V M 将 采 取 如 下 步 骤
-
字 符 串 的 文 本 和 标 题 转 换 成 U n ic o d e 空 字 符 结 尾 的 字 符 串
-
VM 试 图 在 U S E R 32 .D L L 中 找 到 名 为 M e ss a g e B o x 的 出 口
-
若 尝 试 失 败 则 VM 在 名 称 上 追 加 W 然 后 寻 找 名 为 M e ss a g e B oxW
的 出 口
- 若 尝 试 成 功 则 VM 调 用 M e ss a g e B o x W 函 数
调 用 D L L 函 数 的 最 佳 版 本
不 幸 的 是 调 用 D L L 函 数 的 AN S I 版 本 或 U n ic ode 版 本 都 是 调 用 W in 3 2 函 数 的 一 种 理 想 方 法 使 用 默 认 AN S I 模 式 允 许 代 码 在 任 何 W in 3 2 平 台上 运 行 但 在 全 U n ic ode 系 统 诸 如 M ic rosoft W indow s N T 上 会 导 致 不必 要 的 性 能 损 失 使 用 U n ic ode 修 饰 符 可 去 除 性 能 上 的 损 失 但 限 制 是只 能 在 实 现 U n ic ode A P I 的 系 统 上 运 行 幸 运 的 是 可 以 使 用 带 有@ d l l . im port 伪 指 令 的 au to 修 饰 符 来 基 于 主 操 作 系 统 调 用 D L L 函 数 的最 佳 版 本
使 用 au to 修 饰 符 提 供 了 这 两 种 优 点 下 面 的 例 子 显 示 了 如 何 调 用
M e ss a g e B o x 函 数 的 最 佳 版 本
/* * @ d l l.im p ort(" U S E R 3 2 " ,a uto) */
s ta t ic n a t ive in t M es s a g e B o x ( in t hw nd , S t r in g text, S t r ing t it le , in t s t yle);
当 给 定 了 au to 修 饰 符 时 M ic rosoft V M 决 定 在 运 行 期 间 基 本 平 台 是 否支 持 U n ic ode A P Is 如 果 支 持 U n ic ode 则 VM 的 行 为 就 像 是 已 经 指 定了 U n ic ode 修 饰 符 否 则 VM 的 行 为 就 像 是 已 经 指 定 了 an s i 修 饰 符 这 样 通 过 在 给 定 的 平 台 上 使 用 最 优 的 AP I 集 au to 修 饰 符 就 可 以 在AN S I 和 U n ic ode W indow s 系 统 上 都 能 运 行
— 般 来 说 无 论 何 时 调 用 U n ic ode A P I 函 数 都 可 以 使 用 au to 修 饰 符如 果 调 用 自 己 的 D L L s 则 根 据 自 己 的 需 要 选 择 an s i 默 认 或 U n ic ode 下 表 给 出 了 当 使 用 au to 修 饰 符 时 VM 如 何 决 定 使 用 AN S I 或 U n ic ode 的细 节
- VM 打 开 注 册 表 键H K E Y _ L O C A L _ N A C H IN E \ s o f tw are \M icro so f t \J a v a .V M 然 后 寻 找DW OR D 命 名 的 值 D llIm p o r t D e fa u ltT yp e 此 值 是 下 列 几 种 之 一
2 — A N S I 一 直 使 用 AN S I 版 本
3— U n ic ode 一 直 使 用 U n ic ode 版 本
4 — P la tfo rt 根 据 平 台 确 定 使 用 AN S I 或 U n ic ode
- 如
果 键 不 存 在 或 如 果 它 已 经 设 置 为 4 表 示 平 台 则 VM 调 用 W in 3 2 Ge t V e rs io n 函 数 然 后 检 查 高 位 来 确 定 本 平 台 是 M ic rosoft W indow s
95 还 是 M ic rosoft W indow s N T 如 果 平 台 是 W ind ow s 95 则 使 用
AN S I 模 式 否 则 使 用 U n ic ode 模 式
没 有 必 要 自 己 设 置 D llIm p o r t D e fa u ltT yp e 注 册 表 键 它 基 本 上 已 存 在 了所 以 安 装 程 序 可 以 在 未 来 的 W ind ow s 平 台 上 设 置 最 合 适 的 选 择 可 以在 平 台 上 通 过 读 取 c o m .m s. d l l . d l l L ib .S y s te m D e fa u l t C h a r S z ie 字 段 来 编程 查 询 首 选 模 式 这 个 字 段 在 AN S I 系 统 上 将 设 置 为 1 在 U n ic ode 系统 上 将 设 置 为 2
An s i , U n ic o d e 和 au to 也 可 用 于 @ d l l . s t ru c t 伪 指 令
通 过 D L L 函 数 获 得 错 误 代 码
不 调 用 W in3 2 函 数 G e t L a s t E rro r 而 是 通 过 另 一 个 D L L 调 用 也 可 以获 得 错 误 代 码 因 为 M ic rosoft V M 可 能 在 执 行 Ja va 代 码 的 过 程 中 执 行自 身 的 函 数 调 用 所 以 在 获 得 错 误 代 码 时 它 可 能 已 经 被 已 经 重 写 了
为 了 可 靠 地 通 过 D L L 函 数 来 访 问 错 误 代 码 必 须 使 用 se tL a s tE r ro r 修 饰符 来 指 示 VM 在 调 用 方 法 后 立 即 捕 获 错 误 代 码 由 于 性 能 的 原 因 这种 行 为 不 是 默 认 的 随 后 可 以 调 用 c o m .m s. d l l . D ll L ib . g e t L a s t W in 3 2 E r ro r 方 法 来 检 索 错 误 代 码 每 个 Ja va 线 程 都 独 立 保 存 这 个 值
例 如 F indN e x t F i le 函 数 通 过 错 误 代 码 返 回 状 态 信 息 F indN e x t F i le 将声 明 如 下
/* * @ d l l.im p o r t (" K ER N E L3 2 " ,s e t La s t E rro r ) * /
s ta t ic n a t ive bo o lea n Fin d N ex t F ile( in t h F in d F il e , W IN 32_ FIN D _ D A T A w f d ) ;
典 型 的 调 用 如 下
im p o r t c o m . m s .d ll.D ll L ib ;
bo o lea n f = F in d N ext F ile ( h F ind File, w fd ) ; if ( ! f ) {
in t errorco d e = D ll L ib .g e t L a st W in3 2 E r ro r ( ) ;
}
动 态 加 载 和 调 用 D L L
有 时 可 能 需 要 比 @ d l l . im port 伪 指 令 正 常 提 供 的 更 多 控 件 来 控 制 加 载和 链 接 过 程 比 如 需 求 可 能 包 括
- 加 载
库 它 的 名 称 和 路 径 必 须 是 在 运 行 时 计 算 的 或 从 用 户 输 入 产 生
的
-
在 处
理 终 止 之 前 释 放 库
-
执
行 函 数 它 的 名 称 和 顺 序 必 须 在 运 行 时 计 算
W in3 2 A P Is 一 直 提 供 了 控 制 加 载 和 链 接 的 能 力 L o ad Lib rar y Loa d L ibra r y E x 和 F ree Lib rar y 函 数 显 式 控 制 D L L 的 加 载 和 释 放
G e t P ro c A ddre s s 函 数 允 许 链 接 到 特 定 的 出 口 G e t P ro c A d d re s s 函 数 返 回一 个 函 数 指 针 所 以 可 通 过 函 数 指 针 调 用 任 何 语 言 这 样 可 以 实 现 动态 调 用 而 毫 无 问 题
J /D i rect 允 许 Ja va 程 序 员 以 下 列 方 式 声 明 需 要 的 函 数
注 意 如 果 使 用 com.ms.Win 32 软 件 包 则 这 些 声 明 也 出 现 在Kernel32 类 中
/* * @ d l l.im p ort(" K E R N E L 3 2 " ,a uto)*/
p u b lic nativ e static in t L o ad L ib rary( S t r ing lp L ib F ileN am e);
/* * @ d l l . im port(" K E R N E L32 " , a u to) */
p u b lic nativ e static in t L o ad L ib raryE x ( S t r ing lp L ib F ileN a m e ,
in t h F i le , in t d w F la g s ) ;
/* * @ d l l.im p ort(" K E R N E L 3 2 " ,a uto) */
pu b lic n a t iv e s ta t ic boo lean F r e e L ib ra r y( in t nL ib M o d u le);
/* * @ d l l . im port(" K E R N E L32 " , a ns i) * /
p u b lic n a tiv e s ta t ic in t G etP ro c A d d r es s ( in t h M o d u le ,S trin g lp P ro c N a m e);
注 意 G e t P ro c A ddre s s 是 使 用 an s i 修 饰 符 而 不 是 au to 来 声 明 的 这 是因 为 G e t P ro c A ddre s s 是 少 数 几 个 不 带 等 效 的 U n ic ode 的 W ind ow s 函 数之 一 如 果 使 用 au to 修 饰 符 则 此 函 数 在 M ic rosoft W indow s 系 统 上 是失 败 的
调 用 函 数 唯 一 留 下 的 问 题 是 通 过 G e t P ro c A ddre s s 获 得 的 为 了 方 便 起见 m sja v a . d ll 实 现 M ic rosoft V M 的 D L L 导 出 名 为 ca l l 的 指 定 函 数ca l l 函 数 的 第 一 个 参 数 是 指 向 第 二 个 函 数 的 指 针 所 有 调 用 所 做 的 就 是调 用 第 二 个 函 数 把 它 传 递 给 其 余 参 数
下 面 是 关 于 应 用 程 序 如 何 加 载 D L L 和 通 过 D L L 调 出 A F u n c t io n 的 例 子
B O O L A func t ion( LP C S T R a rg u m e n t) ;
/* * @ d l l.im p ort(" m sja v a" )*/
s ta t ic n a t ive bo o lea n ca ll( in t fu ncptr, S t r in g a rg u m en t ) ;
in t hm od = L o a d L ibra r y( " … ");
in t fu nca d d r = G e t P ro c A d d res s ( hm o d , " A f u nctio n " ) ; b o o lea n r es u lt = ca l l(fu n ca d d r , " H ello ");
F ree L ib rary( h m od ) ;
J /D ire c t与 原 始 本 机 接 口 比 较
J /D r iect 与 原 始 本 机 接 口 RN I 是 互 补 的 技 术 使 用 RN I 要 求 D L L 函数 遵 循 严 格 的 命 名 约 定 要 求 D L L 函 数 可 以 与 Ja va 无 用 单 元 回 收 程 序
协 调 工 作 也 就 是 说 RN I 函 数 必 须 保 证 在 消 耗 时 间 的 代 码 起 始 yie ld 代 码 阻 塞 其 他 线 程 的 代 码 阻 塞 用 户 输 入 的 代 码 周 围 调 用 GC En a b le 和 GC D isa b le 在 Ja va 环 境 中 必 须 特 别 设 计 RN I 函 数 作 为 回 报 RN I 函 数 对 Ja va 对 象 内 部 和 Ja va 类 加 载 程 序 可 获 得 快 速 访 问
J /D i rect 使 用 现 有 代 码 诸 如 W in3 2 A P I 函 数 使 Ja va 链 接 此 函 数 不是 为 处 理 Ja va 无 用 单 元 回 收 和 Ja va 运 行 时 间 环 境 的 其 他 微 妙 的 区 别 而设 计 的 然 而 为 了 用 户 的 利 益 在 无 用 单 元 回 收 程 序 中 J /D i rect 自动 调 用 GC En a b le 以 便 可 以 调 用 阻 塞 或 执 行 UI 的 函 数 而 在 无 用 单 元回 收 中 没 有 不 好 的 影 响 另 外 J /D i rect 自 动 转 换 普 通 数 据 类 型 如 字符 串 和 结 构 为 C 函 数 通 常 的 格 式 于 是 就 可 以 不 必 写 很 长 的 代 码和 包 装 D L L s 折 衷 方 案 是 D L L 函 数 不 能 访 问 任 意 Ja va 对 象 字 段 和 方法 在 这 个 版 本 中 它 们 只 能 访 问 使 用 @ d l l . s t ru c t 伪 指 令 声 明 的 对 象 的字 段 和 方 法 J /D i rect 的 另 一 个 限 制 是 不 能 从 使 用 J /D i re c t 调 用 的 D L L 函 数 调 用 RN I 函 数 这 项 限 制 的 原 因 是 无 用 单 元 回 收 可 能 与 D L L 函 数并 行 运 行 所 以 任 何 通 过 RN I 函 数 返 回 的 或 通 过 D L L 函 数 操 纵 的 对象 句 柄 原 本 就 是 不 稳 定 的
幸 运 的 是 可 以 使 用 RN I 或 J / D irect 或 两 者 编 译 器 和 M ic rosoft V M
允 许 根 据 需 要 在 相 同 的 类 中 混 合 和 匹 配 J /D i rect 和 RN I
安 全 问 题
对 独 立 的 Ja va 应 用 程 序 和 信 任 的 内 部 网 W e b 应 用 程 序 来 说 尽 管 J /D i re c t
是 非 常 有 力 的 特 征 但 它 显 然 太 强 大 了 以 致 于 不 能 被 W e b 上 的 普 通 Ja va 小 应 用 程 序 使 用 本 节 描 述 J /D i rect 如 何 与 M ic rosoft V M 的 安 全 系 统 一起 防 止 不 被 信 任 的 代 码 错 误 地 访 问 J /D i rect 提 供 的 功 能
信 任 与 不 信 任 的 类
J /D i rect 把 所 有 加 载 的 类 分 成 了 两 种
-
完 全 信 任 指 出 了 最 大 权 限
-
不 信 任
只 有 完 全 信 任 的 类 才 允 许 使 用 J /D i rect 如 果 以 下 有 一 条 语 句 是 正 确 的则 认 为 Ja va 类 是 完 全 信 任 的
-
类
进 行 数 字 签 名 指 出 完 全 信 任 这 种 类 的 例 子 有 签 名 的 小 应 用 程 序
-
在 目 标 计 算 机 的 C L A S S P A T H 上 安 装 的 类 或 通 过 软 件 包 管 理 器 安装 的 类 为 在 多 个 小 应 用 程 序 之 间 共 享 而 设 计 的 数 字 签 名 库 必 须 遵 循这 项 准 则
-
使 用
JV IE W 或 W J V IE W 应 用 程 序 把 类 作 为 非 浏 览 器 应 用 程 序 来 运行
另 一 方 面 W e b 上 未 签 名 的 小 应 用 程 序 是 不 信 任 的 Ja va 代 码
J /D ire c t方 法 调 用 的 安 全 检 查 点
M ic rosoft V M 在 三 个 不 同 的 时 间 为 J /D i rect 方 法 应 用 安 全 检 查
-
连 接 时
-
第 一 次 调 用 时
-
每 次 调 用 时
只 有 在 传 递 任 意 三 个 安 全 检 查 中 的 一 个 或 显 式 禁 用 时 才 尝 试 J /D i re c t
调 用
链 接 时 的 安 全 检 查
当 Ja va 类 调 用 或 访 问 使 用 R e f le c t io n A P I 另 一 类 的 成 员 时 才 进 行链 接 在 链 接 时 M ic rosoft V M 查 看 引 用 的 类 是 否 是 可 访 问 的 传 递 参数 的 类 型 和 数 目 是 否 正 确 如 果 类 在 相 同 的 软 件 包 中 或 已 声 明 为 公 共的 则 认 为 此 类 是 可 访 问 的
使 用 标 准 的 Ja va 语 言 对 类 的 可 访 问 性 限 于 两 种 选 项 可 以 声 明 一个 公 共 的 类 每 个 人 都 可 链 接 到 它 或 声 明 不 带 有 公 共 修 饰 符 的 类 只有 在 相 同 软 件 包 中 的 类 才 能 链 接 到 它 然 而 使 用 M ic rosoft In te rn e t E xp lore r 4 .0 现 在 有 第 三 种 选 项 可 以 声 明 此 类 为 只 对 完 全 信 任 的 调用 程 序 为 公 共 的 使 用 这 种 可 访 问 性 类 型 可 以 声 明 任 何 类 即 使 此 类并 不 使 用 J /D i rect 为 了 声 明 此 类 需 在 类 的 开 头 放 置 如 下 伪 指 令
/* * @ s ecurit y ( ch eckC lassL in d in g = o n) */
重 要 的 是 要 注 意 这 种 安 全 检 查 只 防 止 不 信 任 的 调 用 程 序 直 接 调 用 保护 的 类 并 不 防 止 间 接 调 用 第 三 完 全 信 任 的 类 可 以 将 不 信 任 调用 程 序 的 调 用 转 发 到 保 护 的 类 然 而 这 是 一 种 防 护 措 施 中 间 类必 须 在 目 标 计 算 机 的 C L A S S P A T H 上 安 装 或 必 须 已 经 为 最 大 信 任 度进 行 数 字 签 名 并 使 用 浏 览 器 安 装
首 次 调 用 的 安 全 检 查
方 法 的 第 一 次 调 用 是 指 第 一 次 从 任 一 调 用 程 序 调 用 此 方 法 此 时 对 于本 机 关 键 字 所 标 记 的 任 何 一 种 方 法 M ic rosoft V M 确 定 此 方 法 是 否 为 完全 信 任 类 的 成 员 如 果 不 是 则 发 出 S e c u r ity E x c e p tio n 并 包 括 消 息 O n ly fu l ly trus te d c la ss c a n ha v e na t iv e m e th o d s a s m e m b e rs 只 有 完 全 信 任 的类 才 可 以 有 本 机 方 法 作 为 成 员 因 为 这 项 安 全 检 查 并 不 依 赖 于 调 用上 下 文 所 以 它 只 须 一 次 执 行 如 果 已 传 递 则 在 将 来 的 调 用 中 就 不 再进 行 检 查 这 里 没 有 方 法 来 禁 止 安 全 检 查
每 次 调 用 的 安 全 检 查
这 是 最 严 格 的 有 效 性 检 查 在 每 次 调 用 都 检 查 整 个 调 用 栈 即 使 在 调用 栈 上 发 现 调 用 程 序 不 是 完 全 信 任 的 也 发 出 S ecu r i ty E x cep t io n 默 认情 况 下 所 有 J /D i rect 方 法 都 执 行 这 项 检 查 RN I 方 法 不 执 行 这 项 检 查这 是 由 于 向 后 兼 容 的 需 要 RN I 的 设 计 允 许 从 原 始 JD K 1 . 0 本 机 接 口 很容 易 地 进 行 移 植 此 接 口 不 提 供 安 全 检 查
尽 管 此 安 全 检 查 提 供 了 最 大 的 安 全 性 M ic rosoft 也 提 供 了 一 种 禁 用 它
的 方 法 提 供 此 禁 止 机 制 是 因 为 严 格 的 安 全 检 查 有 两 点 副 作 用
可能 的 性 能 下 降 这 项 安 全 性 检查 需 要 在 每次调 用 J/ D ire c t 方法 时 扫 描 整 个 调用堆 栈 在 信 任 的 小 应用程 序上 性能 的 下 降最 为 显 著 它通常 是 用 现 有 的 安 全 性管理 器来 运行的 另一 方 面 应 用 程序 通 常看 不到 大 幅 性能 下 降 这是 由于 J / D i rect 对没 有安全管 理 器的 应 用 程序 忽略 了 堆 栈扫 描
in fle x ib ility 这个 安 全 机 制 强 制 使 用最大 权限 甚至 是 在 一些 情 况 下 只
需 要 特定 的权 限 例如 要考 虑使 用 J/ D ire c t 用安 全方 式 公布单 一 权 限 到 不 信 任 的小应 用程 序 对于 此库 来 说 应 当 关闭 调 用时 间安 全 检 查 特 征 并为 具体的 权 限 执行 自 己 的 安 全检查
@ se c u r i ty 伪 指 令 禁 用 每 次 调 用 的 安 全 检 查 句 法 如 下
/* * @ s ecurit y ( ch eckD llC a lls = o f f ) */
@ se c u r i ty 伪 指 令 应 用 于 整 个 类 在 类 中 不 能 标 记 单 个 方 法 下 例 显 示了 @ se c u r i ty 伪 指 令 的 使 用
/* * @ s ecurit y ( ch eckD llC a lls = o f f ) */ class F a st J D irect M e th o ds{
/ * * @ d ll.im p o rt(… ) */
s tatic nativ e vo id fu n c();
}
注 意 如 果 禁 用 这 项 安 全 检 查 会 将 M ic rosoft V M 的 安 全 性 责 任 转 换到 用 户 那 里 要 记 住 即 使 禁 止 了 安 全 性 检 查 对 于 最 大 信 任 的 类 仍然 必 须 数 字 签 名 如 果 决 定 使 用 这 条 伪 指 令 请 确 保 采 用 如 下 预 防 措 施
-
所 有
J /D i rect 方 法 都 已 声 明 为 专 用
-
任 何 公 共 可 访 问 的 方 法 都 不 能 盲 目 为 J /D i re c t 传 递 调 用 程 序 参 数 用户 必 须 负 责 保 证 只 有 有 效 的 参 数 可 以 传 递 到 本 机 代 码
-
类
公 布 的 能 力 不 应 当 多 于 需 要 的 能 力 应 当 通 过 适 当 的 安 全 检 查 防 止对 这 些 功 能 的 访 问
重 点 即 使 小 应 用 程 序 是 信 任 的 来 自 小 应 用 程 序 的 初 始 化 启 动停 止 或 撤 消 方 法 中 的 调 用 也 可 能 会 触 发 SecurityEx cePtionEx 为了 避 免 这 种 情 况 应 该 通 过 如 下 代 码 来 确 定 权 限
im p o r t co m . m s .s ecurit y .* ;
…
P o l ic y E n g in e .ass ert P er m ission( P er m ission ID .S Y S T E M ) ;
J /D ire c t结 构 的 安 全 检 查 点
J /D i rect 也 在 使 用 @ d l l . s t ru c t 伪 指 令 标 记 的 类 上 强 加 安 全 性 限 制 因 为在 例 示 结 构 时 此 结 构 是 不 安 全 的 所 以 这 些 安 全 性 检 查 要 比 J /D i rec t方 法 使 用 的 检 查 要 有 效 得 多 下 面 是 在 @ d l l . s t ru c t 类 上 执 行 的 两 种 安 全性 检 查
加 载 时间 只 有 在上 下 文 指出 完全 信 任 时 使用 @ d ll.s tru c t 伪指 令 标 记 的类才 加 载
链 接 时 间 非 完 全 信 任 的 代 码 不 能 链 接 到 使 用 @ d ll.s tru c t 伪 指 令 声 明 的类 如 果 已 经 作 出 了 尝 试 则 M ic ro s o ft V M 将 发 出 一 个N o C la s s D e f Fo un d E r ror
安 全 性 与 c o m .m s .W in 3 2 类
对 于 最 大 安 全 性 J /D i rect 方 法 在 c o m . m s . W in32 软 件 包 中 定 义 在 每 次调 用 时 都 执 行 调 用 的 堆 栈 检 查 如 果 正 使 用 这 些 Ja va 应 用 程 序 的 类 在V IEW 或 W J V IE W 下 运 行 则 性 能 开 销 是 可 以 忽 略 的 如 果 使 用 来自 信 任 类 的 c o m .m s. W in 3 2 类 并 要 求 最 大 性 能 则 应 该 把 需 要 的 J /D i re c t 声 明 拷 贝 到 自 己 的 类 中 并 禁 止 每 次 调 用 都 执 行 安 全 检 查 有 关 信 息 请参 看 本 章 前 面 的 每 次 调 用 时 的 安 全 检 查
错 误 信 息
当 使 用 J /D i rect 时 有 几 种 M ic rosoft V M 可 能 发 出 的 异 常 类 型 下 面 列出 每 一 项 运 行 期 间 的 错 误 导 致 错 误 信 息 的 原 因 以 及 解 决 方 案
-
J a v a .la n g .S e c u r i ty E x c e p t ion [ c la ss. m e
thod]
-
J a v a .lan g .Ille g a l A ccess E r ro r
-
J a v a .lan g .S e c u r i ty E x cep t io n
-
J a v a .la n g .N o C la s s D e f F oundE r ro r
-
C o m .m s .secu r i ty E x cep t io n E x
ja v a . la n g . S e c u r ity E x c e p tio n [ c la s s . m e th o d ]
异常 类 ja va .la n g .S ecu rity E x cep tio n
消息 c lass .m e th o d :O n ly fu lly trus te d c la s se d c a n have na tive me th o d s a s me m b e rs 只 有 完 全 信 任 的 类 可 以 具 有 本 机 方法作 为 成 员
可能 的 原 因 na t iv e 关键 字已 经在 方 法 上使 用 这个方 法是 不使用 完全权 限 加载 的类 的 成 员 例如 未 签 名 的 小应 用程 序 只有 在 尝试 调 用 本机 方式 时 再发 出此 异常
可能 的 解 决 方 案 数 字 签 名请 求完 全 权 限的 小应 用 程 序
Java . lan g . I lle g a lA cc es s E rr o r
异常 类 ja v a .la n g .Ille g a lA c c e ss E r ro r
消息 C las s has b e e n m a rk ed a s no n p u b lic to un tru s te d c o de
类 已 经对 不信 任 代 码标 记的 非 公 共的
可能 的 原 因 不 信 任 的 类 已经 尝 试 引 用 一 个 字段 或 另 一 个类的 方法 这个 类 已 经 标 记 为 只 能 信 任 使 用 在 co m .m s .c o m 和c o m .m s .d ll 软 件 包 中 许多 系统 类已经 以这 种方式 进行标记 了 对 不 信 任 代 码 类 可 以 以 如 下 方 式 使 用 @ se c u r ity 伪 指 令标 记 为 非公 共的
/* * @ se c urity ( c h e c k C la ss L in k in g= o n ) */
pu b lic c la ss F o r T ru s te d U se O n ly {
...
}
解 决 方法 数 字 签名 需 要 完全 权限 的 小 应用 程序
ja v a . la n g . S e c u r ity E x c e p tio n
异常 类 ja va .la n g .S ecu rity E x cep tio n
消息 J / D ire c t m e th od h a s n o t be e n a u th o riz e d fo r us e on be ha lf o f an un t ru s te d c a lle r J/ D i re c t 方法 未授 权 代 表不 信 任 的 调 用 程 序使用
可能 的 原 因 不 信 任 的类 已经 调 用 了一 个信 任 的 方 法 试图 生 成 J/ D i re c t 调用 即使 生 成 实际 J/ D ire c t 调用 的类 是 信 任 的 如果 调用 堆栈 中 的任 何 方 法属 于 不 信任 的 类 安 全 管 理 程序也 将发 出 一个 Se c u r ity E x c e p t io n
可能 的 解 决 方 案 数 字 签 名请 求完 全 权 限 的 小应 用程 序 或者 可以 禁用 安 全检查 方法 是使 用 @ se c u r ity 伪指 令标 记 尝 试 J/D ire c t 调用 的类 如下 例 所 示
/* * @ se c u rity ( c h e c k D llC a lls = o ff) * / pu b lic c lass S a fe D llC a lls {
...
}
注意 如 果 禁 用 这项 安全 检 查 则 为 J a v a 将 安全性 的责 任从 M i c ro so f t V M 传 递 给 用 户 要 记 住 即使 禁 用 了这 项 安全检 查 为了 最 大 信 任 还必 须对 这 类 进行 数 字 签 名 如果使 用 @s ecu rit y 伪 指 令 则 应 当保 证下 面 的 情形
-
所 有 的 J / Dir ec t 方 法 都 声 明 为 私 有 的
-
类 只 公布 客 户 需要 的功 能
-
类 可 以使 用 适 当的 安全 检 查 保护 对这 些功 能 的所有 访问
Java . lan g . N o C las s D e f F o u n d E rro r
异常 类 ja v a .la n g .N o C la ss D e f F o un dE r ror
消息 无
可能 的 原 因 不 信 任 的 类已经 尝试 加载使 用 @ d ll.s tru c t 伪 指 令标 记的类或 者 是 使 用 jactiv ex 工 具 生 成 的 类 尽 管 这 实际上 违反 了安全 性 不 是 类加 载程 序 的 错 误 为了 向 后 兼 容 的目 的要发 出 一 个 No C la s s D e f F o u n d E rro r
可能 的 解 决 方 案 数 字 签 名请 求完 全 权 限的 小应 用 程 序
c o m . m s . s e c u rity . S e c u rity E x c e p tio n E x
异常 类 c o m .m s .s e c u rity E x c e p t io n E x
消息 [ h os t ] J / D ire c t m e th o d h a s no t b e e n authoriz e d fo r u se on b e h a lf o f a n u n tru s te d c a lle r J/D ire c t 方法 未授 权 用 于代 表不 信 任的 调 用 程序
可 能 的 原 因 从 小 应 用 程 序 的 初 始 化 启 动 停 止 或 撤 消 方 法 来 尝 试
J/ D ire c t 调用
可能 的 解 决 方 案 执 行 下 面的 代码 来 声 明权 限
im p o r t c o m .m s .s e c u rity .* ;
...
P o lic y E n g in e .a sse rt P e rm is sio n ( P e rm iss io n ID .S Y S T E M );
故 障 排 除 提 示
这 一 节 描 述 了 使 用 J /D i rect 时 可 能 遇 到 的 问 题 对 每 一 种 情 况 都 提 供了 可 能 解 决 的 方 案
调 用 方 法 时 出 现 U n sa tis if ie d L in kE rro r
-
检 查 编 译 器 的 版 本 查 看 它 是 否 是 M ic rosoft V isu a l J+ + 的 当 前 版 本如 果 编 译 器 不 支 持 J /D i rect 则 M ic rosoft V M 将 试 图 使 用 R a w N a t iv e In te r fa c e 来 链 接 本 机 方 法 并 且 将 不 会 成 功
-
确
保 D L L 在 系 统 路 径 上 是 可 视 的 将 按 下 列 位 置 依 次 查 找 D L L s
-
来 自 加 载 的 应 用 程 序 的 目 录 通 常 为 JV IE W
-
当 前 目 录
-
W ind ow s 系 统 目 录
-
W ind ow s 目 录
-
PA T H 环 境 变 量 中 列 出 的 目 录
-
M ic rosoft V M 将 不 再 试 图 加 载 D L L 直 到 真 正 调 用 需 求 的 方 法 为 止然 而 不 能 只 因 为 Ja va 类 加 载 成 功 就 认 为 D L L 加 载 成 功
-
检 查 方 法 限 制 词 使 用 @ d l l . im port 伪 指 令 声 明 的 方 法 必 须 是 本 机 的而 且 是 静 态 的 它 们 可 以 拥 有 Ja va 语 言 支 持 的 任 何 访 问 级 别 公 共的 私 有 的 等 等
-
保
证 方 法 名 称 与 D L L 导 出 名 称 确 切 匹 配 包 括 大 小 写 W in 3 2 中 的
D L L 链 接 机 制 是 大 小 写 相 关 的
- 如
果 在 链 接 方 法 时 一 直 有 问 题 使 用 实 用 程 序 诸 如 dum pb in /e xport V isu a l C+ + 来 通 过 使 用 名 称 验 证 DL L 导 出 了 这 个 方 法 有 些 D L L
要 求 通 过 ord ina l 整 数 而 不 是 名 称 来 链 接 导 出 的 方 法 在 这 种 情 况中 在 方 法 上 使 用 入 口 点 超 越 如 下 例 所 示 使 用 #ord in a l 语 法
/ / T h is m e th o d is ex po r ted a s o rd in a l # 34.
/* * @ d l l.im p ort(" M yD ll" , en t r yp o in t= " # 3 4 ") */ p u b lic s ta tic n a t iv e v o id M y S a m p le();
- 要 知 道 所 谓 函 数 实 际 上 是 C 宏 并 且 实 际 D L L 导 出 名 可 能 完 全 不同 于 宏 名
调 用 D L L 方 法 或 使 用 @ d ll.s tru c t类 时 获 得 S e c u r ity E x c ep tio n
D L L 调 用 和 @ d l l . s t ru c t 类 的 使 用 限 于 Ja va 应 用 程 序 和 签 名 的 Ja v a 小 应用 程 序
从 D L L 函 数 的 返 回 上 截 断 S tr ingB u f fe rs
在 调 用 D L L 函 数 之 前 为 了 包 含 所 需 的 字 符 必 须 确 保 S r t ingB uffe r 的存 储 容 量 足 够 在 S r t ingB uffe r 的 构 造 器 中 可 以 指 定 容 量 并 且 可 以 在D L L 调 用 之 前 使 用 S r t in g B u ffe r.e n su re c a p a c ity 方 法 保 证 最 小 容 量
@ d ll伪 指 令 内 的 语 法 错 误
在 @ d l l . im port 和 @ d ll . s t ru c t 伪 指 令 内 的 额 外 空 格 将 会 导 致 语 法 错 误 在
@ d l l 内 部 要 避 免 使 用 空 格
编 译 器 没 有 找 到 c o m .m s .d ll软 件 包
可 以 使 用 旧 版 本 的 C la sse s.z ip 在 磁 盘 驱 动 器 上 重 装 V isu a l J + + 试 着保 留 所 有 C la sse s.z ip 的 旧 版 本
@ d ll伪 指 令 不 能 用 于 小 应 用 程 序 或 只 可 用 于 M ic ros o f t V is ual J + +
环 境
因 为 J /D i rect 使 用 的 安 全 性 是 折 衷 方 式 所 以 它 只 限 于 Ja v a 应 用 程 序和 签 名 的 Ja va 小 应 用 程 序
使 用 J /D ire ct 可 产 生 不 信 任 的 类
在 类 中 通 过 不 信 任 代 码 使 用 J /D i rect 都 会 导 致 类 成 为 不 安 全 的 或 者不 可 使 用 的 实 际 上 即 使 J /D i rect 方 法 也 不 调 用
在 调 用 本 机 函 数 之 后 J /D ire c t 抛 弃 了
P a ra m e te r C oun tM is m a tc h E r ro r
P a ra m e te r C oun t M ism a tc h E r ro r 异 常 会 警 告 用 户 被 调 用 函 数 消 耗 的 参 数用 堆 栈 比 J /D i rect 传 递 的 参 数 或 多 或 少 这 个错 误 通 常 指 出 在 Ja v a
方 法 中 声 明 的 参 数 与 D L L 函 数 期 望 的 参 数 是 不 匹 配 的
如 果 函 数 没 有 参 数 则 假 设 使 用 cd ec l 调 用 约 定 且 不 发 出 异 常 即 使 Ja v a
方 法 声 明 了 非 零 参 数
警 告 不 应 当 试 图 捕 获 和 处 理 ParameterC ountMismatchError 异常 异 常 是 为 了 辅 助 开 发 人 员 在 开 发 阶 段 捕 获 错 误 而 设 计 的 由 于性 能 的 原 因 只 有 当 应 用 程 序 是 在 Java 调 试 器 下 运 行 时 才 执 行参 数 的 计 数 检 查 在 函 数 调 用 完 成 后 记 下 J/Direct 执 行 了 这 次检 查 也 是 很 重 要 的 因 为 异 常 指 出 了 为 函 数 调 用 传 递 了 一 个 或 多 个无 效 参 数 所 以 它 不 能 保 证 此 进 程 可 以 恢 复
J /D ire c t不 能 卸 载 D L L
当 M ic rosoft V M 放 弃 了 导 入 D L L 的 Ja va 类 时 J /D i re c t 卸 载 D L L 对
于 运 行 在 JV IE W 下 的 Ja va 应 用 程 序 来 说 直 到 进 程 退 出 也 不 会 发 生这 种 情 况 对 于 信 任 的 Ja va 小 应 用 程 序 在 浏 览 器 离 开 了 包 含 小 应 用程 序 的 页 之 后 会 在 某 些 不 确 定 的 时 间 发 生 在 重 新 访 问 页 面 的 情 况 下为 了 优 化 小 应 用 程 序 的 刷 新 时 间 M ic rosoft V M 试 图 为 后 面 的 几 页 保 留已 加 载 的 Ja va 类
如 果 需 要 显 式 控 制 D L L 的 加 载 和 卸 载 就 必 须 显 式 调 用 W ind ow s 加 载程 序 并 使 用 调 用 入 口 点 来 自 动 调 用 函 数 关 于 如 何 做 这 些 的 详 细 信 息请 参 看 本 章 前 面 的 动 态 加 载 和 调 用 DL L s