使 用 V is u a l J + + 编 程

目 录

第 二 部 分 1

使 用 V isu a l J + + 编 程 1

第 11 章 W F C 编 程 基 础 5

使 用 控 件 和 模 板 开 始 6

简 单 的 预 演 1 0

代 码 列 表 3 0

第 12 章 W F C 编 程 概 念 4 5

W F C 软 件 包 4 6

处 理 W F C 事 件 5 7

本 机 化 应 用 程 序 6 2

使 用 W F C 应 用 程 序 服 务 6 4

使 用 具 有 W F C 的 Ja va 线 程 7 4

第 13 章 W F C 控 件 开 发 8 8

编 写 W F C 控 件 8 8

创 建 组 合 的 W F C 控 件 1 5 6

第 14 章 在 Ja va 中 编 制 动 态 H T M L 1 7 7

快 速 开 始 1 7 8

使 用 in it F o rm 方 法 1 8 1

理 解 D h E lem en t 类 1 8 2

使 用 包 容 器 1 8 3

处 理 事 件 1 8 6

使 用 动 态 样 式 1 8 8

使 用 动 态 表 1 9 2

在 服 务 器 上 使 用 c o m .m s. w fc .h tm l 软 件 包 1 9 8

第 15 章 图 形 服 务 器 2 0 6

创 建 G ra ph ic 对 象 2 0 7

检 索 G ra ph ic 对 象 2 0 9

G ra ph ic 对 象 作 用 域 2 0 9

维 护 边 框 矩 形 2 1 0

执 行 基 于 句 柄 的 操 作 2 1 2

G ra ph ic 对 象 坐 标 系 统 2 1 4

绘 制 文 本 2 1 7

使 用 F ont 对 象 2 1 8

使 用 笔 2 2 1

使 用 刷 子 2 2 5

绘 制 位 图 2 3 8

光 栅 操 作 2 4 0

绘 制 形 状 2 4 1

第 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

使 用 V is u a l J + + 编 程 - 图1别 名 方 法 重 命 名 使 用 V is u a l J + + 编 程 - 图2 ................................................................................. 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 使 用 V is u a l J + + 编 程 - 图3

R a p id A pp lic a t io n

D e v e lopm e n t RA D 使 用 V is u a l J + + 编 程 - 图4

工 具 配

合 使

用 的

类 库 集

RA D 工 具 的 配 合

使 用 V is u a l J + + 编 程 - 图5使 用 V is u a l J + + 编 程 - 图6使 用 V is u a l J + + 编 程 - 图7使 用 V is u a l J + + 编 程 - 图8使 用 V is u a l J + + 编 程 - 图9使 用 V is u a l J + + 编 程 - 图10使 用 V is u a l J + + 编 程 - 图11使 用 V is u a l J + + 编 程 - 图12使 用 V is u a l J + + 编 程 - 图13使 用 使 得 用 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 使 用 V is u a l J + + 编 程 - 图14 对 象 模 式 中 D H T M L 是 由 In te rn e t E xp lo re r 4 .0 支 持的 一 个 W 3 C 标 准 这 就 意 味 着 可 以 使 用 Ja va 来 解 决 当 前 的 一 些 实 际 问题 同 时 你 已 经 拥 有 一 条 通 向 未 来 的 坦 途

使 用 V is u a l J + + 编 程 - 图15使 用 V is u a l J + + 编 程 - 图16使 用 V is u a l J + + 编 程 - 图17使 用 V is u a l J + + 编 程 - 图18使 用 V is u a l J + + 编 程 - 图19W F C 的 目 的 是 为 Ja va 提 供 完 整 的 吸 引 人 的 组 件 和 编 程 模 式 这 是 因为 Ja va 有 一 种 在 语 言 方 面 独 特 的 优 势 使 用 这 种 新 的 编 程 模 型 来 开 发W ind ow s 和 D H T M L 的 应 用 程 序 Ja va 应 当 是 非 常 好 的 选 择

使 用 V is u a l J + + 编 程 - 图20使 用 V is u a l J + + 编 程 - 图21使 用 V is u a l J + + 编 程 - 图22使 用 V is u a l J + + 编 程 - 图23使 用 V is u a l J + + 编 程 - 图24使 用 V is u a l J + + 编 程 - 图25使 用 V is u a l J + + 编 程 - 图26使 用 V is u a l J + + 编 程 - 图27使 用 V is u a l J + + 编 程 - 图28使 用 V is u a l J + + 编 程 - 图29利 用 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 对 象 模 型

使 用 V is u a l J + + 编 程 - 图30使 用 V is u a l J + + 编 程 - 图31使 用 V is u a l J + + 编 程 - 图32使 用 V is u a l J + + 编 程 - 图33使 用 V is u a l J + + 编 程 - 图34丰 富 的 应 用 程 序 模 型 巧 妙 地 利 用 了 J /D i rect 技 术 访 问 W in 3 2 A P I 不 管怎 样 通 过 处 理 一 些 像 W ind ow s 消 息 处 理 过 程 消 息 转 储 消 息 窗

使 用 V is u a l J + + 编 程 - 图35使 用 V is u a l J + + 编 程 - 图36使 用 V is u a l J + + 编 程 - 图37使 用 V is u a l J + + 编 程 - 图38口 句 柄 等 细 节 它 会 使 编 程 更 容 易 应 用 程 序 模 型 是 开 放 式 的 因 此

使 用 V is u a l J + + 编 程 - 图39有 经 验 的 W in 3 2 程 序 员 能 将 J /D i rect 和 W F C 的 类 结 合 在 一 起 在 W in32

使 用 V is u a l J + + 编 程 - 图40平 台 中 安 装 任 何 有 效 的 功 能

使 用 V is u a l J + + 编 程 - 图41使 用 V is u a l J + + 编 程 - 图42使 用 V is u a l J + + 编 程 - 图43使 用 V is u a l J + + 编 程 - 图44使 用 V is u a l J + + 编 程 - 图45如 果 你 正 找 有 关 使 用 V isu a l J + + 来 开 发 W F C 应 用 程 序 的 快 捷 方 便 的 介绍 说 明 那 么 应 该 花 费 一 些 事 件 浏 览 本 书 第 1 章 中 的 使 用 W F C 创 建W ind ow s 应 用 程 序 一 节 它 能 够 一 步 步 地 教 你 建 立 和 运 行 简 单 的 W F C 应 用 程 序

使 用 控 件 和 模 板 开 始

使 用 V is u a l J + + 编 程 - 图46使 用 V is u a l J + + 编 程 - 图47使 用 V is u a l J + + 编 程 - 图48使 用 V is u a l J + + 编 程 - 图49使 用 V is u a l J + + 编 程 - 图50使 用 V is u a l J + + 编 程 - 图51使 用 V is u a l J + + 编 程 - 图52使 用 V is u a l J + + 编 程 - 图53使 用 V is u a l J + + 编 程 - 图54使 用 V is u a l J + + 编 程 - 图55W F C 组 件 模 型 中 的 一 个 功 能 就 是 V isu a l J + + 开 发 环 境 提 供 常 用 的 大 部 分组 件 窗 体 菜 单 和 对 话 框 这 些 组 件 通 常 可 以 满 足 需 要 或 者 用 户可 以 创 建 自 己 的 控 件 因 为 V isu a l J +

  • 提 供 了 在 W in 3 2 环 境 中 常 用 的 控件 所 以 对 于 V isu a l J +
  • 设 计 环 境 中 可 用 的 可 视 组 件 你 会 感 到 非 常熟 悉

使 用 V is u a l J + + 编 程 - 图56使 用 V is u a l J + + 编 程 - 图57使 用 V is u a l J + + 编 程 - 图58使 用 V is u a l J + + 编 程 - 图59V isu a l J + + 开 发 环 境 与 W F C 类 紧 密 集 成 因 此 大 部 分 使 用 控 件 窗 体和 菜 单 的 方 法 都 可 以 在 U s in g V is u a l J + + 中 找 到

使 用 窗 体 初 步

使 用 V is u a l J + + 编 程 - 图60使 用 V is u a l J + + 编 程 - 图61使 用 V is u a l J + + 编 程 - 图62使 用 V is u a l J + + 编 程 - 图63在 W F C 编 程 中 多 数 应 用 程 序 的 窗 口 作 为 窗 体 显 示 无 论 是 想 要 一 个单 独 的 叠 加 图 形 图 形 组 件 使 用 V is u a l J + + 编 程 - 图64 如 主 应 用 程 序 窗 口 使 用 V is u a l J + + 编 程 - 图65 或 对 话 框 都 可 以 使

使 用 V is u a l J + + 编 程 - 图66使 用 V is u a l J + + 编 程 - 图67使 用 V is u a l J + + 编 程 - 图68使 用 V is u a l J + + 编 程 - 图69使 用 V is u a l J + + 编 程 - 图70使 用 V is u a l J + + 编 程 - 图71使 用 V is u a l J + + 编 程 - 图72用 窗 体 窗 体 像 一 个 容 纳 控 件 的 容 器 可 以 使 用 户 以 可 视 的 方 式 编 写 应用 程 序 窗 体 具 有 自 己 的 属 性 这 些 属 性 可 以 在 P rope r t ie s 窗 口 中 设 定从 语 法 上 来 说 窗 体 是 c o m .m s. w fc .u i . F o rm 类 中 分 出 的 一 个 Ja va 类

使 用 V is u a l J + + 编 程 - 图73使 用 V is u a l J + + 编 程 - 图74使 用 V is u a l J + + 编 程 - 图75Fo rm s 类 展 开 c o m .m s. w fc .u i . C o n t ro l 类 窗 体 中 的 控 件 也 是 如 此 控 件封 装 了 一 个 W in 3 2 窗 口

使 用 V is u a l J + + 编 程 - 图76使 用 V is u a l J + + 编 程 - 图77使 用 V is u a l J + + 编 程 - 图78使 用 V is u a l J + + 编 程 - 图79使 用 V is u a l J + + 编 程 - 图80使 用 V is u a l J + + 编 程 - 图81当 建 立 新 的 项 目 时 并 且 从 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 添 加 项 使 用 V is u a l J + + 编 程 - 图82 或 A dd F o rm 添 加 窗 体 使 用 V is u a l J + + 编 程 - 图83 来 添 加 其 他 的 窗 体

  • 使 用 V is u a l J + + 编 程 - 图84使 用 V is u a l J + + 编 程 - 图85使 用 V is u a l J + + 编 程 - 图86使 用 V is u a l J + + 编 程 - 图87使 用 V is u a l J + + 编 程 - 图88使 用 V is u a l J + + 编 程 - 图89使 用 V is u a l J + + 编 程 - 图90使 用 V is u a l J + + 编 程 - 图91使 用 V is u a l J + + 编 程 - 图92旦 窗 体 已 经 在 项 目 中 创 建 用 户 可 以 在 设 计 模 式 中 或 在 Te x t 编 辑 器中 观 察 它 通 过 从 P ro je c t E x p lore r 中 窗 体 的 快 捷 菜 单 中 选 择 V ie w D e s ig n e r 查 看 设 计 器 使 用 V is u a l J + + 编 程 - 图93 可 以 使 用 F o rm s D e sig n e r 来 改 变 窗 体 的 大 小和 设 置 窗 体 的 属 性 每 个 窗 体 都 属 于 一 个 看 不 见 的 包 含 应 用 程 序 主 线程 的 A p p lic a tio n 对 象 窗 体 和 控 件 体 现 了 可 视 的 W ind ow s 组 件 这 种可 视 窗 口 和 非 可 视 窗 口 的 集 成 完 全 由 W F C 结 构 处 理

使 用 V is u a l J + + 编 程 - 图94使 用 V is u a l J + + 编 程 - 图95使 用 V is u a l J + + 编 程 - 图96当 用 户 在 新 的 窗 体 上 打 开 Te x t 编 辑 器 时 会 产 生 一 个 基 于 模 板 的 类它 包 含 必 要 的 Fo rm 类 语 法 包 括 一 个 构 造 器 和 一 个 带 有 实 例 化 窗 体 代

使 用 V is u a l J + + 编 程 - 图97使 用 V is u a l J + + 编 程 - 图98使 用 V is u a l J + + 编 程 - 图99使 用 V is u a l J + + 编 程 - 图100使 用 V is u a l J + + 编 程 - 图101使 用 V is u a l J + + 编 程 - 图102码 的 m a in ( ) 方 法 当 在 设 计 模 式 下 添 加 控 件 设 计 属 性 等 时 Fo rm s D e s ig n e r 插 入 并 修 改 类 中 相 应 的 部 分 参 阅 本 书 第 2 章 中 创 建 窗 体

  • 使 用 V is u a l J + + 编 程 - 图103节 来

    了 解 如 何 在 项 目 中 添 加 窗 体

添 加 控 件

使 用 V is u a l J + + 编 程 - 图104使 用 V is u a l J + + 编 程 - 图105使 用 V is u a l J + + 编 程 - 图106在 添 加 控 件 时 先 将 控 件 从 工 具 箱 中 拖 放 到 窗 体 上 调 整 好 大 小 然 后

使 用 V is u a l J + + 编 程 - 图107使 用 V is u a l J + + 编 程 - 图108使 用 V is u a l J + + 编 程 - 图109使 用 V is u a l J + + 编 程 - 图110使 用 V is u a l J + + 编 程 - 图111使 用 V is u a l J + + 编 程 - 图112在 P rope r t ie s 窗 口 中 设 置 属 性 在 V isu a l J + + 中 Ac t iv e X 和 W F C 控 件都 可 以 拖 放 到 窗 体 上 参 阅 第 2 章 中 的 添 加 控 件 的 窗 体 一 节 来 了 解如 何 将 控 件 从 工 具 箱 中 添 加 到 窗 体 上

使 用 V is u a l J + + 编 程 - 图113使 用 V is u a l J + + 编 程 - 图114W F C 控 件 可 分 为 三 类 在 使 用 时 这 三 种 控 件 没 有 区 别

  • 使 用 V is u a l J + + 编 程 - 图115使 用 V is u a l J + + 编 程 - 图116使 用 V is u a l J + + 编 程 - 图117使 用 V is u a l J + + 编 程 - 图118使 用 V is u a l J + + 编 程 - 图119使 用 V is u a l J + + 编 程 - 图120使 用 V is u a l J + + 编 程 - 图121In

    t rin s ic c o n tro ls 内 在 控 件 基 本 的 W ind ow s 控 件 如 按 钮 复 选框 编 辑 框 和 列 表 框 等

  • 使 用 V is u a l J + + 编 程 - 图122使 用 V is u a l J + + 编 程 - 图123使 用 V is u a l J + + 编 程 - 图124使 用 V is u a l J + + 编 程 - 图125使 用 V is u a l J + + 编 程 - 图126使 用 V is u a l J + + 编 程 - 图127使 用 V is u a l J + + 编 程 - 图128使 用 V is u a l J + + 编 程 - 图129C

    o m m on c on tro ls 公 共 控 件 可 以 在 c o m c t l 32 .d ll 中 找 到 的 W in 3 2 公 共 控 件 这 些 控 件 包 括 动 画 工 具 栏 选 项 卡 状 态 栏 和 T re e 查看 控 件 等

  • 使 用 V is u a l J + + 编 程 - 图130使 用 V is u a l J + + 编 程 - 图131使 用 V is u a l J + + 编 程 - 图132使 用 V is u a l J + + 编 程 - 图133W 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

使 用 V is u a l J + + 编 程 - 图134

使 用 V is u a l J + + 编 程 - 图135使 用 V is u a l J + + 编 程 - 图136使 用 V is u a l J + + 编 程 - 图137使 用 V is u a l J + + 编 程 - 图138使 用 V is u a l J + + 编 程 - 图139使 用 V is u a l J + + 编 程 - 图140使 用 V is u a l J + + 编 程 - 图141使 用 V is u a l J + + 编 程 - 图142如 果 愿 意 的 话 可 以 W F C 软 件 包 创 建 自 己 的 控 件 要 么 展 开 已 有 的 控件 或 者 编 写 自 己 的 窗 体 并 将 其 添 加 到 工 具 箱 中 利 用 W F C 组 件 模型 可 以 使 控 件 的 属 性 和 事 件 很 容 易 地 显 示 出 来 使 控 件 可 以 与 V isu a l J + + F o rm s D e sig n e r 紧 密 合 作

添 加 菜 单

使 用 V is u a l J + + 编 程 - 图143使 用 V is u a l J + + 编 程 - 图144使 用 V is u a l J + + 编 程 - 图145使 用 V is u a l J + + 编 程 - 图146菜 单 可 以 通 过 与 控 件 相 似 的 方 式 来 安 装 可 以 像 控 件 一 样 出 现 在 工 具 箱中 从 工 具 箱 中 拖 动 M a in M e n u 控 件 放 到 窗 体 上 来 添 加 菜 单 但 菜 单 放到 窗 体 上 之 后 可 以 通 过 输 入 的 方 式 在 Fo rm s D e s ig n e r 中 添 加 子 菜 单 和

使 用 V is u a l J + + 编 程 - 图147使 用 V is u a l J + + 编 程 - 图148使 用 V is u a l J + + 编 程 - 图149使 用 V is u a l J + + 编 程 - 图150使 用 V is u a l J + + 编 程 - 图151使 用 V is u a l J + + 编 程 - 图152使 用 V is u a l J + + 编 程 - 图153使 用 V is u a l J + + 编 程 - 图154使 用 V is u a l J + + 编 程 - 图155菜 单 项 每 个 菜 单 项 具 有 一 个 事 件 处 理 程 序 与 代 码 的 开 发 阶 段 相 联 系应 用 控 件 在 以 可 视 方 式 创 建 菜 单 时 菜 单 和 菜 单 选 项 的 所 有 实 现 代 码都 可 以 自 动 创 建 请 参 阅 本 书 的 第 2 章 中 创 建 窗 体 菜 单 一 节 来 获得 如 何 将 菜 单 添 加 到 窗 体 上 的 更 多 信 息

添 加 代 码

使 用 V is u a l J + + 编 程 - 图156使 用 V is u a l J + + 编 程 - 图157使 用 V is u a l J + + 编 程 - 图158使 用 V is u a l J + + 编 程 - 图159F o rm s D e sig n e r 帮 助 建 立 初 始 的 窗 体 类 并 提 供 许 多 像 事 件 处 理 程 序 这样 的 骨 架 代 码 但 是 有 些 时 候 需 要 编 写 代 码 来 使 程 序 执 行

使 用 V is u a l J + + 编 程 - 图160使 用 V is u a l J + + 编 程 - 图161使 用 V is u a l J + + 编 程 - 图162使 用 V is u a l J + + 编 程 - 图163使 用 V is u a l J + + 编 程 - 图164使 用 V is u a l J + + 编 程 - 图165使 用 V is u a l J + + 编 程 - 图166使 用 V is u a l J + + 编 程 - 图167使 用 V is u a l J + + 编 程 - 图168使 用 V is u a l J + + 编 程 - 图169使 用 V is u a l J + + 编 程 - 图170使 用 V is u a l J + + 编 程 - 图171使 用 V is u a l J + + 编 程 - 图172使 用 V is u a l J + + 编 程 - 图173当 某 一 事 件 从 窗 体 上 的 用 户 界 面 元 素 触 发 时 例 如 单 击 一 个 控 件 便 调用 事 件 处 理 程 序 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 将 事 件 处 理 程 序 挂 起 时 这 些 委 托 是 透 明的 在 更 高 级 的 方 案 中 可 以 直 接 使 用 它 们 例 如 源 于 自 己 的 事 件 由 于它 们 基 本 上 与 其 他 语 言 中 的 功 能 指 针 一 样 所 以 在 很 多 方 面 它 们 是 有 用的

使 用 V is u a l J + + 编 程 - 图174使 用 V is u a l J + + 编 程 - 图175除 了 控 件 和 事 件 处 理 程 序 外 W F C 库 中 其 他 许 多 部 分 也 是 很 有 用 的

  • 使 用 V is u a l J + + 编 程 - 图176使 用 V is u a l J + + 编 程 - 图177使 用 V is u a l J + + 编 程 - 图178使 用 V is u a l J + + 编 程 - 图179使 用 V is u a l J + + 编 程 - 图180G ra ph ic s supp ort 图 形 支 持 在 c o m .m s. w fc .u i 软 件 包 中 的 几 个 类包 括 用 来 提 供 访 问 W ind ow s 图 形 服 务 的 G ra ph ic s 类

  • 使 用 V is u a l J + + 编 程 - 图181使 用 V is u a l J + + 编 程 - 图182使 用 V is u a l J + + 编 程 - 图183使 用 V is u a l J + + 编 程 - 图184D

    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 或 更 高 版 本 使 用 V is u a l J + + 编 程 - 图185 访 问 到 DH T M L 对 象 模

使 用 V is u a l J + + 编 程 - 图186型 的 工 具

  • 使 用 V is u a l J + + 编 程 - 图187使 用 V is u a l J + + 编 程 - 图188使 用 V is u a l J + + 编 程 - 图189使 用 V is u a l J + + 编 程 - 图190使 用 V is u a l J + + 编 程 - 图191使 用 V is u a l J + + 编 程 - 图192使 用 V is u a l J + + 编 程 - 图193使 用 V is u a l J + + 编 程 - 图194D 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 数 据 对 象 使 用 V is u a l J + + 编 程 - 图195 组 件 来 支 持 简 单 和 复 杂 的 数据 绑 定 使 用 D a ta B inde r 组 件 用 户 可 以 从 一 个 记 录 集 中 绑 定 字 段 到任 何 W F C 组 件 的 属 性 上 W F C 还 提 供 其 他 的 复 杂 绑 定 组 件 用 来 直 接作 用 于 记 录 集

  • 使 用 V is u a l J + + 编 程 - 图196使 用 V is u a l J + + 编 程 - 图197使 用 V is u a l J + + 编 程 - 图198使 用 V is u a l J + + 编 程 - 图199使 用 V is u a l J + + 编 程 - 图200使 用 V is u a l J + + 编 程 - 图201使 用 V is u a l J + + 编 程 - 图202使 用 V is u a l J + + 编 程 - 图203使 用 V is u a l J + + 编 程 - 图204使 用 V is u a l J + + 编 程 - 图205Loc

    a l iz a t io n support 本 地 化 支 持 W F C 让 用 户 存 储 资 源 元 素 如字 符 串 字 体 和 位 图 到 资 源 文 件 中 而 且 这 个 资 源 文 件 符 合 特 定 的本 地 化 特 征 使 用 户 可 以 轻 松 地 进 行 本 地 化 代 码 操 作 这 样 就 可 以 简化 将 用 户 界 面 转 化 为 多 种 语 言 的 操 作

  • 使 用 V is u a l J + + 编 程 - 图206使 用 V is u a l J + + 编 程 - 图207使 用 V is u a l J + + 编 程 - 图208使 用 V is u a l J + + 编 程 - 图209使 用 V is u a l J + + 编 程 - 图210使 用 V is u a l J + + 编 程 - 图211D 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 使 用 V is u a l J + + 编 程 - 图212 W F C 建 立 在 J /D i rect 对 W in 3 2 库 的 调 用 层 上 在

使 用 V is u a l J + + 编 程 - 图213使 用 V is u a l J + + 编 程 - 图214使 用 V is u a l J + + 编 程 - 图215使 用 V is u a l J + + 编 程 - 图216使 用 V is u a l J + + 编 程 - 图217使 用 V is u a l J + + 编 程 - 图218使 用 V is u a l J + + 编 程 - 图219c o m .m s. w fc .W in 3 2 和 c o m .m s. w fc .O L E 3 2 软 件 包 中 的 工 具 使 用 V is u a l J + + 编 程 - 图220 因 此如 果 用 户 习 惯 了 标 准 的 W ind ow s 编 程 并 想 要 直 接 访 问 这 些 库 W F C 提 供 了 基 本 的 元 素 使 用 V is u a l J + + 编 程 - 图221 如 设 备 上 下 文 和 窗 口 句 柄 使 用 V is u a l J + + 编 程 - 图222 来 给 用 户 提 供 最 终 的控 件 这 些 在 一 些 特 殊 的 应 用 程 序 中 是 必 须 的 大 部 分 程 序 员 会 发 现W F C 的 服 务 是 充 足 的

简 单 的 预 演

使 用 V is u a l J + + 编 程 - 图223这 一 部 分 简 要 概 括 了 一 个 简 单 的 V isu a l J + + 应 用 程 序 这 个 程 序 以

使 用 V is u a l J + + 编 程 - 图224使 用 V is u a l J + + 编 程 - 图225使 用 V is u a l J + + 编 程 - 图226使 用 V is u a l J + + 编 程 - 图227使 用 V is u a l J + + 编 程 - 图228使 用 V is u a l J + + 编 程 - 图229W 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

使 用 V is u a l J + + 编 程 - 图230使 用 V is u a l J + + 编 程 - 图231使 用 V is u a l J + + 编 程 - 图232使 用 V is u a l J + + 编 程 - 图233使 用 V is u a l J + + 编 程 - 图234Sa v e A s 和 Ex i t 菜 单 项 它 包 括 了 编 辑 器 的 大 部 分 基 本 功 能 如 允 许 用户 打 开 文 件 进 行 编 辑 然 后 将 其 存 储 到 相 同 或 不 同 的 文 件 中 等

使 用 V is u a l J + + 编 程 - 图235

使 用 V is u a l J + + 编 程 - 图236使 用 V is u a l J + + 编 程 - 图237使 用 V is u a l J + + 编 程 - 图238使 用 V is u a l J + + 编 程 - 图239注 意 这 些 语 法 与 使 用 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 建 立 的

使 用 V is u a l J + + 编 程 - 图240使 用 V is u a l J + + 编 程 - 图241使 用 V is u a l J + + 编 程 - 图242使 用 V is u a l J + + 编 程 - 图243它 是 专 门 用 来 清 楚 地 演 示 几 个 基 本 概 念 的 当 用 户 创 建 了 M y N o te p a d 之 后 由 A p p lic a tio n W iz a rd 生 成 的 代 码 将 更 容 易 理 解 因 为 它 们 使 用了 许 多 共 同 的 原 理

使 用 V is u a l J + + 编 程 - 图244使 用 V is u a l J + + 编 程 - 图245使 用 V is u a l J + + 编 程 - 图246使 用 V is u a l J + + 编 程 - 图247使 用 V is u a l J + + 编 程 - 图248M y N o te p a d 本 质 上 是 由 带 有 编 辑 控 件 和 菜 单 组 成 的 单 独 的 窗 体 M y N o te pa d .ja v a 使 用 V is u a l J + + 编 程 - 图249 另 一 个 窗 体 N e wD ia lo g . ja v a 使 用 V is u a l J + + 编 程 - 图250 是 一 个 模 态 对 话 框 在 用 户 打 开 新 文 件 或 关 闭 当 前 文 件 时 它 提 示 用 户 进 行 保 存 在 本 章

使 用 V is u a l J + + 编 程 - 图251的 最 后 列 出 了 所 有 这 些 文 件 的 完 整 代 码

使 用 V is u a l J + + 编 程 - 图252使 用 V is u a l J + + 编 程 - 图253使 用 V is u a l J + + 编 程 - 图254使 用 V is u a l J + + 编 程 - 图255使 用 V is u a l J + + 编 程 - 图256使 用 V is u a l J + + 编 程 - 图257该 应 用 程 序 是 利 用 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 应 用 程 序编 程 的 几 个 基 本 概 念 它 特 别 介 绍 了

  • 使 用 V is u a l J + + 编 程 - 图258使 用 F o rm s D e sig n e r 来 创 建 应 用 程 序 窗 体

  • 使 用 V is u a l J + + 编 程 - 图259如 何 开 始 和 终 止 应 用 程 序

  • 使 用 V is u a l J + + 编 程 - 图260剖 析 了 V isu a l J + + F o rm s 模 板

  • 使 用 V is u a l J + + 编 程 - 图261如 何 处 理 事 件

  • 使 用 V is u a l J + + 编 程 - 图262如 何 打 开 模 态 对 话 框 和 检 索 用 户 的 结 果

  • 使 用 V is u a l J + + 编 程 - 图263如 何 使 用 O p e n F i le D ia lo g 和 S a v e F ile D ia lo g 类 来 处 理 文 件

  • 使 用 V is u a l J + + 编 程 - 图264使 用 V is u a l J + + 编 程 - 图265使 用 V is u a l J + + 编 程 - 图266如 何 使 用 用 于 文 件 输 入 /输 出 I/ O 的 F ile 流 类

使 用 V is u a l J + + 编 程 - 图267这 个 简 单 的 预 演 结 尾 附 有

  • 使 用 V is u a l J + + 编 程 - 图268简 单 预 演 摘 要

  • 使 用 V is u a l J + + 编 程 - 图269代 码 列 表

使 用 V is ual J + + 创 建 应 用 程 序

使 用 V is u a l J + + 编 程 - 图270使 用 V is u a l J + + 编 程 - 图271使 用 V is u a l J + + 编 程 - 图272这 一 部 分 的 内 容 将 介 绍 在 V isu a l J + + 中 创 建 M y N o te p a d 应 用 程 序 的 步骤 在 进 入 设 计 器 为 这 些 步 骤 生 成 的 代 码 之 前 先 浏 览 一 下 这 些 步 骤 是很 有 好 处 的

  1. 创 建 主 窗 体

使 用 V is u a l J + + 编 程 - 图273使 用 V is u a l J + + 编 程 - 图274使 用 V is u a l J + + 编 程 - 图275使 用 V is u a l J + + 编 程 - 图276使 用 V is u a l J + + 编 程 - 图277使 用 V is u a l J + + 编 程 - 图278使 用 V is u a l J + + 编 程 - 图279使 用 V is u a l J + + 编 程 - 图280使 用 V is u a l J + + 编 程 - 图281使 用 V is u a l J + + 编 程 - 图282可 以 使 用 第 一 次 打 开 V isu a l J + + 时 出 现 的 N e w P ro je c t 新 项 目 使 用 V is u a l J + + 编 程 - 图283 对 话框 或 是 从 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 使 用 V is u a l J + + 编 程 - 图284 并 且 选 择 O p e n V isu a l J + + 使 用 该 名 字 创 建 一 个 项 目该 项 目 默 认 包 含 一 个 名 为 Fo rm 1 . ja v a 的 窗 体 在 后 面 的 步 骤 中 将 要 把它 改 名 为 M y N o te p a d

使 用 V is u a l J + + 编 程 - 图285

  1. 添 加 控 件 和 菜 单 到 窗 体 中

使 用 V is u a l J + + 编 程 - 图286使 用 V is u a l J + + 编 程 - 图287使 用 V is u a l J + + 编 程 - 图288使 用 V is u a l J + + 编 程 - 图289使 用 V is u a l J + + 编 程 - 图290使 用 V is u a l J + + 编 程 - 图291使 用 V is u a l J + + 编 程 - 图292V 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 is u a l J + + 编 程 - 图293 或 者 从 快 捷 菜 单 中 选 择 V ie w D e s ig n e r 使 用 V is u a l J + + 编 程 - 图294 查 看 设 计 器 使 用 V is u a l J + + 编 程 - 图295 当 窗 体 显 示 时 用 户 可 以 从 工 具 箱 中 添 加 控 件 要

使 用 V is u a l J + + 编 程 - 图296使 用 V is u a l J + + 编 程 - 图297使 用 V is u a l J + + 编 程 - 图298使 用 V is u a l J + + 编 程 - 图299使 用 V is u a l J + + 编 程 - 图300访 问 在 工 具 箱 中 的 W F C 控 件 可 以 在 T oo lbox 选 项 卡 上 单 击 或 者从 V ie w 菜 单 中 选 择 T oo lbox 然 后 在 工 具 箱 中 单 击 W F C Co n tro l W F C 控 件 使 用 V is u a l J + + 编 程 - 图301 按 钮 来 显 示 这 些 控 件

使 用 V is u a l J + + 编 程 - 图302使 用 V is u a l J + + 编 程 - 图303对 于 这 个 例 子 来 说 一 个 编 辑 控 件 已 经 从 工 具 箱 中 添 加 到 窗 体 上

使 用 V is u a l J + + 编 程 - 图304使 用 V is u a l J + + 编 程 - 图305使 用 V is u a l J + + 编 程 - 图306使 用 V is u a l J + + 编 程 - 图307使 用 V is u a l J + + 编 程 - 图308添 加 菜 单 同 样 也 很 容 易 从 工 具 箱 中 拖 动 M ia n M e n u 控 件 到 窗 体 上并 且 将 它 放 到 一 个 地 方 然 后 在 第 一 个 框 中 开 始 输 入 并 在 该 框 的 下面 或 右 边 继 续 添 加 菜 单 项

使 用 V is u a l J + + 编 程 - 图309使 用 V is u a l J + + 编 程 - 图310使 用 V is u a l J + + 编 程 - 图311使 用 V is u a l J + + 编 程 - 图312使 用 V is u a l J + + 编 程 - 图313需 要 注 意 的 是 可 以 通 过 在 某 个 字 符 前 面 输 入 一 个 & 符 号 来 在 该菜 单 上 创 建 一 个 快 速 访 问 键 该 字 符 在 菜 单 上 变 为 下 划 线 显 示

使 用 V is u a l J + + 编 程 - 图314

  1. 在 窗 体 和 控 件 上 设 置 属 性

使 用 V is u a l J + + 编 程 - 图315使 用 V is u a l J + + 编 程 - 图316使 用 V is u a l J + + 编 程 - 图317使 用 V is u a l J + + 编 程 - 图318使 用 V is u a l J + + 编 程 - 图319使 用 P rope r t ie s 窗 口 设 置 属 性 在 这 种 情 况 下 为 了 方 便 起 见 许 多属 性 设 置 为 默 认 值 下 面 列 出 的 在 编 辑 控 件 上 的 属 性 被 改 变 了

使 用 V is u a l J + + 编 程 - 图320使 用 V is u a l J + + 编 程 - 图321使 用 V is u a l J + + 编 程 - 图322使 用 V is u a l J + + 编 程 - 图323m u l t il in e ( 多 行 ) 属 性 设 置 为 真 do c 文 档 使 用 V is u a l J + + 编 程 - 图324 属 性 设 置 为 F ill 填 充 使 用 V is u a l J + + 编 程 - 图325

使 用 V is u a l J + + 编 程 - 图326使 用 V is u a l J + + 编 程 - 图327使 用 V is u a l J + + 编 程 - 图328使 用 V is u a l J + + 编 程 - 图329使 用 V is u a l J + + 编 程 - 图330使 用 V is u a l J + + 编 程 - 图331使 用 V is u a l J + + 编 程 - 图332sc ro llB a rs 滚 动 条 使 用 V is u a l J + + 编 程 - 图333 属 性 设 置 为 V e rtic a l 垂 直 使 用 V is u a l J + + 编 程 - 图334 及 fo n t n a m e 字 体名 使 用 V is u a l J + + 编 程 - 图335 属 性 设 置 为 F ixe ds y s 用 来 更 好 地 模 仿 N o te p a d 在 窗 体 和 控 件中 可 能 还 有 用 户 想 要 设 置 的 其 他 属 性

使 用 V is u a l J + + 编 程 - 图336使 用 V is u a l J + + 编 程 - 图337使 用 V is u a l J + + 编 程 - 图338使 用 V is u a l J + + 编 程 - 图339使 用 V is u a l J + + 编 程 - 图340用 户 可 能 需 要 重 新 命 名 一 些 组 件 来 使 得 标 题 更 容 易 理 解 选 择 窗 体 或控 件 并 设 置 名 称 属 性 来 重 新 命 名 它 们 在 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

的 名 称

使 用 V is u a l J + + 编 程 - 图341使 用 V is u a l J + + 编 程 - 图342使 用 V is u a l J + + 编 程 - 图343使 用 V is u a l J + + 编 程 - 图344使 用 V is u a l J + + 编 程 - 图345使 用 V is u a l J + + 编 程 - 图346使 用 V is u a l J + + 编 程 - 图347使 用 V is u a l J + + 编 程 - 图348用 户 可 能 想 要 使 主 窗 体 的 名 称 不 是 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 重 命 名 使 用 V is u a l J + + 编 程 - 图349 然 后 键 入 新 的 名 称 在 这 里 为 M y N o te pa d .ja v a 使 用 V is u a l J + + 编 程 - 图350 这 样 重 命 名 操 作就 完 成 了

使 用 V is u a l J + + 编 程 - 图351使 用 V is u a l J + + 编 程 - 图352使 用 V is u a l J + + 编 程 - 图353使 用 V is u a l J + + 编 程 - 图354使 用 V is u a l J + + 编 程 - 图355使 用 V is u a l J + + 编 程 - 图356使 用 V is u a l J + + 编 程 - 图357如 果 改 变 名 称 记 住 必 须 将 源 代 码 中 出 现 的 所 有 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 查 看 代 码 使 用 V is u a l J + + 编 程 - 图358 来 打 开 源 代 码 文 件 从 Ed i t

使 用 V is u a l J + + 编 程 - 图359使 用 V is u a l J + + 编 程 - 图360使 用 V is u a l J + + 编 程 - 图361使 用 V is u a l J + + 编 程 - 图362使 用 V is u a l J + + 编 程 - 图363使 用 V is u a l J + + 编 程 - 图364菜 单 中 选 择 F ind a nd re p la c e 查 找 和 替 换 使 用 V is u a l J + + 编 程 - 图365 命 令 并 且 用 新 名 称 替换 Fo rm 1 的 所 有 实 例 例 如 将 Fo rm 1 替 换 为 M y N o te p a d 使 用 V is u a l J + + 编 程 - 图366

5. 创 建 对 话 框

使 用 V is u a l J + + 编 程 - 图367使 用 V is u a l J + + 编 程 - 图368使 用 V is u a l J + + 编 程 - 图369N e wD ia lo g 对 话 框 就 是 在 项 目 中 的 另 外 一 个 窗 体 从 P ro ject 菜 单 中选 择 A dd F o rm 在 A dd Ite m 对 话 框 中 选 择 Fo rm 输 入 新 窗 体 的 名 字

使 用 V is u a l J + + 编 程 - 图370使 用 V is u a l J + + 编 程 - 图371使 用 V is u a l J + + 编 程 - 图372在 这 里 为 N e wD ia lo g . ja v a 使 用 V is u a l J + + 编 程 - 图373 并 单 击 O p e n 来 创 建 另 外 的 窗 体

使 用 V is u a l J + + 编 程 - 图374使 用 V is u a l J + + 编 程 - 图375使 用 V is u a l J + + 编 程 - 图376使 用 V is u a l J + + 编 程 - 图377使 用 V is u a l J + + 编 程 - 图378使 用 V is u a l J + + 编 程 - 图379使 用 V is u a l J + + 编 程 - 图380使 用 V is u a l J + + 编 程 - 图381使 用 V is u a l J + + 编 程 - 图382使 用 V is u a l J + + 编 程 - 图383使 用 V is u a l J + + 编 程 - 图384使 用 V is u a l J + + 编 程 - 图385使 用 V is u a l J + + 编 程 - 图386使 用 V is u a l J + + 编 程 - 图387使 用 V is u a l J + + 编 程 - 图388使 用 V is u a l J + + 编 程 - 图389使 用 V is u a l J + + 编 程 - 图390在 这 种 情 况 下 添 加 了 三 个 按 钮 它 们 分 别 命 名 为 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 使 用 V is u a l J + + 编 程 - 图391 按钮 控 件 有 一 个 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

使 用 V is u a l J + + 编 程 - 图392使 用 V is u a l J + + 编 程 - 图393使 用 V is u a l J + + 编 程 - 图394使 用 V is u a l J + + 编 程 - 图395使 用 V is u a l J + + 编 程 - 图396使 用 V is u a l J + + 编 程 - 图397使 用 V is u a l J + + 编 程 - 图398使 用 V is u a l J + + 编 程 - 图399有 一 点 需 要 注 意 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 键 时 单 击 了 哪 一 个 按 钮 在 这 种 情 况 下 该

使 用 V is u a l J + + 编 程 - 图400属 性 设 置 到 C a n c e l B u tto n 控 件

使 用 V is u a l J + + 编 程 - 图401使 用 V is u a l J + + 编 程 - 图402使 用 V is u a l J + + 编 程 - 图403使 用 V is u a l J + + 编 程 - 图404使 用 V is u a l J + + 编 程 - 图405使 用 V is u a l J + + 编 程 - 图406使 用 V is u a l J + + 编 程 - 图407使 用 V is u a l J + + 编 程 - 图408同 样 按 钮 标 签 中 的 & 符 号 用 来 映 射 每 个 按 钮 的 特 定 键 例 如 由 于Y e s B u tto n 按 钮 的 标 签 是 & Y e s 所 以 按 Y 键 便 相 当 于 单 击 此 按钮 使 用 V is u a l J + + 编 程 - 图409

使 用 V is u a l J + + 编 程 - 图410使 用 V is u a l J + + 编 程 - 图411使 用 V is u a l J + + 编 程 - 图412使 用 V is u a l J + + 编 程 - 图413使 用 V is u a l J + + 编 程 - 图414随 后 添 加 两 个 附 加 的 标 签 控 件 用 来 显 示 该 对 话 框 的 消 息 文 本 最 后P ic ture B ox 控 件 添 加 到 窗 体 中 控 件 的 图 像 属 性 设 置 为 一 个 带 有 惊 叹号 的 位 图

使 用 V is u a l J + + 编 程 - 图415

使 用 V is u a l J + + 编 程 - 图416使 用 V is u a l J + + 编 程 - 图417使 用 V is u a l J + + 编 程 - 图418使 用 V is u a l J + + 编 程 - 图419使 用 V is u a l J + + 编 程 - 图420使 用 V is u a l J + + 编 程 - 图421使 用 V is u a l J + + 编 程 - 图422使 用 V is u a l J + + 编 程 - 图423使 用 V is u a l J + + 编 程 - 图424使 用 V is u a l J + + 编 程 - 图425使 用 V is u a l J + + 编 程 - 图426使 用 V is u a l J + + 编 程 - 图427使 用 V is u a l J + + 编 程 - 图428因 为 窗 体 中 添 加 了 一 个 图 像 所 以 当 保 存 窗 体 时 V isu a l J +

  • 自 动创 建 一 个 资 源 文 件 称 为 N e wD ia lo g . re s o u rc e s 使 用 V is u a l J + + 编 程 - 图429 并 且 将 图 像 放 到 该文 件 中 资 源 文 件 提 供 了 一 种 机 制 来 在 不 同 的 语 言 环 境 中 本 地 化 窗体 虽 然 在 这 种 情 况 下 它 大 部 分 用 于 进 行 打 包 用 户 还 可 以 设 置 窗体 的 本 地 化 属 性 为 真 以 便 使 资 源 文 件 添 加 到 项 目 中 在 这 种 情 况 下包 括 字 符 串 在 内 的 所 有 资 源 都 添 加 到 资 源 文 件 中

启 动 和 终 止 应 用 程 序

使 用 V is u a l J + + 编 程 - 图430使 用 V is u a l J + + 编 程 - 图431使 用 V is u a l J + + 编 程 - 图432使 用 V is u a l J + + 编 程 - 图433使 用 V is u a l J + + 编 程 - 图434使 用 V is u a l J + + 编 程 - 图435使 用 V is u a l J + + 编 程 - 图436使 用 V is u a l J + + 编 程 - 图437使 用 V is u a l J + + 编 程 - 图438使 用 V is u a l J + + 编 程 - 图439使 用 V is u a l J + + 编 程 - 图440使 用 V is u a l J + + 编 程 - 图441c 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 is u a l J + + 编 程 - 图442使 用 V is u a l J + + 编 程 - 图443使 用 V is u a l J + + 编 程 - 图444使 用 V is u a l J + + 编 程 - 图445使 用 V is u a l J + + 编 程 - 图446使 用 V is u a l J + + 编 程 - 图447使 用 V is u a l J + + 编 程 - 图448使 用 V is u a l J + + 编 程 - 图449使 用 V is u a l J + + 编 程 - 图450默 认 情 况 下 由 V isu a l J + + 模 板 创 建 的 基 本 应 用 程 序 使 用 在 应 用 程 序 右上 角 的 W ind ow s 退 出 按 钮 X 使 用 V is u a l J + + 编 程 - 图451 来 关 闭 但 是 用 户 可 以 在 代 码 中 的 任何 位 置 退 出 该 应 用 程 序 这 只 要 调 用 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 is u a l J + + 编 程 - 图452使 用 V is u a l J + + 编 程 - 图453使 用 V is u a l J + + 编 程 - 图454使 用 V is u a l J + + 编 程 - 图455使 用 V is u a l J + + 编 程 - 图456使 用 V is u a l J + + 编 程 - 图457使 用 V is u a l J + + 编 程 - 图458使 用 V is u a l J + + 编 程 - 图459上 面 介 绍 了 应 用 程 序 运 行 时 调 用 的 代 码 用 户 如 何 运 行 应 用 程 序 是 值 得一 提 的 V isu a l J + + 有 丰 富 的 配 置 特 性 其 中 一 个 就 是 用 来 创 建 W ind ow s 可 执 行 文 件 .e x e 使 用 V is u a l J + + 编 程 - 图460 允 许 用 户 以 与 其 他 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 + + 窗 体 模 板 的 剖 析

使 用 V is u a l J + + 编 程 - 图461使 用 V is u a l J + + 编 程 - 图462使 用 V is u a l J + + 编 程 - 图463使 用 V is u a l J + + 编 程 - 图464使 用 V is u a l J + + 编 程 - 图465使 用 V is u a l J + + 编 程 - 图466使 用 V is u a l J + + 编 程 - 图467使 用 V is u a l J + + 编 程 - 图468使 用 V is u a l J + + 编 程 - 图469基 本 的 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 应 用 程 序 中 应 用 程 序 名 就 放 在 这 里 使 用 V is u a l J + + 编 程 - 图470 虽 然 它 可 能 已 经 放 在 窗 体 的P rope r t ie s 窗 口 中 使 用 V is u a l J + + 编 程 - 图471 用 于 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 is u a l J + + 编 程 - 图472对 于 所 有 类 主 体 中 添 加 的 控 件 V isu a l J + + F o rm s D e s ig n e r 在 in it F o rm

使 用 V is u a l J + + 编 程 - 图473使 用 V is u a l J + + 编 程 - 图474使 用 V is u a l J + + 编 程 - 图475方 法 前 面 添 加 声 明 例 如 这 就 构 成 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 is u a l J + + 编 程 - 图476使 用 V is u a l J + + 编 程 - 图477使 用 V is u a l J + + 编 程 - 图478使 用 V is u a l J + + 编 程 - 图479使 用 V is u a l J + + 编 程 - 图480V 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 方 法 中 映 射 的 事件 处 理 程 序

使 用 V is u a l J + + 编 程 - 图481使 用 V is u a l J + + 编 程 - 图482使 用 V is u a l J + + 编 程 - 图483使 用 V is u a l J + + 编 程 - 图484在 in it F o rm 方 法 中 的 头 两 个 语 句 用 来 示 范 F o rm s D e sig n e r 如 何 设 置 对 象的 属 性 在 这 里 是 将 菜 单 项 的 Te x t 属 性 设 置 为 & N e w 使 用 V is u a l J + + 编 程 - 图485 和 使 用 对 象的 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 ) ) ;

处 理 事 件

使 用 V is u a l J + + 编 程 - 图486使 用 V is u a l J + + 编 程 - 图487使 用 V is u a l J + + 编 程 - 图488使 用 V is u a l J + + 编 程 - 图489使 用 V is u a l J + + 编 程 - 图490使 用 V is u a l J + + 编 程 - 图491使 用 V is u a l J + + 编 程 - 图492使 用 V is u a l J + + 编 程 - 图493使 用 V is u a l J + + 编 程 - 图494使 用 V is u a l J + + 编 程 - 图495M y N o te p a d 应 用 程 序 中 的 多 数 代 码 出 现 在 事 件 处 理 程 序 方 法 中 它 们 在单 击 菜 单 项 时 调 用 F o rm s D e sig n e r 通 过 窗 体 上 控 件 生 成 的 事 件 使 得用 户 可 以 很 容 易 地 创 建 骨 架 事 件 处 理 程 序 例 如 要 添 加 一 个 菜 单 单 击事 件 的 处 理 程 序 方 法 用 户 只 需 在 窗 体 上 双 击 该 菜 单 项 使 用 V is u a l J + + 编 程 - 图496 当 直 接 在 按 钮或 菜 单 项 上 双 击 时 会 产 生 单 击 事 件 处 理 程 序 也 可 以 使 用 在 P rope r t ie s 窗 口 中 的 E v e n ts 事 件 使 用 V is u a l J + + 编 程 - 图497 选 项 卡 来 轻 松 地 创 建 处 理 程 序 的 骨 架 代 码 使 用 V is u a l J + + 编 程 - 图498

使 用 V is u a l J + + 编 程 - 图499使 用 V is u a l J + + 编 程 - 图500F o rm s D e sig n e r 然 后 添 加 骨 架 事 件 处 理 方 法 在 其 中 可 以 添 加 代 码 窗

体 的 类 和 插 入 用 于 在 in it F o rm 中 适 当 M e n u Ite m 类 的

使 用 V is u a l J + + 编 程 - 图501M e nu Ite m . a ddO nC l ic k 调 用

使 用 V is u a l J + + 编 程 - 图502使 用 V is u a l J + + 编 程 - 图503使 用 V is u a l J + + 编 程 - 图504使 用 V is u a l J + + 编 程 - 图505使 用 V is u a l J + + 编 程 - 图506例 如 单 击 名 为 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 ) );

使 用 V is u a l J + + 编 程 - 图507使 用 V is u a l J + + 编 程 - 图508使 用 V is u a l J + + 编 程 - 图509使 用 V is u a l J + + 编 程 - 图510使 用 V is u a l J + + 编 程 - 图511M 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 对 象 监 视 鼠 标 单 击 并 当 事 件 发 生 时 调 用 每 个 事 件 处 理 程 序 添 加 到 其中

使 用 V is u a l J + + 编 程 - 图512使 用 V is u a l J + + 编 程 - 图513使 用 V is u a l J + + 编 程 - 图514使 用 V is u a l J + + 编 程 - 图515使 用 V is u a l J + + 编 程 - 图516使 用 V is u a l J + + 编 程 - 图517使 用 V is u a l J + + 编 程 - 图518使 用 V is u a l J + + 编 程 - 图519所 有 事 件 处 理 对 象 都 是 委 托 在 它 们 之 间 不 同 的 是 它 们 传 递 到 处 理 程序 的 事 件 对 象 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 包 含 一 个 附 加 的 字 段 指

使 用 V is u a l J + + 编 程 - 图520使 用 V is u a l J + + 编 程 - 图521使 用 V is u a l J + + 编 程 - 图522使 用 V is u a l J + + 编 程 - 图523使 用 V is u a l J + + 编 程 - 图524定 UN IC OD E 字 符 以 及 它 是 否 与 CT R L SH I F T 或 A L T 键 组 合 使 用 使 用 V is u a l J + + 编 程 - 图525多 数 W F C 程 序 员 不 需 要 知 道 多 少 有 关 委 托 的 知 识 因 为 事 件 处 理 程 序已 经 存 在 于 W F C 用 于 事 件 的 软 件 包 中 并 且 大 部 分 要 添 加 的 代 码 已 经由 F o rm s D e sig n e r 生 成

使 用 V is u a l J + + 编 程 - 图526使 用 V is u a l J + + 编 程 - 图527下 面 就 是 在 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 ” );

}

}

}

使 用 V is u a l J + + 编 程 - 图528使 用 V is u a l J + + 编 程 - 图529使 用 V is u a l J + + 编 程 - 图530当 然 F o rm s D e sig n e r 只 创 建 骨 架 事 件 处 理 程 序 打 开 定 制 模 态 对 话 框的 代 码 还 需 要 手 工 添 加

实 现 模 态 对 话 框

使 用 V is u a l J + + 编 程 - 图531使 用 V is u a l J + + 编 程 - 图532使 用 V is u a l J + + 编 程 - 图533使 用 V is u a l J + + 编 程 - 图534使 用 V is u a l J + + 编 程 - 图535使 用 V is u a l J + + 编 程 - 图536在 M y N o te p a d 应 用 程 序 中 用 户 单 击 在 F ile 菜 单 上 的 N e w 命 令 时 在该 事 件 处 理 程 序 中 的 代 码 检 测 是 否 在 编 辑 控 件 中 有 文 本 如 果 有 它 将打 开 一 个 模 态 对 话 框 显 示 询 问 用 户 是 否 保 存 该 文 本 的 消 息 如 果 用 户

使 用 V is u a l J + + 编 程 - 图537使 用 V is u a l J + + 编 程 - 图538使 用 V is u a l J + + 编 程 - 图539使 用 V is u a l J + + 编 程 - 图540使 用 V is u a l J + + 编 程 - 图541使 用 V is u a l J + + 编 程 - 图542使 用 V is u a l J + + 编 程 - 图543使 用 V is u a l J + + 编 程 - 图544使 用 V is u a l J + + 编 程 - 图545单 击 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

使 用 V is u a l J + + 编 程 - 图546使 用 V is u a l J + + 编 程 - 图547在 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 ) ;

使 用 V is u a l J + + 编 程 - 图548使 用 V is u a l J + + 编 程 - 图549使 用 V is u a l J + + 编 程 - 图550使 用 V is u a l J + + 编 程 - 图551使 用 V is u a l J + + 编 程 - 图552使 用 V is u a l J + + 编 程 - 图553使 用 V is u a l J + + 编 程 - 图554当 打 开 模 态 对 话 框 时 对 话 框 结 果 值 从 对 话 窗 体 中 设 置 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 值

使 用 V is u a l J + + 编 程 - 图555使 用 V is u a l J + + 编 程 - 图556使 用 V is u a l J + + 编 程 - 图557使 用 V is u a l J + + 编 程 - 图558使 用 V is u a l J + + 编 程 - 图559作 为 例 子 单 击 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 返回 的 整 数 结 果 随 后 用 来 检 测 下 一 步 的 动 作

使 用 V is u a l J + + 编 程 - 图560使 用 V is u a l J + + 编 程 - 图561使 用 V is u a l J + + 编 程 - 图562使 用 V is u a l J + + 编 程 - 图563使 用 V is u a l J + + 编 程 - 图564使 用 V is u a l J + + 编 程 - 图565使 用 V is u a l J + + 编 程 - 图566使 用 V is u a l J + + 编 程 - 图567N e wD ia lo g . ja v a 窗 体 使 用 同 主 应 用 程 序 窗 体 一 样 的 Fo rm 模 板 作 为 一个 新 的 窗 体 而 创 建 注 意 主 方 法 不 需 要 模 态 对 话 框 并 且 在 本 例 中 删除 使 用 V is u a l J + + 编 程 - 图568 将 其 留 下 来 不 会 导 致 错 误 但 也 不 是 良 好 的 编 程 风 格 使 用 V is u a l J + + 编 程 - 图569 还 有 要删 除 与 该 方 法 无 关 的 模 板 注 释

使 用 消 息 框 作 为 模 态 对 话 框

使 用 V is u a l J + + 编 程 - 图570使 用 V is u a l J + + 编 程 - 图571使 用 V is u a l J + + 编 程 - 图572在 简 单 的 情 况 下 用 户 还 可 以 使 用 消 息 框 来 代 替 定 制 模 态 对 话 框 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" ) ;

}

实 现 文 件 对 话 框 和 文 件 输 入 /输 出

使 用 V is u a l J + + 编 程 - 图573使 用 V is u a l J + + 编 程 - 图574使 用 V is u a l J + + 编 程 - 图575使 用 V is u a l J + + 编 程 - 图576使 用 V is u a l J + + 编 程 - 图577使 用 V is u a l J + + 编 程 - 图578在 这 个 应 用 程 序 中 我 们 所 关 心 的 其 余 代 码 有 用 来 操 作 文 件 输 入 / 输 出和 使 用 F ile O p e n 和 F ile S a v e 对 话 框 的 代 码 它 示 范 了 W F C 类 如 何 简化 了 定 位 打 开 读 取 和 写 入 文 件 的 操 作 下 面 简 要 介 绍 W F C 类 如 何做 这 些 工 作

使 用 V is u a l J + + 编 程 - 图579在 W F C 类 层 次 中 co m .m s . w fc .u i . O p en F i le D ialo g 和

使 用 V is u a l J + + 编 程 - 图580c 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

使 用 V is u a l J + + 编 程 - 图581使 用 V is u a l J + + 编 程 - 图582使 用 V is u a l J + + 编 程 - 图583使 用 V is u a l J + + 编 程 - 图584使 用 V is u a l J + + 编 程 - 图585F 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 方 法 来 运 行 这 些 对 话 框 允 许 用 户 为 打 开 或 保 存 的 文件 选 择 文 件 名

使 用 V is u a l J + + 编 程 - 图586c o m .m s. w fc .io 软 件 包 包 含 基 于 流 的 输 入 /输 出 类 扩 展 D a ta S t re a m 的 F ile

使 用 V is u a l J + + 编 程 - 图587使 用 V is u a l J + + 编 程 - 图588使 用 V is u a l J + + 编 程 - 图589使 用 V is u a l J + + 编 程 - 图590类 包 含 用 于 文 件 输 入 /输 出 的 方 法 在 M y N o te p a d 应 用 程 序 的 情 况 中需 要 所 有 这 些 来 打 开 文 件 将 它 们 都 读 入 到 编 辑 控 件 中 使 用 V is u a l J + + 编 程 - 图591 或 者 将 编 辑 控件 中 的 内 容 写 到 文 件 中 使 用 V is u a l J + + 编 程 - 图592 和 关 闭 文 件

使 用 V is u a l J + + 编 程 - 图593在 M y N o te p a d 应 用 程 序 中 所 有 的 输 入 /输 出 和 文 件 对 话 代 码 都 在 F ile

使 用 V is u a l J + + 编 程 - 图594使 用 V is u a l J + + 编 程 - 图595菜 单 上 的 O p e n Sa v e 和 Sa v e A s 的 事 件 处 理 方 法 中 我 们 将 只 注 意 其

使 用 V is u a l J + + 编 程 - 图596使 用 V is u a l J + + 编 程 - 图597使 用 V is u a l J + + 编 程 - 图598中 的 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 " );

}

}

使 用 V is u a l J + + 编 程 - 图599使 用 V is u a l J + + 编 程 - 图600使 用 V is u a l J + + 编 程 - 图601使 用 V is u a l J + + 编 程 - 图602使 用 V is u a l J + + 编 程 - 图603使 用 V is u a l J + + 编 程 - 图604使 用 V is u a l J + + 编 程 - 图605当 单 击 在 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 对 象 到 窗 体

使 用 V is u a l J + + 编 程 - 图606使 用 V is u a l J + + 编 程 - 图607使 用 V is u a l J + + 编 程 - 图608并 且 设 置 它 的 属 性 此 时 初 始 化 代 码 放 置 到 in it F o rm 方 法 中 使 用 V is u a l J + + 编 程 - 图609

使 用 V is u a l J + + 编 程 - 图610使 用 V is u a l J + + 编 程 - 图611使 用 V is u a l J + + 编 程 - 图612使 用 V is u a l J + + 编 程 - 图613使 用 V is u a l J + + 编 程 - 图614使 用 V is u a l J + + 编 程 - 图615使 用 V is u a l J + + 编 程 - 图616使 用 V is u a l J + + 编 程 - 图617使 用 V is u a l J + + 编 程 - 图618使 用 V is u a l J + + 编 程 - 图619使 用 V is u a l J + + 编 程 - 图620使 用 V is u a l J + + 编 程 - 图621使 用 V is u a l J + + 编 程 - 图622使 用 V is u a l J + + 编 程 - 图623使 用 V is u a l J + + 编 程 - 图624最 后 调 用 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 对 象 时 它 也 可 以 做 同 样 的 事 情

使 用 V is u a l J + + 编 程 - 图625F 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 ) ;

简 单 预 演 摘 要

使 用 V is u a l J + + 编 程 - 图626使 用 V is u a l J + + 编 程 - 图627使 用 V is u a l J + + 编 程 - 图628使 用 V is u a l J + + 编 程 - 图629使 用 V is u a l J + + 编 程 - 图630使 用 V is u a l J + + 编 程 - 图631这 样 简 短 的 教 程 不 可 能 覆 盖 每 个 应 用 程 序 概 念 即 使 是 对 M y N o te p a d 这 样 简 单 的 应 用 程 序 但 是 事 件 处 理 程 序 使 用 对 话 框 操 作 和 简 单 的文 件 输 入 / 输 出 的 概 念 却 是 多 数 应 用 程 序 所 公 用 的 并 且 是 它 们 的 主 要问 题

使 用 V is u a l J + + 编 程 - 图632使 用 V is u a l J + + 编 程 - 图633使 用 V is u a l J + + 编 程 - 图634使 用 V is u a l J + + 编 程 - 图635使 用 V is u a l J + + 编 程 - 图636使 用 V is u a l J + + 编 程 - 图637使 用 V is u a l J + + 编 程 - 图638使 用 V is u a l J + + 编 程 - 图639在 这 个 预 演 中 我 们 没 有 涉 及 Sa v e 和 Sa v e A s 菜 单 项 事 件 处 理 程 序 的代 码 但 是 这 些 代 码 使 用 同 样 的 原 理 这 将 在 其 他 地 方 讨 论 所 以当 看 到 列 表 时 不 要 感 到 惊 奇

使 用 V is u a l J + + 编 程 - 图640使 用 V is u a l J + + 编 程 - 图641使 用 V is u a l J + + 编 程 - 图642使 用 V is u a l J + + 编 程 - 图643使 用 V is u a l J + + 编 程 - 图644除 了 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 操 作 系统 时 这 将 提 供 相 当 好 的 性 能 和 可 用 性

使 用 V is u a l J + + 编 程 - 图645使 用 V is u a l J + + 编 程 - 图646使 用 V is u a l J + + 编 程 - 图647使 用 V is u a l J + + 编 程 - 图648使 用 V is u a l J + + 编 程 - 图649使 用 V is u a l J + + 编 程 - 图650使 用 V is u a l J + + 编 程 - 图651要 记 住 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 创 建 自 己 的 应 用 程 序 的 方 法

代 码 列 表

使 用 V is u a l J + + 编 程 - 图652下 面 列 出 的 代 码 提 供 了 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 编 程 概 念

使 用 V is u a l J + + 编 程 - 图653使 用 V is u a l J + + 编 程 - 图654使 用 V is u a l J + + 编 程 - 图655使 用 V is u a l J + + 编 程 - 图656使 用 V is u a l J + + 编 程 - 图657使 用 V is u a l J + + 编 程 - 图658使 用 V is u a l J + + 编 程 - 图659使 用 V is u a l J + + 编 程 - 图660使 用 V is u a l J + + 编 程 - 图661使 用 V is u a l J + + 编 程 - 图662使 用 V is u a l J + + 编 程 - 图663W ind ow s F ounda t ion C la sse s fo r J a v a W F C 使 用 V is u a l J + + 编 程 - 图664 提 供 了 一 种 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 软 件 包 和 类 的 结 构 背 后 的 结构 和 逻 辑

使 用 V is u a l J + + 编 程 - 图665使 用 V is u a l J + + 编 程 - 图666使 用 V is u a l J + + 编 程 - 图667使 用 V is u a l J + + 编 程 - 图668使 用 V is u a l J + + 编 程 - 图669使 用 V is u a l J + + 编 程 - 图670使 用 V is u a l J + + 编 程 - 图671使 用 V is u a l J + + 编 程 - 图672使 用 V is u a l J + + 编 程 - 图673这 一 章 的 目 的 是 为 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 的 库 时 你 就 会 想 知道 对 于 特 定 的 应 用 程 序 来 说 哪 些 软 件 包 和 库 是 重 要 的

使 用 V is u a l J + + 编 程 - 图674本 章 包 括 下 列 内 容

  • 使 用 V is u a l J + + 编 程 - 图675使 用 V is u a l J + + 编 程 - 图676使 用 V is u a l J + + 编 程 - 图677W

    F C 软 件 包 高 度 概 括 了 组 成 W F C 的 主 软 件 包

  • 使 用 V is u a l J + + 编 程 - 图678使 用 V is u a l J + + 编 程 - 图679使 用 V is u a l J + + 编 程 - 图680使 用 V is u a l J + + 编 程 - 图681使 用 V is u a l J + + 编 程 - 图682

    使 用 W F C 的 可 视 组 件 工 作 描 述 了 控 件 窗 体 和 W F C 中 的 图 形对 象 包 括 下 列 内 容

    • W ind ow s 可 视 组 件

    • D yn a m ic H T M L 可 视 组 件

  • 使 用 V is u a l J + + 编 程 - 图683使 用 V is u a l J + + 编 程 - 图684使 用 V is u a l J + + 编 程 - 图685

    W F C 中 处 理 事 件 描 述 了 处 理 事 件 的 委 托 的 作 用

  • 使 用 V is u a l J + + 编 程 - 图686使 用 V is u a l J + + 编 程 - 图687使 用 V is u a l J + + 编 程 - 图688

    本 地 化 应 用 程 序 描 述 了 V isu a l J + + 和 W F C 在 各 种 语 言 中 用 于 本地 化 应 用 程 序 的 支 持 和 方 法

  • 使 用 V is u a l J + + 编 程 - 图689使 用 V is u a l J + + 编 程 - 图690使 用 V is u a l J + + 编 程 - 图691 使 用 W F C 应 用 程 序 服 务 描 述 了 一 些 主 要 的 应 用 程 序 的 特 点 及 下列 一 些 内 容

    • 启 动 和 退 出 应 用 程 序

    • 处 理 应 用 程 序 事 件

    • 访 问 系 统 信 息

    • 执 行 剪 贴 板 和 拖 放 操 作

  • 使 用 V is u a l J + + 编 程 - 图692使 用 V is u a l J + + 编 程 - 图693使 用 V is u a l J + + 编 程 - 图694使 用 V is u a l J + + 编 程 - 图695

    使 用 W F C 和 Ja va 线 程 描 述 了 W F C 的 线 程 模 型 并 介 绍 了 如 下几 方 面 的 内 容

    • 混 合 Ja va 和 W in 3 2 的 线 程 模 型

    • 创 建 和 退 出 线 程

    • 使 用 线 程 存 储 器

    • 使 用 线 程 异 常

W F C 软 件 包

使 用 V is u a l J + + 编 程 - 图696W 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

使 用 V is u a l J + + 编 程 - 图697使 用 V is u a l J + + 编 程 - 图698编 程 模 型 它 能 使 用 户 通 过 使 用 Ja va 来 编 译 基 于 W ind ow s 的 应 用 程 序

使 用 V is u a l J + + 编 程 - 图699使 用 V is u a l J + + 编 程 - 图700使 用 V is u a l J + + 编 程 - 图701使 用 V is u a l J + + 编 程 - 图702这 些 应 用 程 序 利 用 了 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 页

使 用 V is u a l J + + 编 程 - 图703使 用 V is u a l J + + 编 程 - 图704使 用 V is u a l J + + 编 程 - 图705使 用 V is u a l J + + 编 程 - 图706使 用 V is u a l J + + 编 程 - 图707使 用 V is u a l J + + 编 程 - 图708使 用 V is u a l J + + 编 程 - 图709这 些 技 术 的 中 心 是 本 机 动 态 链 接 库 DL L s 使 用 V is u a l J + + 编 程 - 图710 它 提 供 了 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 组 件

使 用 V is u a l J + + 编 程 - 图711使 用 V is u a l J + + 编 程 - 图712使 用 V is u a l J + + 编 程 - 图713使 用 V is u a l J + + 编 程 - 图714J 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+ + 语 言 使 用 V is u a l J + + 编 程 - 图715 之 间 的 数 据 类 型 这 两 种 技 术 都 利 用 了 JV C 编 译 器

使 用 V is u a l J + + 编 程 - 图716和 M ic ro so f t V i r tu a l M a c h in e fo r Ja v a 的 内 建 支 持 和 协 作

使 用 V is u a l J + + 编 程 - 图717使 用 V is u a l J + + 编 程 - 图718使 用 V is u a l J + + 编 程 - 图719使 用 V is u a l J + + 编 程 - 图720使 用 V is u a l J + + 编 程 - 图721使 用 V is u a l J + + 编 程 - 图722使 用 V is u a l J + + 编 程 - 图723使 用 V is u a l J + + 编 程 - 图724了 解 这 些 是 很 重 要 的 因 为 几 个 软 件 包 都 是 由 CO M 打 包 类 由 J A c tiv e X 产 生 使 用 V is u a l J + + 编 程 - 图725 或 J /D i rect 类 组 成 这 些 类 具 有 直 接 映 射 基 本 AP I 的 方 法 在 W F C R e fe re n c e 中 没 有 说 明 它 们 因 为 通 常 它 们 不 能 直 接 访 问 但 是 对 于 其他 软 件 包 它 们 是 作 为 支 持 类 来 讨 论 的

使 用 V is u a l J + + 编 程 - 图726使 用 V is u a l J + + 编 程 - 图727使 用 V is u a l J + + 编 程 - 图728在 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+ + 窗体

使 用 V is u a l J + + 编 程 - 图729使 用 V is u a l J + + 编 程 - 图730使 用 V is u a l J + + 编 程 - 图731使 用 V is u a l J + + 编 程 - 图732使 用 V is u a l J + + 编 程 - 图733使 用 V is u a l J + + 编 程 - 图734使 用 V is u a l J + + 编 程 - 图735组 件 模板 使 用 这些 类的 服 务 除了 基本 的 W in d o w s 信息处 理 结 构 外 有适 合 W in d o w s 特点 的支 持 如剪 贴板 注册 表 线程 窗口 句柄 和 系 统 信 息等

使 用 V is u a l J + + 编 程 - 图736使 用 V is u a l J + + 编 程 - 图737使 用 V is u a l J + + 编 程 - 图738c o m .m s .w fc .c o re 组 件 模型 的基 类 这 个 软 件 包 支 持 包 容 器 事件 异

使 用 V is u a l J + + 编 程 - 图739使 用 V is u a l J + + 编 程 - 图740常 属性 以 及 与 V isu a l J+ + 特 征 相 互 操 作 的 基 础 设

使 用 V is u a l J + + 编 程 - 图741施 如 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

使 用 V is u a l J + + 编 程 - 图742使 用 V is u a l J + + 编 程 - 图743使 用 V is u a l J + + 编 程 - 图744AD O 使 用 V is u a l J + + 编 程 - 图745 Ja v a 类 该软 件包 还 包 括 c o m .m s .w fc .d a ta .u i

该软 件 包 提 供 了 W F C 中数 据绑 定 控 件的 基类

使 用 V is u a l J + + 编 程 - 图746c o m .m s .w fc .h tm l 用来 实 现 Ja v a 中的 D yn a m ic H T M L 类 这些 类 同 时

提 供 了客 户 端 和服 务器 端 的 支持

使 用 V is u a l J + + 编 程 - 图747使 用 V is u a l J + + 编 程 - 图748c o m .m s .w fc .io 用 来 访问 数据 流 实 现 完 整 的 数 据 包 用 于 读写串 行

使 用 V is u a l J + + 编 程 - 图749流 文件 访 问 和在 数据 流 的 不同 类型 之间 映 射

使 用 V is u a l J + + 编 程 - 图750c 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 的访 问

使 用 V is u a l J + + 编 程 - 图751c o m .m s .w fc .u til 用 于 各种 排序 窗体 实 现 哈 希 表 等 的 各 种 窗 体 的 实 用

程序 类

使 用 V is u a l J + + 编 程 - 图752下 面 是 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 的 可 视 组 件

使 用 V is u a l J + + 编 程 - 图753虽 然 W F C 中 的 W in 3 2 可 视 组 件 和 D y n a m ic H T M L D H T M L 使 用 V is u a l J + + 编 程 - 图754 应 用 程

使 用 V is u a l J + + 编 程 - 图755使 用 V is u a l J + + 编 程 - 图756使 用 V is u a l J + + 编 程 - 图757使 用 V is u a l J + + 编 程 - 图758使 用 V is u a l J + + 编 程 - 图759使 用 V is u a l J + + 编 程 - 图760使 用 V is u a l J + + 编 程 - 图761使 用 V is u a l J + + 编 程 - 图762使 用 V is u a l J + + 编 程 - 图763使 用 V is u a l J + + 编 程 - 图764使 用 V is u a l J + + 编 程 - 图765使 用 V is u a l J + + 编 程 - 图766使 用 V is u a l J + + 编 程 - 图767使 用 V is u a l J + + 编 程 - 图768使 用 V is u a l J + + 编 程 - 图769序 之 间 存 在 着 一 些 差 别 但 其 间 存 在 着 很 多 相 似 的 地 方 这 些 相 似 性 使得 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 类 使 用 V is u a l J + + 编 程 - 图770 字 体 颜 色 常 量 和 大 多 数 事 件 类 型 也 在

W in 3 2

和 D H T M L 模 型 中 共 享

当 然

每 一 种 模 型 也 存 在 着 特 殊 的 组 件

D H T M L

的 表 或

W in32

使 用 V is u a l J + + 编 程 - 图771使 用 V is u a l J + + 编 程 - 图772使 用 V is u a l J + + 编 程 - 图773件 的 列 表 查 看 控 件

使 用 V is u a l J + + 编 程 - 图774使 用 V is u a l J + + 编 程 - 图775使 用 V is u a l J + + 编 程 - 图776使 用 V is u a l J + + 编 程 - 图777使 用 V is u a l J + + 编 程 - 图778可 能 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 可 视 组 件

使 用 V is u a l J + + 编 程 - 图779使 用 V is u a l J + + 编 程 - 图780使 用 V is u a l J + + 编 程 - 图781使 用 V is u a l J + + 编 程 - 图782使 用 V is u a l J + + 编 程 - 图783使 用 V is u a l J + + 编 程 - 图784使 用 V is u a l J + + 编 程 - 图785使 用 V is u a l J + + 编 程 - 图786W 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 类 它 是 控 件 的 可 视 包 容 器

控 件 类

使 用 V is u a l J + + 编 程 - 图787使 用 V is u a l J + + 编 程 - 图788使 用 V is u a l J + + 编 程 - 图789控 件 类 中 包 含 控 制 W in 3 2 窗 口 所 有 必 需 的 基 本 属 性 方 法 和 逻 辑 这些 方 法 可 分 类 如 下

  • 使 用 V is u a l J + + 编 程 - 图790使 用 V is u a l J + + 编 程 - 图791使 用 V is u a l J + + 编 程 - 图792使 用 V is u a l J + + 编 程 - 图793使 用 V is u a l J + + 编 程 - 图794使 用 V is u a l J + + 编 程 - 图795使 用 V is u a l J + + 编 程 - 图796使 用 V is u a l J + + 编 程 - 图797使 用 V is u a l J + + 编 程 - 图798使 用 V is u a l J + + 编 程 - 图799使 用 V is u a l J + + 编 程 - 图800

    于 设 置 和 检 索 控 件 的 属 性 如 显 示 的 大 小 和 客 户 矩 形 前 景 色 背景 色 相 关 的 刷 子 光 标 文 本 字 体 位 置 等 的 方 法 这 些 方 法 具有 以 se t 或 ge t 开 头 的 名 字 如 se t B ru sh 和 Ge t B ru sh 使 用 V is u a l J + + 编 程 - 图801

  • 使 用 V is u a l J + + 编 程 - 图802使 用 V is u a l J + + 编 程 - 图803使 用 V is u a l J + + 编 程 - 图804使 用 V is u a l J + + 编 程 - 图805使 用 V is u a l J + + 编 程 - 图806使 用 V is u a l J + + 编 程 - 图807使 用 V is u a l J + + 编 程 - 图808使 用 V is u a l J + + 编 程 - 图809

    件 方 法 对 于 控 件 产 生 的 每 个 事 件 在 控 件 中 可 以 完 成 三 个 方 法 例 如 对 于 移 动 事 件 有 一 个 用 来 触 发 事 件 的 onM o v e 方 法 一 个 将事 件 处 理 程 序 分 配 给 移 动 事 件 的 a ddO nM ov e 方 法 和 一 个 删 除 事 件 处理 程 序 的 re m o ve O n M o ve 方 法 C on tro l 对 象 处 理 大 部 分 的 基 本 控 件事 件

  • 使 用 V is u a l J + + 编 程 - 图810使 用 V is u a l J + + 编 程 - 图811处 理 控 件 父 / 子 关 系 的 方 法 如 添 加 方 法 添 加 一 个 子 控 件 并 且

使 用 V is u a l J + + 编 程 - 图812使 用 V is u a l J + + 编 程 - 图813a ssig n P a re n t 和 ge t P a re n t 分 配 并 检 索 父 控 件 还 有 一 些 方 法 用 来 处 理子 控 件 的 数 组

  • 使 用 V is u a l J + + 编 程 - 图814使 用 V is u a l J + + 编 程 - 图815使 用 V is u a l J + + 编 程 - 图816使 用 V is u a l J + + 编 程 - 图817影 响 布 局 z- 次 序 绘 制 和 输 入 控 件 焦 点 的 方 法 如 brin g T o F ront

使 用 V is u a l J + + 编 程 - 图818使 用 V is u a l J + + 编 程 - 图819使 用 V is u a l J + + 编 程 - 图820使 用 V is u a l J + + 编 程 - 图821使 用 V is u a l J + + 编 程 - 图822使 用 V is u a l J + + 编 程 - 图823使 用 V is u a l J + + 编 程 - 图824使 用 V is u a l J + + 编 程 - 图825使 用 V is u a l J + + 编 程 - 图826se 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

  • 使 用 V is u a l J + + 编 程 - 图827使 用 V is u a l J + + 编 程 - 图828使 用 V is u a l J + + 编 程 - 图829使 用 V is u a l J + + 编 程 - 图830使 用 V is u a l J + + 编 程 - 图831使 用 V is u a l J + + 编 程 - 图832使 用 V is u a l J + + 编 程 - 图833使 用 V is u a l J + + 编 程 - 图834

    级 事 件 处 理 方 法 在 W in 3 2 级 W ind ow s 从 系 统 中 接 收 消 息 在控 件 类 中 每 一 个 输 入 到 控 件 的 消 息 都 有 一 个 保 护 的 进 程 方 法 使 用 V is u a l J + + 编 程 - 图835 例 如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 使 用 V is u a l J + + 编 程 - 图836 如 果扩 展 了 基 类 的 控 件 试 图 超 越 它 们 进 行 特 殊 处 理 这 些 方 法 是 非 常 重 要

使 用 V is u a l J + + 编 程 - 图837

  • 使 用 V is u a l J + + 编 程 - 图838使 用 V is u a l J + + 编 程 - 图839关 系 到 窗 口 处 理 消 息 和 线 程 启 动 的 方 法 这 些 方 法 对 于 编 制 过 W in 3 2

使 用 V is u a l J + + 编 程 - 图840使 用 V is u a l J + + 编 程 - 图841应 用 程 序 的 程 序 员 来 说 是 非 常 有 用 的 如 c re a te H a nd le

使 用 V is u a l J + + 编 程 - 图842使 用 V is u a l J + + 编 程 - 图843使 用 V is u a l J + + 编 程 - 图844使 用 V is u a l J + + 编 程 - 图845使 用 V is u a l J + + 编 程 - 图846使 用 V is u a l J + + 编 程 - 图847使 用 V is u a l J + + 编 程 - 图848使 用 V is u a l J + + 编 程 - 图849使 用 V is u a l J + + 编 程 - 图850de 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

使 用 V is u a l J + + 编 程 - 图851使 用 V is u a l J + + 编 程 - 图852控 件 类 扩 展 c o m .m s . w fc .c ore . C o m pone nt 类 它 是 所 有 W F C 组 件 的 基 类

使 用 窗 体

使 用 V is u a l J + + 编 程 - 图853窗 体 是 应 用 程 序 或 是 与 应 用 程 序 相 关 的 定 制 对 话 框 的 主 要 可 视 元 素

使 用 V is u a l J + + 编 程 - 图854c o m .m s. w fc .u i . F o rm 类 是 在 W F C 中 提 供 窗 体 的 基 础

使 用 V is u a l J + + 编 程 - 图855使 用 V is u a l J + + 编 程 - 图856使 用 V is u a l J + + 编 程 - 图857使 用 V is u a l J + + 编 程 - 图858使 用 V is u a l J + + 编 程 - 图859使 用 V is u a l J + + 编 程 - 图860使 用 V is u a l J + + 编 程 - 图861使 用 V is u a l J + + 编 程 - 图862使 用 V is u a l J + + 编 程 - 图863使 用 V is u a l J + + 编 程 - 图864使 用 V is u a l J + + 编 程 - 图865使 用 V is u a l J + + 编 程 - 图866使 用 V is u a l J + + 编 程 - 图867使 用 V is u a l J + + 编 程 - 图868使 用 V is u a l J + + 编 程 - 图869使 用 V is u a l J + + 编 程 - 图870使 用 V is u a l J + + 编 程 - 图871V 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 的 类 代 码 已 经 在 模 板 中 存 在 使 用 V is u a l J + + 编 程 - 图872 时 该 窗 体 运 行 更 多 信 息 见 本章 后 面 的 使 用 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 框 类 的 模 态 对 话 框 使 用 V is u a l J + + 编 程 - 图873 基 于 窗 体 的 非 模

使 用 V is u a l J + + 编 程 - 图874使 用 V is u a l J + + 编 程 - 图875态 定 制 对 话 框 可 以 通 过 调 用 窗 体 的 显 示 方 法 来 打 开 该 方 法 使 得 窗 体 可见

使 用 V is u a l J + + 编 程 - 图876使 用 V is u a l J + + 编 程 - 图877使 用 V is u a l J + + 编 程 - 图878Fo rm s 类 扩 展 c o m .m s. w fc .u i . C o n t ro l 所 以 它 具 有 所 有 的 C on tro l 方 法 加上 很 多 自 己 用 来 处 理 任 务 的 方 法 就 像 一 个 控 件 的 包 容 器 和 窗 口

使 用 V is u a l J + + 编 程 - 图879这 些 包 含 的 方 法 用 来

  • 使 用 V is u a l J + + 编 程 - 图880使 用 V is u a l J + + 编 程 - 图881使 用 V is u a l J + + 编 程 - 图882使 用 V is u a l J + + 编 程 - 图883使 用 V is u a l J + + 编 程 - 图884使 用 V is u a l J + + 编 程 - 图885使 用 V is u a l J + + 编 程 - 图886使 用 V is u a l J + + 编 程 - 图887使 用 V is u a l J + + 编 程 - 图888添 加 和 删 除 用 于 激 活 关 闭 结 束 使 无 效 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 事 件 的 处 理 程 序

  • 使 用 V is u a l J + + 编 程 - 图889使 用 V is u a l J + + 编 程 - 图890设 置 窗 体 的 窗 口 属 性 如 设 置 窗 体 的 初 始 大 小 或 可 视 状 态 开 始 位 置

使 用 V is u a l J + + 编 程 - 图891使 用 V is u a l J + + 编 程 - 图892使 用 V is u a l J + + 编 程 - 图893使 用 V is u a l J + + 编 程 - 图894和 边 界 样 式 或 者 用 来 检 测 窗 体 是 否 有 自 动 滚 动 条 控 制 框 或 最 小 化框 以 及 窗 体 图 标 是 否 在 任 务 栏 上

  • 使 用 V is u a l J + + 编 程 - 图895使 用 V is u a l J + + 编 程 - 图896使 用 V is u a l J + + 编 程 - 图897使 用 V is u a l J + + 编 程 - 图898使 用 V is u a l J + + 编 程 - 图899使 用 V is u a l J + + 编 程 - 图900使 用 V is u a l J + + 编 程 - 图901

    定 菜 单 控 件 或 其 他 放 在 窗 体 上 的 窗 体 的 关 系 如 设 置 主 菜 单 安排 控 件 支 持 多 文 档 界 面 M D I 使 用 V is u a l J + + 编 程 - 图902 窗 体 或 确 定 窗 体 是 否 接 收 所 有 的控 件 键 击 事 件

  • 使 用 V is u a l J + + 编 程 - 图903使 用 V is u a l J + + 编 程 - 图904使 用 V is u a l J + + 编 程 - 图905使 用 V is u a l J + + 编 程 - 图906使 用 V is u a l J + + 编 程 - 图907使 用 V is u a l J + + 编 程 - 图908使 用 V is u a l J + + 编 程 - 图909

    窗 体 作 为 模 态 对 话 框 使 用 时 设 置 属 性 并 且 当 窗 体 在 应 用 程 序 中时 运 行 和 检 索 对 话 框 中 的 结 果 它 包 括 的 方 法 用 来 设 置 对 话 框 上 的A ccep t C a n c e l 和 He lp 按 钮 启 动 对 话 框 和 设 置 并 检 索 由 模 态 对话 框 返 回 的 对 话 结 果 值

使 用 V is u a l J + + 编 程 - 图910使 用 V is u a l J + + 编 程 - 图911使 用 V is u a l J + + 编 程 - 图912所 列 出 方 法 并 不 全 面 但 是 可 以 全 面 了 解 什 么 是 窗 体 的 概 念 在

使 用 V is u a l J + + 编 程 - 图913使 用 V is u a l J + + 编 程 - 图914c o m .m s. w fc .u i 软 件 包 中 的 其 他 类 扩 展 窗 体 并 且 它 是 U s e r C on tro l 类

使 用 V is u a l J + + 编 程 - 图915U s e r C on tro l 是 用 来 创 建 自 己 复 合 的 基 于 Fo rm 的 控 件 用 户 可 以 将 其 安

使 用 V is u a l J + + 编 程 - 图916装 到 工 具 箱 中

W F C 控 件 一 览

使 用 V is u a l J + + 编 程 - 图917使 用 V is u a l J + + 编 程 - 图918使 用 V is u a l J + + 编 程 - 图919使 用 V is u a l J + + 编 程 - 图920使 用 V is u a l J + + 编 程 - 图921所 有 可 视 的 W F C 控 件 都 在 c o m .m s. w fc .u i 软 件 包 中 在 该 软 件 包 中 有 240 多 个 类 决 定 要 使 用 哪 个 类 是 很 困 难 的 幸 运 的 是 类 划 分 如 下 几 个 主要 的 分 类

  • 使 用 V is u a l J + + 编 程 - 图922在 V isu a l J + + 工 具 箱 中 并 且 直 接 扩 展 c o m . m s . w fc .u i C o n tro l 类 或 基 本上 源 于 C on tro l 类 的 是 控 件 的 类

  • 使 用 V is u a l J + + 编 程 - 图923使 用 V is u a l J + + 编 程 - 图924在 V isu a l J + + 工 具 箱 中 并 且 使 用 C o m m o n D ia lo g 作 为 基 类 包 括

使 用 V is u a l J + + 编 程 - 图925使 用 V is u a l J + + 编 程 - 图926C o m m onD ia lo g 类 自 身 使 用 V is u a l J + + 编 程 - 图927 的 是 控 件 的 类 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

  • 使 用 V is u a l J + + 编 程 - 图928使 用 V is u a l J + + 编 程 - 图929包 含 控 件 使 用 的 常 数 值 的 类 这 些 类 都 扩 展 c o m . m s . w fc .c ore .E num

  • 使 用 V is u a l J + + 编 程 - 图930使 用 V is u a l J + + 编 程 - 图931使 用 V is u a l J + + 编 程 - 图932表 示 事 件 并 扩 展 co m .m s . w fc .c o re .E v en t 或 是 事 件 处 理 程 序 类 委 托的 类

  • 使 用 V is u a l J + + 编 程 - 图933使 用 V is u a l J + + 编 程 - 图934使 用 V is u a l J + + 编 程 - 图935使 用 V is u a l J + + 编 程 - 图936使 用 V is u a l J + + 编 程 - 图937使 用 V is u a l J + + 编 程 - 图938使 用 V is u a l J + + 编 程 - 图939使 用 V is u a l J + + 编 程 - 图940使 用 V is u a l J + + 编 程 - 图941使 用 V is u a l J + + 编 程 - 图942使 用 V is u a l J + + 编 程 - 图943使 用 V is u a l J + + 编 程 - 图944使 用 V is u a l J + + 编 程 - 图945表 示 内 置 W ind ow s 图 形 对 象 如 刷 子 位 图 颜 色 字 体 画 笔调 色 板 图 标 区 域 和 图 像 等 的 类 有 关 如 何 使 用 这 些 对 象 的 消 息见 下 一 部 分 访 问 图 形 服 务

  • 使 用 V is u a l J + + 编 程 - 图946使 用 V is u a l J + + 编 程 - 图947使 用 V is u a l J + + 编 程 - 图948使 用 V is u a l J + + 编 程 - 图949使 用 V is u a l J + + 编 程 - 图950使 用 V is u a l J + + 编 程 - 图951使 用 V is u a l J + + 编 程 - 图952使 用 V is u a l J + + 编 程 - 图953使 用 V is u a l J + + 编 程 - 图954使 用 V is u a l J + + 编 程 - 图955

    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 使 用 V is u a l J + + 编 程 - 图956 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 使 用 V is u a l J + + 编 程 - 图957

  • 使 用 V is u a l J + + 编 程 - 图958用 来 打 包 其 他 W ind ow s 接 口 的 混 合 类 这 些 类 包 括 打 包 W ind ow s H e lp

使 用 V is u a l J + + 编 程 - 图959引 擎 的 He lp 打 包 浏 览 器 的 H T M L C on tro l 和 打 包 W ind ow s 消 息 框 的

使 用 V is u a l J + + 编 程 - 图960M e ss a g e B o x 等 等

使 用 V is u a l J + + 编 程 - 图961使 用 V is u a l J + + 编 程 - 图962下 面 列 出 的 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

使 用 V is u a l J + + 编 程 - 图963In te r le a v e d ( A V I) 动 画 文件 的 矩 形控 件

使 用 V is u a l J + + 编 程 - 图964Ax H o s t 打包 Ac t iv e X 控件 并且 将该 控 件 作为 W F C 控件 公布

Bu tto n 封装 W in d o w s 按钮 控件

使 用 V is u a l J + + 编 程 - 图965使 用 V is u a l J + + 编 程 - 图966Ch e c k b o x 封 装 W in d o w s 复选 框 控 件 该 控 件 是 一 个 用 来 选 择 或 清除选 项 的 标识 选 中 和放 弃选 中 的 标 签 框

C o m b oB ox 封装 W in d o w s 组合 框控 件

使 用 V is u a l J + + 编 程 - 图967D a ta T im e P ic k e r 封 装 W in d o w s 日期 和 时 间拾 取器 控 件 该 控 件 允 许 用 户指 定 日期 和 时 间消 息

使 用 V is u a l J + + 编 程 - 图968使 用 V is u a l J + + 编 程 - 图969Ed i t 封 装 W in d o w s 编辑 控 件 该 控 件 是 一 个 矩 形 控 件 用 户可 以 在其 中 输 入文 本

Fo rm 表 示 基本 的 顶 层窗 口

使 用 V is u a l J + + 编 程 - 图970G ro upB o x 封装 组 框 控 件 该控 件 是 包 含 其他 控件 的 矩 形 框

使 用 V is u a l J + + 编 程 - 图971La b e l 封 装 W in d o w s 标签 控 件 该 控 件 显 示 用 户 不 能 编 辑 的 文本串

使 用 V is u a l J + + 编 程 - 图972L is tB o x 封 装 W in d o w s 列表 框 控 件 该 控 件 显 示 用 户 可 以 在 其 中

使 用 V is u a l J + + 编 程 - 图973使 用 V is u a l J + + 编 程 - 图974选 择 一 个 或 多 个 项 的 列 表 L is t Ite m 在 该 类 中 使 用

Ch e c k e d L is tB o x 控件 扩展 该 类

使 用 V is u a l J + + 编 程 - 图975使 用 V is u a l J + + 编 程 - 图976L is t V ie w 封 装 W in d o w s 列表 查 看 控件 该 控 件 显 示 一 个 项 目 集每 个 都由 一 个 图标 使 用 V is u a l J + + 编 程 - 图977 来 自 图像 列表 使 用 V is u a l J + + 编 程 - 图978 和一 个 标签组 成

M D IC lie n t 表示 包 含 M D I 子窗 口的 窗 口

使 用 V is u a l J + + 编 程 - 图979使 用 V is u a l J + + 编 程 - 图980M o n th C a le n d a r 封 装 W in d o w s 月历 控 件 该 控 件 提 供 一 个 简 单 的 月 历 界面 在其 中 用 户可 以选 择 日 期

使 用 V is u a l J + + 编 程 - 图981Pa 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 控件

使 用 V is u a l J + + 编 程 - 图982P ro g re s s B a r 封装 W in d ow s P rog re ss B a r 控件 该 控 件 通 过 移 动 一 个 条来 动 态显 示 操 作的 进程

使 用 V is u a l J + + 编 程 - 图983使 用 V is u a l J + + 编 程 - 图984使 用 V is u a l J + + 编 程 - 图985R a d ioB utto n 封 装 W in d o w s 单选 或 选 项 按 钮 控 件 该 控 件 显 示 可以 被 选择 和 清 除的 选项

使 用 V is u a l J + + 编 程 - 图986使 用 V is u a l J + + 编 程 - 图987使 用 V is u a l J + + 编 程 - 图988使 用 V is u a l J + + 编 程 - 图989使 用 V is u a l J + + 编 程 - 图990Re 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 控件

使 用 V is u a l J + + 编 程 - 图991Sc ro llB a r 表 示 用于 滚 动 条控 件的 基 类 H S c ro llB a r 和 VS c ro llB a r 扩展 Sc ro llB a r

使 用 V is u a l J + + 编 程 - 图992Sp li t te r 封装 拆分 条控 件 该 控 件 允 许用 户在 运行时 重新 设 置 停 靠控件 的 大 小

使 用 V is u a l J + + 编 程 - 图993S ta tu s B a r 封装 W in d o w s 状态 栏控 件 该类 使用 S ta tus B a r P anel

使 用 V is u a l J + + 编 程 - 图994使 用 V is u a l J + + 编 程 - 图995使 用 V is u a l J + + 编 程 - 图996Ta b B a s e 定义 包含 T a b 类控 件的 公用功 能的 基类 Ta b C o n tro l 使用 Ta b P a ge 使 用 V is u a l J + + 编 程 - 图997 和 Ta b S tr ip 使用 Ta b Ite m 使 用 V is u a l J + + 编 程 - 图998 扩 展该类

使 用 V is u a l J + + 编 程 - 图999T oo lB a r 封装 T oo lB a r 定制 控件 该类 使 用 T o o lba r B u tto n

使 用 V is u a l J + + 编 程 - 图1000使 用 V is u a l J + + 编 程 - 图1001使 用 V is u a l J + + 编 程 - 图1002T rac k B ar 封 装 W in d o w s 轨迹 条 控 件 也就 是 滑 块 控 件 该 控 件包 含 一个 用 来 在范 围中 选 择 值的 滑块

使 用 V is u a l J + + 编 程 - 图1003使 用 V is u a l J + + 编 程 - 图1004T re e V ie w 封装 W in d o w s 树形 视图 控 件 该类 使 用 T re e N o d e Up D o w n 封 装 上下 箭 头 控件 有 些 情况 下称 为 微 调控 件 使 用 V is u a l J + + 编 程 - 图1005

访 问 图 形 服 务

使 用 V is u a l J + + 编 程 - 图1006使 用 V is u a l J + + 编 程 - 图1007使 用 V is u a l J + + 编 程 - 图1008使 用 V is u a l J + + 编 程 - 图1009使 用 V is u a l J + + 编 程 - 图1010使 用 V is u a l J + + 编 程 - 图1011使 用 V is u a l J + + 编 程 - 图1012在 W F C 环 境 中 应 用 程 序 通 过 使 用 G ra ph ic s 对 象 执 行 图 形 操 作 这 些对 象 封 装 了 W ind ow s 操 作 系 统 本 身 的 绘 图 能 力 这 些 对 象 对 于 一 般 的绘 图 操 作 提 供 了 灵 活 的 支 持 包 括 显 示 图 像 和 图 标 还 有 画 线 画 多 边形 及 输 入 文 本 等

使 用 V is u a l J + + 编 程 - 图1013使 用 V is u a l J + + 编 程 - 图1014使 用 V is u a l J + + 编 程 - 图1015使 用 V is u a l J + + 编 程 - 图1016使 用 V is u a l J + + 编 程 - 图1017图 形 对 象 通 过 打 包 W ind ow s 设 备 上 下 文 来 执 行 它 的 工 作 W in d o w s 设备 上 下 文 是 定 义 系 统 图 形 对 象 关 联 的 属 性 以 及 影 响 设 备 输 出 的 图 形 模式 的 系 统 数 据 结 构 因 为 用 户 可 以 检 索 作 为 G ra ph ic s 对 象 基 础 的 设 备上 下 文 所 以 可 以 将 W in 3 2 绘 图 程 序 与 G ra ph ic s 对 象 合 作 使 用

使 用 V is u a l J + + 编 程 - 图1018使 用 V is u a l J + + 编 程 - 图1019使 用 V is u a l J + + 编 程 - 图1020使 用 V is u a l J + + 编 程 - 图1021使 用 V is u a l J + + 编 程 - 图1022使 用 V is u a l J + + 编 程 - 图1023所 有 扩 展 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 对 象

使 用 V is u a l J + + 编 程 - 图1024使 用 V is u a l J + + 编 程 - 图1025有 关 如 何 使 用 对 象 的 消 息 见 本 书 第 15 章

动 态 HT M L 可 视 组 件

使 用 V is u a l J + + 编 程 - 图1026使 用 V is u a l J + + 编 程 - 图1027使 用 V is u a l J + + 编 程 - 图1028使 用 V is u a l J + + 编 程 - 图1029使 用 V is u a l J + + 编 程 - 图1030使 用 V is u a l J + + 编 程 - 图1031使 用 V is u a l J + + 编 程 - 图1032使 用 V is u a l J + + 编 程 - 图1033使 用 V is u a l J + + 编 程 - 图1034使 用 V is u a l J + + 编 程 - 图1035使 用 V is u a l J + + 编 程 - 图1036使 用 V is u a l J + + 编 程 - 图1037使 用 V is u a l J + + 编 程 - 图1038使 用 V is u a l J + + 编 程 - 图1039D 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

使 用 V is u a l J + + 编 程 - 图1040使 用 V is u a l J + + 编 程 - 图1041使 用 V is u a l J + + 编 程 - 图1042使 用 V is u a l J + + 编 程 - 图1043使 用 V is u a l J + + 编 程 - 图1044使 用 V is u a l J + + 编 程 - 图1045使 用 V is u a l J + + 编 程 - 图1046使 用 V is u a l J + + 编 程 - 图1047使 用 V is u a l J + + 编 程 - 图1048使 用 V is u a l J + + 编 程 - 图1049使 用 V is u a l J + + 编 程 - 图1050使 用 V is u a l J + + 编 程 - 图1051使 用 V is u a l J + + 编 程 - 图1052W F C 控 件 的 这 两 种 设 置 W in 3 2 和 D y n a m ic H T M L 使 用 V is u a l J + + 编 程 - 图1053 有 一 些 相 似 因为 它 们 最 终 都 是 源 于 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 方 法 将 所 有 组 件 添 加 到 它 们的 父 包 容 器 中

使 用 V is u a l J + + 编 程 - 图1054使 用 V is u a l J + + 编 程 - 图1055要 更 好 地 理 解 如 何 使 用 c o m .m s. w fc .h tm l 软 件 包 见 本 书 第 14 章

处 理 W F C 事 件

使 用 V is u a l J + + 编 程 - 图1056使 用 V is u a l J + + 编 程 - 图1057使 用 V is u a l J + + 编 程 - 图1058使 用 V is u a l J + + 编 程 - 图1059C on tro l 基 类 和 扩 展 它 的 类 如 按 钮 和 编 辑 框 会 遇 到 如 c lic k ke y P re ss

使 用 V is u a l J + + 编 程 - 图1060使 用 V is u a l J + + 编 程 - 图1061使 用 V is u a l J + + 编 程 - 图1062使 用 V is u a l J + + 编 程 - 图1063使 用 V is u a l J + + 编 程 - 图1064使 用 V is u a l J + + 编 程 - 图1065使 用 V is u a l J + + 编 程 - 图1066使 用 V is u a l J + + 编 程 - 图1067使 用 V is u a l J + + 编 程 - 图1068使 用 V is u a l J + + 编 程 - 图1069使 用 V is u a l J + + 编 程 - 图1070使 用 V is u a l J + + 编 程 - 图1071使 用 V is u a l J + + 编 程 - 图1072使 用 V is u a l J + + 编 程 - 图1073m 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 代 码 的 细 节 它 也 是 很 有 用 的 这 一 部 分 提 供 了 一 些 有 关 委 托 的 背 景 资料 然 后 介 绍 处 理 事 件 的 实 际 情 况

使 用 V is u a l J + + 编 程 - 图1074使 用 V is u a l J + + 编 程 - 图1075使 用 V is u a l J + + 编 程 - 图1076使 用 V is u a l J + + 编 程 - 图1077使 用 V is u a l J + + 编 程 - 图1078使 用 V is u a l J + + 编 程 - 图1079使 用 V is u a l J + + 编 程 - 图1080使 用 V is u a l J + + 编 程 - 图1081使 用 V is u a l J + + 编 程 - 图1082使 用 V is u a l J + + 编 程 - 图1083使 用 V is u a l J + + 编 程 - 图1084使 用 V is u a l J + + 编 程 - 图1085使 用 V is u a l J + + 编 程 - 图1086使 用 V is u a l J + + 编 程 - 图1087使 用 V is u a l J + + 编 程 - 图1088使 用 V is u a l J + + 编 程 - 图1089使 用 V is u a l J + + 编 程 - 图1090使 用 V is u a l J + + 编 程 - 图1091使 用 V is u a l J + + 编 程 - 图1092使 用 V is u a l J + + 编 程 - 图1093什 么 是 委 托 委 托 声 明 定 义 一 个 扩 展 c o m .m s. la n g . D e le g a te 的 类 JV C 编 译 器 也 将 委 托 d e le g a te 使 用 V is u a l J + + 编 程 - 图1094 作 为 一 个 关 键 字 来 识 别 提 供 创 建 基 于 委托 的 类 的 快 捷 方 式 委 托 实 例 可 以 调 用 有 关 对 象 的 方 法 并 且 传 递 数 据到 该 方 法 更 重 要 的 是 委 托 与 它 引 用 的 对 象 隔 离 开 来 并 且 不 需 要 知道 有 关 它 的 任 何 事 情 那 么 对 于 匿 名 调 用 来 说 它 是 很 理 想 的 在 其 他 语 言 中 这 种 功 能 是 作 为 函 数 指 针 来 实 现 的 但 是 与 函 数 指 针 不同 的 是 委 托 是 面 向 对 象 的 类 型 安 全 的 和 可 靠 的

使 用 V is u a l J + + 编 程 - 图1095使 用 V is u a l J + + 编 程 - 图1096使 用 V is u a l J + + 编 程 - 图1097使 用 V is u a l J + + 编 程 - 图1098使 用 V is u a l J + + 编 程 - 图1099使 用 V is u a l J + + 编 程 - 图1100使 用 V is u a l J + + 编 程 - 图1101使 用 V is u a l J + + 编 程 - 图1102使 用 V is u a l J + + 编 程 - 图1103使 用 V is u a l J + + 编 程 - 图1104使 用 V is u a l J + + 编 程 - 图1105使 用 V is u a l J + + 编 程 - 图1106使 用 V is u a l J + + 编 程 - 图1107使 用 V is u a l J + + 编 程 - 图1108使 用 V is u a l J + + 编 程 - 图1109在 W F C 中 委 托 经 常 用 于 将 事 件 绑 定 到 处 理 程 序 方 法 如 将 按 钮 控 件上 的 单 击 事 件 绑 定 到 类 的 处 理 程 序 方 法 但 事 件 发 生 时 控 件 调 用 委 托传 递 给 它 一 些 事 件 消 息 委 托 依 次 调 用 已 注 册 的 处 理 程 序 方 法 并 且 将事 件 数 据 传 递 给 它 们 用 户 还 可 以 使 用 委 托 来 将 一 个 事 件 绑 定 到 多 个 方法 上 叫 做 m u l t ic a s t in g 使 用 V is u a l J + + 编 程 - 图1110 当 事 件 发 生 时 列 表 中 的 每 个 委 托 按 着 它们 添 加 的 顺 序 被 调 用 反 过 来 说 不 同 事 件 的 委 托 也 可 以 分 配 给 同 一 个处 理 程 序 方 法 使 用 V is u a l J + + 编 程 - 图1111 例 如 工 具 栏 按 钮 和 菜 单 项 都 可 以 调 用 同 一 个 处 理 程序 使 用 V is u a l J + + 编 程 - 图1112

使 用 V is u a l J + + 编 程 - 图1113使 用 V is u a l J + + 编 程 - 图1114使 用 V is u a l J + + 编 程 - 图1115使 用 V is u a l J + + 编 程 - 图1116使 用 V is u a l J + + 编 程 - 图1117使 用 V is u a l J + + 编 程 - 图1118使 用 V is u a l J + + 编 程 - 图1119使 用 V is u a l J + + 编 程 - 图1120使 用 V is u a l J + + 编 程 - 图1121要 使 用 在 应 用 程 序 中 的 事 件 当 用 于 某 个 特 殊 控 件 的 事 件 发 生 时 用 户使 用 委 托 来 为 通 知 进 行 注 册 要 进 行 注 册 应 该 调 用 控 件 的A d d O n < ev en t> 方 法 这 里 的 <e v e n t> 是 所 要 处 理 的 事 件 名 称 例 如 要为 一 个 按 钮 的 单 击 事 件 注 册 应 该 调 用 该 按 钮 对 象 的 a ddO nC l ic k 方 法

使 用 V is u a l J + + 编 程 - 图1122使 用 V is u a l J + + 编 程 - 图1123使 用 V is u a l J + + 编 程 - 图1124使 用 V is u a l J + + 编 程 - 图1125使 用 V is u a l J + + 编 程 - 图1126使 用 V is u a l J + + 编 程 - 图1127使 用 V is u a l J + + 编 程 - 图1128使 用 V is u a l J + + 编 程 - 图1129使 用 V is u a l J + + 编 程 - 图1130使 用 V is u a l J + + 编 程 - 图1131a 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 在 当 前 类 中 使 用 V is u a l J + + 编 程 - 图1132 绑 定 到 名 为 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));

使 用 V is u a l J + + 编 程 - 图1133使 用 V is u a l J + + 编 程 - 图1134使 用 V is u a l J + + 编 程 - 图1135使 用 V is u a l J + + 编 程 - 图1136使 用 V is u a l J + + 编 程 - 图1137使 用 V is u a l J + + 编 程 - 图1138使 用 V is u a l J + + 编 程 - 图1139使 用 V is u a l J + + 编 程 - 图1140使 用 V is u a l J + + 编 程 - 图1141使 用 V is u a l J + + 编 程 - 图1142使 用 V is u a l J + + 编 程 - 图1143使 用 V is u a l J + + 编 程 - 图1144使 用 V is u a l J + + 编 程 - 图1145使 用 V is u a l J + + 编 程 - 图1146对 于 多 数 事 件 来 说 用 户 可 以 创 建 并 传 递 一 个 普 通 的 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 对 象 使 用 V is u a l J + + 编 程 - 图1147

使 用 V is u a l J + + 编 程 - 图1148使 用 V is u a l J + + 编 程 - 图1149使 用 V is u a l J + + 编 程 - 图1150使 用 V is u a l J + + 编 程 - 图1151使 用 V is u a l J + + 编 程 - 图1152所 有 的 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 字 符 结 尾 并 且 可 以 在

使 用 V is u a l J + + 编 程 - 图1153c o m .m s. w fc .u i 软 件 包 中 找 到 它 们

使 用 V is u a l J + + 编 程 - 图1154使 用 V is u a l J + + 编 程 - 图1155使 用 V is u a l J + + 编 程 - 图1156使 用 V is u a l J + + 编 程 - 图1157提 示 在 Forms Desi gner 中 用 户 可 以 使 用 Properties 窗 口 中 的Events 视 图 来 绑 定 事 件 到 指 定 的 方 法 上 Forms Desi gner 然 后 为用 户 创 建 适 当 的 addOn<even t> 方 法 和 骨 架 处 理 程 序

使 用 V is u a l J + + 编 程 - 图1158使 用 V is u a l J + + 编 程 - 图1159使 用 V is u a l J + + 编 程 - 图1160使 用 V is u a l J + + 编 程 - 图1161使 用 V is u a l J + + 编 程 - 图1162使 用 V is u a l J + + 编 程 - 图1163当 委 托 调 用 处 理 程 序 时 它 传 递 两 个 参 数 第 一 个 参 数 是 引 起 该 事 件 的对 象 引 用 第 二 个 参 数 是 包 含 该 事 件 信 息 的 事 件 对 象 在 前 面 的 例 子 中该 委 托 的 处 理 程 序 看 起 来 应 该 如 下 所 示

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;

}

}

使 用 V is u a l J + + 编 程 - 图1164使 用 V is u a l J + + 编 程 - 图1165使 用 V is u a l J + + 编 程 - 图1166使 用 V is u a l J + + 编 程 - 图1167使 用 V is u a l J + + 编 程 - 图1168使 用 V is u a l J + + 编 程 - 图1169使 用 V is u a l J + + 编 程 - 图1170如 果 使 用 常 规 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);

}

使 用 V is u a l J + + 编 程 - 图1171使 用 V is u a l J + + 编 程 - 图1172使 用 V is u a l J + + 编 程 - 图1173使 用 V is u a l J + + 编 程 - 图1174使 用 V is u a l J + + 编 程 - 图1175使 用 V is u a l J + + 编 程 - 图1176使 用 V is u a l J + + 编 程 - 图1177使 用 V is u a l J + + 编 程 - 图1178使 用 V is u a l J + + 编 程 - 图1179如 果 想 要 为 用 于 同 样 控 件 的 多 控 件 或 多 事 件 来 处 理 事 件 需 要 为 每 一 个控 件 / 事 件 的 组 合 请 求 一 个 单 独 的 通 知 多 个 通 知 可 以 指 定 同 一 处 理 程序 例 如 工 具 栏 上 的 所 有 按 钮 为 它 们 的 单 击 事 件 可 能 调 用 同 一 个 处 理程 序 用 户 可 以 使 用 源 对 象 传 递 到 事 件 处 理 程 序 来 得 到 单 击 了 哪 个 按钮 的 详 细 情 况 使 用 V is u a l J + + 编 程 - 图1180 通 常 用 户 将 传 递 到 处 理 程 序 中 的 对 象 放 入 适 当 的 类 中以 便 能 够 从 适 当 的 类 中 调 用 方 法 使 用 V is u a l J + + 编 程 - 图1181

使 用 V is u a l J + + 编 程 - 图1182使 用 V is u a l J + + 编 程 - 图1183使 用 V is u a l J + + 编 程 - 图1184下 面 的 例 子 显 示 了 为 工 具 栏 定 义 按 钮 为 它 们 的 单 击 事 件 请 求 通 知 以及 处 理 方 法 的 代 码

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);

}

}

本 机 化 应 用 程 序

使 用 V is u a l J + + 编 程 - 图1185使 用 V is u a l J + + 编 程 - 图1186使 用 V is u a l J + + 编 程 - 图1187使 用 V is u a l J + + 编 程 - 图1188使 用 V is u a l J + + 编 程 - 图1189使 用 V is u a l J + + 编 程 - 图1190使 用 V is u a l J + + 编 程 - 图1191使 用 V is u a l J + + 编 程 - 图1192使 用 V is u a l J + + 编 程 - 图1193使 用 V is u a l J + + 编 程 - 图1194使 用 V is u a l J + + 编 程 - 图1195使 用 V is u a l J + + 编 程 - 图1196W F C 和 V isu a l J + + D e sig n e r 为 开 发 使 用 多 种 语 言 的 应 用 程 序 提 供 了 简便 的 方 法 W F C 应 用 程 序 能 够 以 几 种 本 地 化 语 言 版 本 创 建 版 本 之 间的 唯 一 不 同 是 一 个 二 进 制 资 源 文 件 每 个 资 源 文 件 的 命 名 约 定 都 指 出 它所 支 持 的 语 言 并 且 根 据 用 户 的 本 地 化 设 置 可 以 加 载 正 确 的 资 源理 解 本 地 化 概 念 有 两 部 分 设 计 时 实 现 和 运 行 时 支 持 V isu a l J + + 要 进行 本 地 化 就 要 识 别 可 视 元 素 使 用 V is u a l J + + 编 程 - 图1197 窗 体 和 控 件 使 用 V is u a l J + + 编 程 - 图1198 的 某 些 属 性 在 设 计 时

使 用 V is u a l J + + 编 程 - 图1199使 用 V is u a l J + + 编 程 - 图1200使 用 V is u a l J + + 编 程 - 图1201使 用 V is u a l J + + 编 程 - 图1202使 用 V is u a l J + + 编 程 - 图1203使 用 V is u a l J + + 编 程 - 图1204使 用 V is u a l J + + 编 程 - 图1205使 用 V is u a l J + + 编 程 - 图1206V isu a l J + + 用 来 将 这 些 本 地 化 属 性 放 入 一 个 二 进 制 资 源 文 件 中 例 如控 件 的 文 本 字 体 和 大 小 可 以 在 两 种 语 言 版 本 中 改 变 在 运 行 时 当 加载 应 用 程 序 时 系 统 在 确 定 用 户 的 位 置 时 加 载 与 客 户 线 程 对 应 的 资 源

使 用 V is u a l J + + 编 程 - 图1207使 用 V is u a l J + + 编 程 - 图1208使 用 V is u a l J + + 编 程 - 图1209使 用 V is u a l J + + 编 程 - 图1210使 用 V is u a l J + + 编 程 - 图1211使 用 V is u a l J + + 编 程 - 图1212要 创 建 应 用 程 序 的 本 地 化 版 本 使 用 V isu a l J + + 来 设 计 可 视 布 局 并 将窗 体 的 本 地 化 属 性 设 置 为 真 然 后 保 存 该 窗 体 V isu a l J + + 自 动 创 建 一个 二 进 制 资 源 文 件 并 将 所 有 的 本 地 化 属 性 与 它 关 联 起 来

使 用 V is u a l J + + 编 程 - 图1213使 用 V is u a l J + + 编 程 - 图1214使 用 V is u a l J + + 编 程 - 图1215使 用 V is u a l J + + 编 程 - 图1216使 用 V is u a l J + + 编 程 - 图1217使 用 V is u a l J + + 编 程 - 图1218使 用 V is u a l J + + 编 程 - 图1219使 用 V is u a l J + + 编 程 - 图1220使 用 V is u a l J + + 编 程 - 图1221使 用 V is u a l J + + 编 程 - 图1222使 用 V is u a l J + + 编 程 - 图1223使 用 V is u a l J + + 编 程 - 图1224使 用 V is u a l J + + 编 程 - 图1225当 窗 体 的 本 地 化 属 性 设 置 为 真 时 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 使 用 V is u a l J + + 编 程 - 图1226 所 创 建 的 每 个 版 本 都 将 保 存 到 该 资 源 文 件 名 当 创建 每 个 新 版 本 之 后 用 户 使 用 W ind ow s E xp lore r 或 M S - D O S 命 令 将 该资 源 文 件 复 制 一 份 并 且 将 其 名 称 重 命 名 为 带 有 标 准 W ind ow s 本 地 后缀 的 适 当 的 本 地 语 言 名 使 用 V is u a l J + + 编 程 - 图1227 例 如 对 于 日 本 版 本 来 说 是F o m r 1_ jpn_ jpn .re s ourc e s 使 用 V is u a l J + + 编 程 - 图1228 第 一 个 本 地 后 缀 指 定 了 主 要 的 语 言 第 二个 后 缀 指 定 了 次 要 的 语 言

使 用 V is u a l J + + 编 程 - 图1229使 用 V is u a l J + + 编 程 - 图1230使 用 V is u a l J + + 编 程 - 图1231使 用 V is u a l J + + 编 程 - 图1232重 点 在 布 局 并 保 存 任 何 本 地 化 版 本 之 前 一 定 要 使 用 新 名 保 存 原始 布 局 这 将 是 用 户 的 主 .resources 文 件

使 用 V is u a l J + + 编 程 - 图1233使 用 V is u a l J + + 编 程 - 图1234使 用 V is u a l J + + 编 程 - 图1235使 用 V is u a l J + + 编 程 - 图1236使 用 V is u a l J + + 编 程 - 图1237使 用 V is u a l J + + 编 程 - 图1238使 用 V is u a l J + + 编 程 - 图1239例 如 假 定 用 户 想 要 为 主 窗 体 名 为 Z ippo .ja v a 的 应 用 程 序 创 建 美 国 英 语 法 语 和 日 语 版 本 还 假 定 用 户 使 用 英 语 版 本 开 始 使 用 V is u a l J + + 编 程 - 图1240 尽 管 这 不 是 必 须 的 使 用 V is u a l J + + 编 程 - 图1241首 先 按 英 语 布 局 窗 体 并 将 本 地 化 属 性 设 置 为 真 当 保 存 该 窗 体 时

使 用 V is u a l J + + 编 程 - 图1242使 用 V is u a l J + + 编 程 - 图1243使 用 V is u a l J + + 编 程 - 图1244使 用 V is u a l J + + 编 程 - 图1245使 用 V is u a l J + + 编 程 - 图1246便 创 建 了 文 件 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 is u a l J + + 编 程 - 图1247

使 用 V is u a l J + + 编 程 - 图1248使 用 V is u a l J + + 编 程 - 图1249使 用 V is u a l J + + 编 程 - 图1250接 下 来 在 V isu a l J + + D e s ig n e r 中 改 变 默 认 的 语 言 为 法 语 并 且 在 法

使 用 V is u a l J + + 编 程 - 图1251使 用 V is u a l J + + 编 程 - 图1252使 用 V is u a l J + + 编 程 - 图1253使 用 V is u a l J + + 编 程 - 图1254使 用 V is u a l J + + 编 程 - 图1255使 用 V is u a l J + + 编 程 - 图1256语 中 使 用 属 性 本 地 化 来 布 局 控 件 当 结 束 时 再 次 保 存 窗 体 覆 盖 z ippo .re souc e s 的 以 前 版 本 再 次 复 制 Z ippo .re sourc e s 并 且 将 其 改 名 为Z ippo _fra _fra . re sourc e s

使 用 V is u a l J + + 编 程 - 图1257使 用 V is u a l J + + 编 程 - 图1258要 测 试 这 些 版 本 在 C on tro l P a ne l 控 制 面 板 使 用 V is u a l J + + 编 程 - 图1259 中 的 R e g io n a l S e ttin g s

使 用 V is u a l J + + 编 程 - 图1260使 用 V is u a l J + + 编 程 - 图1261使 用 V is u a l J + + 编 程 - 图1262使 用 V is u a l J + + 编 程 - 图1263使 用 V is u a l J + + 编 程 - 图1264区 域 设 置 使 用 V is u a l J + + 编 程 - 图1265 对 话 框 中 此 时 选 择 区 域 为 F ren ch ( S ta n d a rd ) 不 需 要 重新 启 动 计 算 机 区 域 将 在 本 地 线 程 上 改 变 使 用 V is u a l J + + 编 程 - 图1266

使 用 W F C 应 用 程 序 服 务

使 用 V is u a l J + + 编 程 - 图1267使 用 V is u a l J + + 编 程 - 图1268使 用 V is u a l J + + 编 程 - 图1269使 用 V is u a l J + + 编 程 - 图1270使 用 V is u a l J + + 编 程 - 图1271使 用 V is u a l J + + 编 程 - 图1272使 用 V is u a l J + + 编 程 - 图1273使 用 V is u a l J + + 编 程 - 图1274使 用 V is u a l J + + 编 程 - 图1275使 用 V is u a l J + + 编 程 - 图1276c 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 线 程 一 节 中 将 专 门 讨 论这 一 点

使 用 V is u a l J + + 编 程 - 图1277使 用 V is u a l J + + 编 程 - 图1278使 用 V is u a l J + + 编 程 - 图1279作 为 应 用 程 序 服 务 限 定 的 其 他 操 作 与 W in 3 2 操 作 系 统 提 供 的 操 作 相 关这 些 操 作 包 括 在 其 他 操 作 之 间 访 问 W ind ow s 注 册 表 访 问 剪 贴 板 数 据和 检 索 系 统 消 息 等

启 动 和 退 出 应 用 程 序

使 用 V is u a l J + + 编 程 - 图1280使 用 V is u a l J + + 编 程 - 图1281使 用 V is u a l J + + 编 程 - 图1282A p p lic a tio n .ru n 方 法 启 动 W F C 应 用 程 序 它 通 常 放 在 基 于 窗 体 的 类 的主 方 法 中 该 方 法 用 来 构 造 主 应 用 程 序 窗 体 A p p lic a tio n .ru n 具 有 不 带

使 用 V is u a l J + + 编 程 - 图1283使 用 V is u a l J + + 编 程 - 图1284使 用 V is u a l J + + 编 程 - 图1285使 用 V is u a l J + + 编 程 - 图1286参 数 或 带 有 一 个 参 数 的 重 载 方 法 这 一 个 参 数 指 定 表 示 应 用 程 序 主 窗 口的 窗 体 类 例 如 下 面 就 是 该 调 用 的 一 个 典 型 窗 体

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 ());

}

使 用 V is u a l J + + 编 程 - 图1287使 用 V is u a l J + + 编 程 - 图1288使 用 V is u a l J + + 编 程 - 图1289使 用 V is u a l J + + 编 程 - 图1290使 用 V is u a l J + + 编 程 - 图1291使 用 V is u a l J + + 编 程 - 图1292使 用 V is u a l J + + 编 程 - 图1293使 用 V is u a l J + + 编 程 - 图1294使 用 V is u a l J + + 编 程 - 图1295使 用 V is u a l J + + 编 程 - 图1296使 用 V is u a l J + + 编 程 - 图1297如 果 窗 体 传 递 到 运 行 方 法 中 窗 体 的 可 视 属 性 自 动 设 置 为 真 并 且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 只 关 闭 应 用 程 序 的 当 前 线 程

处 理 应 用 程 序 事 件

使 用 V is u a l J + + 编 程 - 图1298用 户 使 用 A p p lic a tio n 对 象 为 5 个 不 同 的 事 件 指 定 事 件 处 理 程 序 这 5

使 用 V is u a l J + + 编 程 - 图1299使 用 V is u a l J + + 编 程 - 图1300使 用 V is u a l J + + 编 程 - 图1301使 用 V is u a l J + + 编 程 - 图1302个 事 件 在 应 用 程 序 的 上 下 文 中 发 生 它 们 是 a pp lic a t io n E x it id le

使 用 V is u a l J + + 编 程 - 图1303使 用 V is u a l J + + 编 程 - 图1304se 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 可 以 调 用 下 面 的

使 用 V is u a l J + + 编 程 - 图1305a ddO n 方 法 来 为 这 些 事 件 定 义 事 件 处 理 程 序

应 用 程序 方法 说 明

使 用 V is u a l J + + 编 程 - 图1306a d d O n A p p lic a tio n E x it 指 定 当 应 用 程 序 退 出 时 调 用 的 处 理 程 序 用 户 可 以

在 这 里清 除 不 会由 垃圾 收 集 释放 的应 用程 序 资 源使 用 V is u a l J + + 编 程 - 图1307

使 用 V is u a l J + + 编 程 - 图1308强 制 应 用 程 序 不 退 出 需 为 窗 体 的 关 闭 事 件 指 定 一个处 理 程 序 使 用 V is u a l J + + 编 程 - 图1309

使 用 V is u a l J + + 编 程 - 图1310使 用 V is u a l J + + 编 程 - 图1311a d dO n Id le 指 定 当 应 用 程 序 的 消 息 队 列 空 闲 时 调 用 的 处 理 程序 例如 执行 后 台 操作 或应 用 程 序 清 除

a d dO n S e t ting c h a n ge 指 定 当用 户 改 变窗 口设 置 时 调用 的处 理程 序

使 用 V is u a l J + + 编 程 - 图1312a 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 异常 时调 用 的 处理 程

使 用 V is u a l J + + 编 程 - 图1313使 用 V is u a l J + + 编 程 - 图1314使 用 V is u a l J + + 编 程 - 图1315序 允 许 应 用 程 序 完 美 地 处 理 该 异 常 该 事 件 处 理程 序 获 取 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 对象 该对 象 中 有一 个用 来 表 示废 弃该 异常 的 字 段

使 用 V is u a l J + + 编 程 - 图1316使 用 V is u a l J + + 编 程 - 图1317使 用 V is u a l J + + 编 程 - 图1318使 用 V is u a l J + + 编 程 - 图1319使 用 V is u a l J + + 编 程 - 图1320使 用 V is u a l J + + 编 程 - 图1321所 有 这 些 a ddO n 方 法 都 有 一 个 相 对 的 re m o v e O n 方 法 用 来 删 除该 事 件 处 理 程 序

访 问 系 统 信 息

使 用 V is u a l J + + 编 程 - 图1322使 用 V is u a l J + + 编 程 - 图1323使 用 V is u a l J + + 编 程 - 图1324使 用 V is u a l J + + 编 程 - 图1325使 用 V is u a l J + + 编 程 - 图1326使 用 V is u a l J + + 编 程 - 图1327使 用 V is u a l J + + 编 程 - 图1328使 用 V is u a l J + + 编 程 - 图1329使 用 V is u a l J + + 编 程 - 图1330使 用 V is u a l J + + 编 程 - 图1331W 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 类 可 以 利 用 系 统 时 间

使 用 V is u a l J + + 编 程 - 图1332这 一 部 分 概 括 了 W F C 应 用 程 序 访 问 系 统 信 息 的 方 式

W in dow s 注 册 表 信 息

使 用 V is u a l J + + 编 程 - 图1333使 用 V is u a l J + + 编 程 - 图1334使 用 V is u a l J + + 编 程 - 图1335使 用 V is u a l J + + 编 程 - 图1336c o m .m s. w fc .a p p 软 件 包 中 的 R e g is t ry K e y 类 包 含 访 问 W indow s 系 统 注 册表 的 方 法 使 用 在 该 类 中 的 方 法 来 创 建 并 删 除 子 键 获 得 当 前 键 的 子 键数 量 和 名 称 以 及 检 索 设 置 和 删 除 分 配 到 子 键 的 值

使 用 V is u a l J + + 编 程 - 图1337使 用 V is u a l J + + 编 程 - 图1338使 用 V is u a l J + + 编 程 - 图1339使 用 V is u a l J + + 编 程 - 图1340使 用 V is u a l J + + 编 程 - 图1341使 用 V is u a l J + + 编 程 - 图1342使 用 V is u a l J + + 编 程 - 图1343c 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 _ 起 始 使 用 V is u a l J + + 编 程 - 图1344 根 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 is u a l J + + 编 程 - 图1345使 用 V is u a l J + + 编 程 - 图1346使 用 V is u a l J + + 编 程 - 图1347使 用 V is u a l J + + 编 程 - 图1348使 用 V is u a l J + + 编 程 - 图1349使 用 V is u a l J + + 编 程 - 图1350同 样 可 以 检 索 任 何 子 键 或 设 置 给 予 它 的 路 径 和 子 键 值 名 并 且 可 以检 索 数 据 或 设 置 给 予 它 的 值 名 下 面 的 例 子 显 示 了 检 索 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 " ) ;

}

使 用 V is u a l J + + 编 程 - 图1351使 用 V is u a l J + + 编 程 - 图1352用 户 还 可 以 使 用 crea te S u b K e y 方 法 创 建 新 键 并 使 用 Se t V a lu e 方 法 在这 些 键 中 设 置 值

位 置 信 息

使 用 V is u a l J + + 编 程 - 图1353使 用 V is u a l J + + 编 程 - 图1354使 用 V is u a l J + + 编 程 - 图1355使 用 V is u a l J + + 编 程 - 图1356位 置 信 息 提 供 了 在 用 户 的 计 算 机 上 设 置 的 语 言 和 区 域 设 置 的 详 细 资 料系 统 中 存 储 有 许 多 有 关 语 言 和 区 域 的 特 性 包 括 字 符 集 国 际 电 话 代 码

使 用 V is u a l J + + 编 程 - 图1357使 用 V is u a l J + + 编 程 - 图1358使 用 V is u a l J + + 编 程 - 图1359货 币 信 息 如 何 显 示 使 用 哪 种 日 历 度 量 系 统 等 等

使 用 V is u a l J + + 编 程 - 图1360使 用 V is u a l J + + 编 程 - 图1361使 用 V is u a l J + + 编 程 - 图1362这 些 信 息 一 般 使 用 在 C on tro l P a ne l 中 的 R e gio n a l S e t tin gs 对 话 框 来 设置 但 也 可 以 利 用 程 序 来 设 置 在 W F C 中 提 供 这 种 访 问 的 有

使 用 V is u a l J + + 编 程 - 图1363使 用 V is u a l J + + 编 程 - 图1364使 用 V is u a l J + + 编 程 - 图1365使 用 V is u a l J + + 编 程 - 图1366co m .m s . w fc .a p p . L o cale 类 中 的 方 法 以 及 与 Loc a le 方 法 相 关 的 包 含 字 段常 量 的 许 多 Loc a l 子 类 有 关 设 置 和 检 索 这 些 信 息 的 细 节 见 Loc a le 类中 的 方 法

时 间 信 息

使 用 V is u a l J + + 编 程 - 图1367使 用 V is u a l J + + 编 程 - 图1368使 用 V is u a l J + + 编 程 - 图1369使 用 V is u a l J + + 编 程 - 图1370使 用 V is u a l J + + 编 程 - 图1371使 用 V is u a l J + + 编 程 - 图1372使 用 V is u a l J + + 编 程 - 图1373使 用 V is u a l J + + 编 程 - 图1374使 用 V is u a l J + + 编 程 - 图1375时 间 是 另 外 的 一 种 系 统 信 息 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 对 象 等

使 用 V is u a l J + + 编 程 - 图1376使 用 V is u a l J + + 编 程 - 图1377使 用 V is u a l J + + 编 程 - 图1378使 用 V is u a l J + + 编 程 - 图1379使 用 V is u a l J + + 编 程 - 图1380使 用 V is u a l J + + 编 程 - 图1381使 用 V is u a l J + + 编 程 - 图1382T im e 对 象 一 旦 创 建 就 不 能 改 变 但 是 T im e 类 提 供 了 许 多 方 法 以 使用 偏 移 时 间 来 创 建 新 对 象 如 A d d S e c onds a ddM inu te s a ddH ours

使 用 V is u a l J + + 编 程 - 图1383使 用 V is u a l J + + 编 程 - 图1384使 用 V is u a l J + + 编 程 - 图1385使 用 V is u a l J + + 编 程 - 图1386使 用 V is u a l J + + 编 程 - 图1387a ddD a ys 和 ad d Y ears 使 用 V is u a l J + + 编 程 - 图1388 还 有 许 多 用 来 检 索 某 种 T im e 对 象 属 性 的 方 法如 秒 分 钟 小 时 和 天 等 等

使 用 V is u a l J + + 编 程 - 图1389使 用 V is u a l J + + 编 程 - 图1390使 用 V is u a l J + + 编 程 - 图1391使 用 V is u a l J + + 编 程 - 图1392使 用 V is u a l J + + 编 程 - 图1393使 用 V is u a l J + + 编 程 - 图1394使 用 V is u a l J + + 编 程 - 图1395使 用 V is u a l J + + 编 程 - 图1396使 用 V is u a l J + + 编 程 - 图1397在 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 等 使 用 V is u a l J + + 编 程 - 图1398可 能 导 致 精 度 的 丢 失 并 且 不 是 所 有 的 格 式 都 可 以 存 储 这 么 大 范 围 的值

使 用 V is u a l J + + 编 程 - 图1399使 用 V is u a l J + + 编 程 - 图1400使 用 V is u a l J + + 编 程 - 图1401不 要 将 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 软 件 包 中 的 原 因 是 它 没 有 用户 界 面

执 行 剪 贴 板 和 拖 放 操 作

使 用 V is u a l J + + 编 程 - 图1402使 用 V is u a l J + + 编 程 - 图1403使 用 V is u a l J + + 编 程 - 图1404使 用 V is u a l J + + 编 程 - 图1405使 用 V is u a l J + + 编 程 - 图1406使 用 V is u a l J + + 编 程 - 图1407使 用 V is u a l J + + 编 程 - 图1408使 用 V is u a l J + + 编 程 - 图1409使 用 V is u a l J + + 编 程 - 图1410使 用 V is u a l J + + 编 程 - 图1411使 用 V is u a l J + + 编 程 - 图1412使 用 V is u a l J + + 编 程 - 图1413使 用 V is u a l J + + 编 程 - 图1414在 W F C 中 拖 放 操 作 是 基 于 W in 3 2 O L E 使 用 V is u a l J + + 编 程 - 图1415 模 型 的 这 种 模 型 实 现 用于 复 制 或 粘 贴 数 据 的 快 捷 方 式 当 使 用 剪 贴 板 时 必 须 执 行 几 个 步 骤选 择 数 据 从 上 下 文 菜 单 中 选 择 Cu t 或 Co p y 移 动 到 目 标 文 件 窗 口或 应 用 程 序 中 然 后 从 上 下 文 菜 单 中 选 择 Pa s te 数 据 的 来 源 称 为 源而 目 的 地 称 为 目 标 使 用 V is u a l J + + 编 程 - 图1416

使 用 V is u a l J + + 编 程 - 图1417使 用 V is u a l J + + 编 程 - 图1418使 用 V is u a l J + + 编 程 - 图1419使 用 V is u a l J + + 编 程 - 图1420使 用 V is u a l J + + 编 程 - 图1421使 用 V is u a l J + + 编 程 - 图1422使 用 V is u a l J + + 编 程 - 图1423使 用 V is u a l J + + 编 程 - 图1424使 用 V is u a l J + + 编 程 - 图1425拖 放 特 性 不 使 用 上 下 文 菜 单 它 按 下 鼠 标 左 键 来 捕 获 在 源 中 选 中 的 数据 然 后 在 目 标 中 放 开 鼠 标 按 钮 将 其 放 入 拖 放 操 作 可 以 传 输 任 何 能 放置 到 剪 贴 板 中 的 数 据 因 此 用 于 拖 放 数 据 的 格 式 与 它 们 放 入 到 剪 贴 板时 的 数 据 格 式 相 同 例 如 数 据 格 式 指 定 这 些 数 据 是 否 为 文 本 位 图

使 用 V is u a l J + + 编 程 - 图1426使 用 V is u a l J + + 编 程 - 图1427使 用 V is u a l J + + 编 程 - 图1428使 用 V is u a l J + + 编 程 - 图1429使 用 V is u a l J + + 编 程 - 图1430HTM 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 使 用 V is u a l J + + 编 程 - 图1431 直 接 来 源 于 W in 3 2 常 量名

使 用 V is u a l J + + 编 程 - 图1432使 用 V is u a l J + + 编 程 - 图1433使 用 V is u a l J + + 编 程 - 图1434使 用 V is u a l J + + 编 程 - 图1435使 用 V is u a l J + + 编 程 - 图1436使 用 V is u a l J + + 编 程 - 图1437剪 贴 板 或 拖 放 操 作 的 数 据 存 储 在 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 从 剪

使 用 V is u a l J + + 编 程 - 图1438使 用 V is u a l J + + 编 程 - 图1439使 用 V is u a l J + + 编 程 - 图1440使 用 V is u a l J + + 编 程 - 图1441使 用 V is u a l J + + 编 程 - 图1442使 用 V is u a l J + + 编 程 - 图1443使 用 V is u a l J + + 编 程 - 图1444贴 板 中 返 回 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 返 回 真

实 现 放 入 源

使 用 V is u a l J + + 编 程 - 图1445使 用 V is u a l J + + 编 程 - 图1446使 用 V is u a l J + + 编 程 - 图1447使 用 V is u a l J + + 编 程 - 图1448使 用 V is u a l J + + 编 程 - 图1449使 用 V is u a l J + + 编 程 - 图1450使 用 V is u a l J + + 编 程 - 图1451使 用 V is u a l J + + 编 程 - 图1452使 用 V is u a l J + + 编 程 - 图1453使 用 V is u a l J + + 编 程 - 图1454对 于 任 何 W F C 控 件 组 件 基 于 c o m .m s. w fc .u i . C o n t ro l 使 用 V is u a l J + + 编 程 - 图1455 调 用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 ) ;

}

}

使 用 V is u a l J + + 编 程 - 图1456使 用 V is u a l J + + 编 程 - 图1457doD 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

使 用 V is u a l J + + 编 程 - 图1458组 合 的 常 量

D r agD r o p E ffe c t 方法 说明

CO P Y 指 定 在传 递 之 后数 据将 不 从 源中 删除

M O V E 指 定 在传 递 之 后数 据将 从 源 中删 除

SC R O L L 指 定 在传 递 之 后数 据在 目 标 中滚 动

使 用 V is u a l J + + 编 程 - 图1459使 用 V is u a l J + + 编 程 - 图1460使 用 V is u a l J + + 编 程 - 图1461AL L 指定 在传 递之 后数据 将 从 源 中 删 除 并且 在 目 标中滚动 从 本 质上 来说 是 CO P Y |M O V E |S C RO L L 使 用 V is u a l J + + 编 程 - 图1462

NONE 指 定 没有 执 行 操作

在 拖 放 操 作 中 接 收 数 据 的 目 标 检 索 包 含 D rag D ro p E f fect 对 象 的 dra g D rop

使 用 V is u a l J + + 编 程 - 图1463使 用 V is u a l J + + 编 程 - 图1464事 件 所 以 它 可 以 很 容 易 地 确 定 该 操 作 的 目 的

实 现 放 入 目 标

使 用 V is u a l J + + 编 程 - 图1465使 用 V is u a l J + + 编 程 - 图1466使 用 V is u a l J + + 编 程 - 图1467使 用 V is u a l J + + 编 程 - 图1468使 用 V is u a l J + + 编 程 - 图1469使 用 V is u a l J + + 编 程 - 图1470拖 放 操 作 的 放 入 部 分 作 为 事 件 处 理 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 使 用 V is u a l J + + 编 程 - 图1471 提 供 事 件 处 理 程 序 的 基 础 可 以 使用 下 面 的 方 法 来 指 定 这 些 事 件 的 处 理 程 序

C o n tr o l 方法

说明

a d d O n D ra g D ro p

为 拖 入 控 件或 窗 口 的数 据 指 定一 个 处 理程 序放开 时 使 用 V is u a l J + + 编 程 - 图1472

使 用 V is u a l J + + 编 程 - 图1473 当鼠 标 左 键

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 当 光 标拖 过 窗 口时 为放 入 数 据指 定一 个处 理 程 序

使 用 V is u a l J + + 编 程 - 图1474使 用 V is u a l J + + 编 程 - 图1475使 用 V is u a l J + + 编 程 - 图1476使 用 V is u a l J + + 编 程 - 图1477使 用 V is u a l J + + 编 程 - 图1478使 用 V is u a l J + + 编 程 - 图1479使 用 V is u a l J + + 编 程 - 图1480使 用 V is u a l J + + 编 程 - 图1481使 用 V is u a l J + + 编 程 - 图1482使 用 V is u a l J + + 编 程 - 图1483使 用 V is u a l J + + 编 程 - 图1484使 用 V is u a l J + + 编 程 - 图1485所 有 这 些 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));

使 用 V is u a l J + + 编 程 - 图1486使 用 V is u a l J + + 编 程 - 图1487使 用 V is u a l J + + 编 程 - 图1488使 用 V is u a l J + + 编 程 - 图1489使 用 V is u a l J + + 编 程 - 图1490使 用 V is u a l J + + 编 程 - 图1491使 用 V is u a l J + + 编 程 - 图1492使 用 V is u a l J + + 编 程 - 图1493使 用 V is u a l J + + 编 程 - 图1494使 用 V is u a l J + + 编 程 - 图1495对 于 所 有 的 拖 放 事 件 dra g D rop 事 件 是 最 常 处 理 的 不 管 处 理 这 些 事 件中 的 哪 个 处 理 程 序 中 的 代 码 必 须 至 少 做 三 件 事 首 先 它 必 须 确 定 是否 可 以 接 收 这 个 数 据 格 式 如 果 可 以 它 必 须 复 制 数 据 并 且 可 以 选 择显 示 它 使 用 V is u a l J + + 编 程 - 图1496 或 者 提 供 一 些 用 户 界 面 的 反 馈 表 示 数 据 已 经 放 入 使 用 V is u a l J + + 编 程 - 图1497

使 用 V is u a l J + + 编 程 - 图1498使 用 V is u a l J + + 编 程 - 图1499使 用 V is u a l J + + 编 程 - 图1500使 用 V is u a l J + + 编 程 - 图1501使 用 V is u a l J + + 编 程 - 图1502使 用 V is u a l J + + 编 程 - 图1503使 用 V is u a l J + + 编 程 - 图1504使 用 V is u a l J + + 编 程 - 图1505使 用 V is u a l J + + 编 程 - 图1506使 用 V is u a l J + + 编 程 - 图1507使 用 V is u a l J + + 编 程 - 图1508使 用 V is u a l J + + 编 程 - 图1509使 用 V is u a l J + + 编 程 - 图1510所 有 数 据 和 信 息 都 传 递 到 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 方 法 传 递 到 该 数 据 类型 使 用 V is u a l J + + 编 程 - 图1511 并 且 检 索 数 据 数 据 如 何 显 示 取 决 于 该 控 件 下 面 的 例 子 说 明 了 一个 编 辑 控 件 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 线 程

使 用 V is u a l J + + 编 程 - 图1512使 用 V is u a l J + + 编 程 - 图1513使 用 V is u a l J + + 编 程 - 图1514使 用 V is u a l J + + 编 程 - 图1515使 用 V is u a l J + + 编 程 - 图1516使 用 V is u a l J + + 编 程 - 图1517Ja va 是 一 个 自 由 线 程 的 环 境 这 也 就 意 味 着 任 何 对 象 在 任 何 时 间 及 任 何线 程 中 都 可 以 调 用 任 何 其 他 对 象 在 编 写 对 象 时 一 定 要 注 意 这 些 方 法是 不 可 分 的 a to m ic 使 用 V is u a l J + + 编 程 - 图1518 而 且 是 线 程 安 全 的

使 用 V is u a l J + + 编 程 - 图1519使 用 V is u a l J + + 编 程 - 图1520使 用 V is u a l J + + 编 程 - 图1521有 几 种 类 从 自 由 线 程 中 可 以 得 到 好 处 并 且 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

使 用 V is u a l J + + 编 程 - 图1522另 一 方 面 任 何 源 于 c o m . m s . w fc .u i . C o n tro l 的 对 象 都 是 公 寓 式 线 程

使 用 V is u a l J + + 编 程 - 图1523使 用 V is u a l J + + 编 程 - 图1524使 用 V is u a l J + + 编 程 - 图1525使 用 V is u a l J + + 编 程 - 图1526使 用 V is u a l J + + 编 程 - 图1527使 用 V is u a l J + + 编 程 - 图1528使 用 V is u a l J + + 编 程 - 图1529使 用 V is u a l J + + 编 程 - 图1530使 用 V is u a l J + + 编 程 - 图1531ap artm en t -th read e d 使 用 V is u a l J + + 编 程 - 图1532 因 为 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 线 程 模 型

使 用 V is u a l J + + 编 程 - 图1533使 用 V is u a l J + + 编 程 - 图1534使 用 V is u a l J + + 编 程 - 图1535使 用 V is u a l J + + 编 程 - 图1536使 用 V is u a l J + + 编 程 - 图1537使 用 V is u a l J + + 编 程 - 图1538使 用 V is u a l J + + 编 程 - 图1539使 用 V is u a l J + + 编 程 - 图1540使 用 V is u a l J + + 编 程 - 图1541使 用 V is u a l J + + 编 程 - 图1542使 用 V is u a l J + + 编 程 - 图1543使 用 V is u a l J + + 编 程 - 图1544使 用 V is u a l J + + 编 程 - 图1545W F C 从 Ja va 对 象 中 访 问 本 机 W in 3 2 结 构 如 窗 口 使 用 V is u a l J + + 编 程 - 图1546 W in 3 2 窗 口 管 理器 是 公 寓 式 线 程 并 且 W ind ow s 根 据 需 要 自 动 从 一 个 线 程 到 另 外 一 个线 程 进 行 调 度 当 一 个 自 由 线 程 对 象 调 用 到 一 个 公 寓 式 线 程 对 象 中 时 该 调 用 必 须 调 度 到 该 对 象 的 公 寓 中 这 就 是 说 当 公 寓 式 线 程 处 理 该 请求 时 该 自 由 线 程 在 一 段 时 间 中 被 阻 塞 所 有 从 自 由 线 程 对 象 到 公 寓 的调 用 均 将 阻 塞 直 到 公 寓 调 用 释 放 为 止 因 此 这 样 就 会 导 致 死 锁

使 用 V is u a l J + + 编 程 - 图1547使 用 V is u a l J + + 编 程 - 图1548使 用 V is u a l J + + 编 程 - 图1549使 用 V is u a l J + + 编 程 - 图1550使 用 V is u a l J + + 编 程 - 图1551使 用 V is u a l J + + 编 程 - 图1552使 用 V is u a l J + + 编 程 - 图1553使 用 V is u a l J + + 编 程 - 图1554使 用 V is u a l J + + 编 程 - 图1555那 么 具 有 自 由 线 程 的 Ja va 对 象 应 该 使 用 W F C 控 件 吗 当 线 程 转 换 发生 时 不 是 将 其 隐 藏 起 来 W F C 认 为 请 求 该 转 换 是 程 序 员 的 责 任 程序 员 可 以 设 计 一 个 阻 止 死 锁 的 方 法 通 过 在 控 件 线 程 上 调 用 一 个 委 托委 托 再 依 次 调 用 其 中 指 定 的 方 法 就 可 以 解 决 这 个 问 题

使 用 V is u a l J + + 编 程 - 图1556使 用 V is u a l J + + 编 程 - 图1557使 用 V is u a l J + + 编 程 - 图1558使 用 V is u a l J + + 编 程 - 图1559使 用 V is u a l J + + 编 程 - 图1560使 用 V is u a l J + + 编 程 - 图1561使 用 V is u a l J + + 编 程 - 图1562要 在 创 建 控 件 窗 口 句 柄 和 包 含 信 息 循 环 的 线 程 上 执 行 给 出 的 委 托 从 要求 的 控 件 中 使 用 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 方 法 导 致 线 程 来 调 用 回 调 方 法 而 不 等 待 回 应 在这 两 种 情 况 下 调 用 线 程 上 的 所 有 异 常 都 传 递 到 自 己 的 控 件 上

创 建 和 退 出 线 程

使 用 V is u a l J + + 编 程 - 图1563使 用 V is u a l J + + 编 程 - 图1564使 用 V is u a l J + + 编 程 - 图1565使 用 V is u a l J + + 编 程 - 图1566使 用 V is u a l J + + 编 程 - 图1567使 用 V is u a l J + + 编 程 - 图1568使 用 V is u a l J + + 编 程 - 图1569使 用 V is u a l J + + 编 程 - 图1570使 用 V is u a l J + + 编 程 - 图1571使 用 V is u a l J + + 编 程 - 图1572使 用 V is u a l J + + 编 程 - 图1573使 用 V is u a l J + + 编 程 - 图1574使 用 V is u a l J + + 编 程 - 图1575使 用 V is u a l J + + 编 程 - 图1576使 用 V is u a l J + + 编 程 - 图1577使 用 V is u a l J + + 编 程 - 图1578使 用 V is u a l J + + 编 程 - 图1579自 由 线 程 可 以 使 用 实 现 ja v a . la n g . R unna b le 接 口 的 标 准 Ja v a 方 法 来 创 建本 例 显 示 了 实 现 R unna b le 和 获 取 两 个 控 件 跟 踪 条 和 标 签 使 用 V is u a l J + + 编 程 - 图1580 作 为 参 数到 它 的 构 造 器 的 类 从 线 程 的 运 行 方 法 中 它 通 过 调 用 跟 踪 条 的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 的 实 例 使 用 V is u a l J + + 编 程 - 图1581 指 定 名 为 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 ();

}

}

使 用 V is u a l J + + 编 程 - 图1582使 用 V is u a l J + + 编 程 - 图1583使 用 V is u a l J + + 编 程 - 图1584使 用 V is u a l J + + 编 程 - 图1585使 用 V is u a l J + + 编 程 - 图1586使 用 V is u a l J + + 编 程 - 图1587在 这 种 情 况 下 退 出 线 程 只 是 停 止 运 行 该 线 程 的 方 法 在 本 例 中 当 处理 创 建 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());

}

}

使 用 V is u a l J + + 编 程 - 图1588使 用 V is u a l J + + 编 程 - 图1589使 用 V is u a l J + + 编 程 - 图1590使 用 V is u a l J + + 编 程 - 图1591使 用 V is u a l J + + 编 程 - 图1592使 用 V is u a l J + + 编 程 - 图1593使 用 V is u a l J + + 编 程 - 图1594使 用 V is u a l J + + 编 程 - 图1595另 一 种 方 法 是 创 建 一 个 新 的 应 用 程 序 线 程 而 不 必 实 现 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 经 常 使 用 但 是 可 以 使 用 任 何 委 托 使 用 V is u a l J + + 编 程 - 图1596 在 这 种 情 况 下 在 一 个 类 中 可 以 包 含 所 有 的

使 用 V is u a l J + + 编 程 - 图1597使 用 V is u a l J + + 编 程 - 图1598使 用 V is u a l J + + 编 程 - 图1599逻 辑 通 常 这 个 类 是 应 用 程 序 基 于 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 ( ) ) ;

}

}

使 用 V is u a l J + + 编 程 - 图1600使 用 V is u a l J + + 编 程 - 图1601使 用 V is u a l J + + 编 程 - 图1602使 用 V is u a l J + + 编 程 - 图1603这 就 是 通 过 从 窗 体 的 处 理 方 法 中 调 用 线 程 的 停 止 方 法 来 中 止 的 线 程 该线 程 不 在 一 个 单 独 的 类 中 所 以 它 的 方 法 可 以 直 接 从 基 于 Fo rm 的 类中 调 用

使 用 V is u a l J + + 编 程 - 图1604A p p lic a tio n 类 还 包 含 A p p lic a tio n .e x itT h re a d 方 法 该 方 法 关 闭 线 程 的 消

使 用 V is u a l J + + 编 程 - 图1605使 用 V is u a l J + + 编 程 - 图1606使 用 V is u a l J + + 编 程 - 图1607使 用 V is u a l J + + 编 程 - 图1608使 用 V is u a l J + + 编 程 - 图1609使 用 V is u a l J + + 编 程 - 图1610息 循 环 并 关 闭 在 线 程 上 的 所 有 窗 口 使 用 V is u a l J + + 编 程 - 图1611 注 意 它 并 不 中 止 或 退 出 线 程 本身 使 用 V is u a l J + + 编 程 - 图1612 与 之 形 成 对 比 的 是 A p p lic a tio n .e x it 关 闭 在 所 有 线 程 上 的 消 息 循环 并 关 闭 所 有 窗 口

使 用 线 程 存 储 器

使 用 V is u a l J + + 编 程 - 图1613使 用 V is u a l J + + 编 程 - 图1614使 用 V is u a l J + + 编 程 - 图1615使 用 V is u a l J + + 编 程 - 图1616使 用 V is u a l J + + 编 程 - 图1617使 用 V is u a l J + + 编 程 - 图1618使 用 V is u a l J + + 编 程 - 图1619使 用 V is u a l J + + 编 程 - 图1620使 用 V is u a l J + + 编 程 - 图1621使 用 V is u a l J + + 编 程 - 图1622使 用 V is u a l J + + 编 程 - 图1623W F C A p p lic a tio n 类 提 供 对 T h re ad L o cal S to rag e T L S 线 程 局 部 存 储 器 使 用 V is u a l J + + 编 程 - 图1624的 支 持 每 个 线 程 可 以 线 程 特 定 的 数 据 存 储 分 配 一 个 内 存 位 置 调 用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 来 释 放 所 有 已 分 配 的 线 程 存 储 器

使 用 线 程 异 常

使 用 V is u a l J + + 编 程 - 图1625使 用 V is u a l J + + 编 程 - 图1626使 用 V is u a l J + + 编 程 - 图1627使 用 V is u a l J + + 编 程 - 图1628使 用 V is u a l J + + 编 程 - 图1629使 用 V is u a l J + + 编 程 - 图1630c 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 类 构 成 的

使 用 V is u a l J + + 编 程 - 图1631通 常 线 程 异 常 事 件 处 理 程 序 查 询 T h re a d E x c e p tionE v e nt 对 象 的 异 常 字

使 用 V is u a l J + + 编 程 - 图1632使 用 V is u a l J + + 编 程 - 图1633使 用 V is u a l J + + 编 程 - 图1634使 用 V is u a l J + + 编 程 - 图1635使 用 V is u a l J + + 编 程 - 图1636使 用 V is u a l J + + 编 程 - 图1637段 传 递 它 来 确 定 所 要 采 取 下 一 个 动 作 从 这 些 线 程 异 常 处 理 程 序 中用 户 可 以 使 用 与 其 他 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 is u a l J + + 编 程 - 图1638使 用 V is u a l J + + 编 程 - 图1639使 用 V is u a l J + + 编 程 - 图1640使 用 V is u a l J + + 编 程 - 图1641使 用 V is u a l J + + 编 程 - 图1642使 用 V is u a l J + + 编 程 - 图1643使 用 V is u a l J + + 编 程 - 图1644与 在 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 is u a l J + + 编 程 - 图1645使 用 V is u a l J + + 编 程 - 图1646使 用 V is u a l J + + 编 程 - 图1647使 用 V is u a l J + + 编 程 - 图1648使 用 V is u a l J + + 编 程 - 图1649使 用 V is u a l J + + 编 程 - 图1650V isu a l J + + 还 包 括 创 建 合 成 控 件 的 可 视 工 具 合 成 控 件 是 由 多 个 可 视 元素 构 成 的 控 件 如 复 选 框 和 列 表 框 利 用 可 视 工 具 可 以 设 计 控 件 的 布局 生 成 可 以 根 据 实 现 控 件 全 部 功 能 进 行 修 正 的 适 当 代 码

使 用 V is u a l J + + 编 程 - 图1651使 用 V is u a l J + + 编 程 - 图1652创 建 控 件 的 详 细 细 节 参 见 下 列 列 表 的 有 关 部 分

有关 信 息 参见

W F C 中的 控件 技 术 使 用 代码 编写 控 件 编 写 W F C 控件

使 用 V is u a l J + + 编 程 - 图1653使 用 可视 工 具 创建 合成 控 件 创建 合成 W F C 控件

编 写 W F C 控 件

使 用 V is u a l J + + 编 程 - 图1654使 用 V is u a l J + + 编 程 - 图1655W F C 提 供 一 个 丰 富 的 框 架 结 构 来 开 发 自 定 义 控 件 下 图 显 示 W F C 中 可视 控 件 的 基 本 类 层 次

使 用 V is u a l J + + 编 程 - 图1656

使 用 V is u a l J + + 编 程 - 图1657使 用 V is u a l J + + 编 程 - 图1658c o m .m s. w fc .u i . C o n t ro l 类 是 所 有 控 件 的 基 类 它 可 以 提 供 控 件 的 多 数 功能

使 用 V is u a l J + + 编 程 - 图1659使 用 V is u a l J + + 编 程 - 图1660使 用 V is u a l J + + 编 程 - 图1661使 用 V is u a l J + + 编 程 - 图1662使 用 V is u a l J + + 编 程 - 图1663使 用 V is u a l J + + 编 程 - 图1664注 意 对 合 成 控 件 来 说 其 他 控 件 和 事 务 逻 辑 组 合 创 建 的 控 件 使 用 的 基 本 W F C 软 件 包 是 com.ms.wfc .ui 可 以 使 用 可 视 工 具 设

使 用 V is u a l J + + 编 程 - 图1665使 用 V is u a l J + + 编 程 - 图1666使 用 V is u a l J + + 编 程 - 图1667使 用 V is u a l J + + 编 程 - 图1668计 合 成 控 件 更 多 信 息 参 见 本 章 后 面 的 创 建 合 成 W F C 控 件

使 用 V is u a l J + + 编 程 - 图1669使 用 V is u a l J + + 编 程 - 图1670使 用 V is u a l J + + 编 程 - 图1671使 用 V is u a l J + + 编 程 - 图1672使 用 V is u a l J + + 编 程 - 图1673使 用 V is u a l J + + 编 程 - 图1674编 写 控 件 时 可 以 扩 展 基 本 C on tro l 类 然 后 增 加 需 要 的 成 员 合 成 控件 是 通 过 扩 展 U s e r C on tro l 在 可 视 设 计 器 中 创 建 的 使 用 V is u a l J + + 编 程 - 图1675 也 可 以 根 据 需 要超 越 从 C on tro l 类 继 承 的 成 员 下 面 提 供 有 关 创 建 控 件 的 信 息

  • 使 用 V is u a l J + + 编 程 - 图1676使 用 V is u a l J + + 编 程 - 图1677**创

    建 基 本 控 件** 如 何 创 建 C on tro l 类 的 子 类 并 且 在 设 计 阶 段 环 境 中 放置 控 件

  • 使 用 V is u a l J + + 编 程 - 图1678使 用 V is u a l J + + 编 程 - 图1679定 义 控 件 属 性 如 何 定 义 并 且 公 布 控 件 的 属 性 如 何 为 属 性 值 指 定 自

使 用 V is u a l J + + 编 程 - 图1680定 义 编 辑 器

  • 使 用 V is u a l J + + 编 程 - 图1681使 用 V is u a l J + + 编 程 - 图1682使 用 V is u a l J + + 编 程 - 图1683使 用 控 件 事 件 如 何 为 控 件 创 建 自 定 义 事 件 如 何 捕 捉 和 使 用 标 准 事件

  • 使 用 V is u a l J + + 编 程 - 图1684使 用 V is u a l J + + 编 程 - 图1685使 用 V is u a l J + + 编 程 - 图1686定 制 控 件 管 理 控 件 的 可 视 显 示 指 定 动 词 和 更 多 的 信 息

  • 使 用 V is u a l J + + 编 程 - 图1687使 用 V is u a l J + + 编 程 - 图1688使 用 控 件 这 里 需 要 做 的 是 使 控 件 可 以 应 用 到 其 他 计 算 机 的 主 应 用 程序 上

创 建 基 本 控 件

使 用 V is u a l J + + 编 程 - 图1689使 用 V is u a l J + + 编 程 - 图1690使 用 V is u a l J + + 编 程 - 图1691使 用 V is u a l J + + 编 程 - 图1692这 部 分 概 括 创 建 控 件 的 过 程 在 这 部 分 可 以 学 到 如 何 定 义 基 本 控 件并 为 它 的 基 本 事 件 提 供 功 能

定 义 控 件

使 用 V is u a l J + + 编 程 - 图1693使 用 V is u a l J + + 编 程 - 图1694使 用 V is u a l J + + 编 程 - 图1695使 用 V is u a l J + + 编 程 - 图1696使 用 V is u a l J + + 编 程 - 图1697使 用 V is u a l J + + 编 程 - 图1698使 用 V is u a l J + + 编 程 - 图1699使 用 V is u a l J + + 编 程 - 图1700自 定 义 控 件 是 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

使 用 V is u a l J + + 编 程 - 图1701使 用 V is u a l J + + 编 程 - 图1702使 用 V is u a l J + + 编 程 - 图1703注 意 WFC Comp onent Builder 创 建 了 一 个 骨 架 控 件 这 个 控 件 包括 可 以 在 里 面 填 充 内 容 的 属 性 和 方 法 这 部 分 有 关 如 何 建 立 控 件 的

使 用 V is u a l J + + 编 程 - 图1704使 用 V is u a l J + + 编 程 - 图1705信 息 可 以 帮 助 你 手 工 建 立 控 件 而 且 解 释 建 立 程 序 所 做 的 一 些 事情

使 用 V is u a l J + + 编 程 - 图1706使 用 V is u a l J + + 编 程 - 图1707使 用 V is u a l J + + 编 程 - 图1708使 用 V is u a l J + + 编 程 - 图1709下 面 列 出 一 个 骨 架 控 件 如 果 编 译 它 这 个 控 件 将 在 计 算 机 上 注 册 并且 在 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 {

}

}

使 用 V is u a l J + + 编 程 - 图1710使 用 V is u a l J + + 编 程 - 图1711使 用 V is u a l J + + 编 程 - 图1712使 用 V is u a l J + + 编 程 - 图1713使 用 V is u a l J + + 编 程 - 图1714使 用 V is u a l J + + 编 程 - 图1715使 用 V is u a l J + + 编 程 - 图1716使 用 V is u a l J + + 编 程 - 图1717使 用 V is u a l J + + 编 程 - 图1718如 果 把 这 个 控 件 的 一 个 实 例 添 加 到 一 个 窗 体 中 在 属 性 窗 口 中 将 会 看 到它 的 属 性 和 事 件 可 以 改 变 这 些 属 性 也 可 以 看 到 这 个 控 件 已 经 支 持 背景 色 前 景 色 锚 点 停 靠 鼠 标 事 件 焦 点 甚 至 更 多

使 用 V is u a l J + + 编 程 - 图1719c o m .m s. w fc .u i . C o n t ro l 类 定 义 这 些 共 同 属 性 和 事 件 的 默 认 实 现

添 加 控 件 描 述

使 用 V is u a l J + + 编 程 - 图1720使 用 V is u a l J + + 编 程 - 图1721使 用 V is u a l J + + 编 程 - 图1722使 用 V is u a l J + + 编 程 - 图1723可 以 为 公 布 Ac t iv e X 控 件 的 控 件 添 加 文 本 描 述 然 后 主 应 用 程 序 可 以查 询 和 显 示 这 个 描 述 为 创 建 一 个 描 述 需 在 C la ssIn fo 类 中 添 加 一 个

使 用 V is u a l J + + 编 程 - 图1724使 用 V is u a l J + + 编 程 - 图1725D 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" ) ) ;

}

为 类 事 件 提 供 功 能

使 用 V is u a l J + + 编 程 - 图1726使 用 V is u a l J + + 编 程 - 图1727使 用 V is u a l J + + 编 程 - 图1728使 用 V is u a l J + + 编 程 - 图1729c o m .m s. w fc .u i . C o n t ro l 类 使 用 默 认 功 能 公 布 了 一 个 共 同 的 成 员 集 例 如如 果 如 前 所 述 创 建 了 基 本 控 件 则 在 P rope r t ie s 窗 口 中 它 的 文 本 属 性 是可 用 的

  • 使 用 V is u a l J + + 编 程 - 图1730使 用 V is u a l J + + 编 程 - 图1731使 用 V is u a l J + + 编 程 - 图1732使 用 V is u a l J + + 编 程 - 图1733使 用 V is u a l J + + 编 程 - 图1734使 用 V is u a l J + + 编 程 - 图1735使 用 V is u a l J + + 编 程 - 图1736使 用 V is u a l J + + 编 程 - 图1737使 用 V is u a l J + + 编 程 - 图1738使 用 V is u a l J + + 编 程 - 图1739使 用 V is u a l J + + 编 程 - 图1740般 情 况 下 要 向 控 件 中 添 加 功 能 必 须 为 通 过 基 类 公 布 的 控 件 超 越 成员 W F C 中 的 大 多 数 事 件 公 布 在 它 们 带 有 保 护 的 on< 事 件 名 > 成 员 的 基类 上 这 可 以 让 子 类 不 必 与 事 件 处 理 程 序 联 系 就 可 以 超 越 事 件 在 超 越代 码 中 定 义 所 需 要 事 件 的 功 能 通 常 通 过 调 用 超 类 事 件 实 现 成 员 的默 认 功 能 通 过 公 布 所 调 用 的 超 类 事 件 可 以 指 定 事 件 触 发 的 顺 序

使 用 V is u a l J + + 编 程 - 图1741使 用 V is u a l J + + 编 程 - 图1742使 用 V is u a l J + + 编 程 - 图1743使 用 V is u a l J + + 编 程 - 图1744使 用 V is u a l J + + 编 程 - 图1745使 用 V is u a l J + + 编 程 - 图1746注 意 当 没 有 创 建 在 超 类 中 定 义 的 事 件 的 子 类 时 还 有 另 外 的 方 法接 收 事 件 详 情 参 见 本 章 后 面 的 使 用 控 件 事 件

使 用 V is u a l J + + 编 程 - 图1747使 用 V is u a l J + + 编 程 - 图1748使 用 V is u a l J + + 编 程 - 图1749下 面 举 例 说 明 怎 样 能 超 越 这 个 保 护 的 onP a int 方 法 来 定 义 什 么 样 的 控件 应 该 在 运 行 时 显 示 在 这 个 例 子 中 首 先 调 用 超 类 事 件 执 行 超 类 拥 有

使 用 V is u a l J + + 编 程 - 图1750使 用 V is u a l J + + 编 程 - 图1751的 绘 图 方 法 控 件 拥 有 的 代 码 通 过 调 用 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 {

}

}

使 用 V is u a l J + + 编 程 - 图1752使 用 V is u a l J + + 编 程 - 图1753使 用 V is u a l J + + 编 程 - 图1754使 用 V is u a l J + + 编 程 - 图1755使 用 V is u a l J + + 编 程 - 图1756使 用 V is u a l J + + 编 程 - 图1757使 用 V is u a l J + + 编 程 - 图1758使 用 V is u a l J + + 编 程 - 图1759在 这 个 例 子 中 通 过 调 用 控 件 的 ge t T e x t 方 法 检 索 存 储 在 控 件 中 的 文 本从 而 显 示 文 本 当 编 译 并 且 添 加 类 的 新 版 本 时 现 在 控 件 就 包 含 了 键入 到 文 本 属 性 的 一 切 文 本 因 为 c o m .m s. w fc .u i . C o n t ro l 类 提 供 了 文 本 属性 所 以 没 有 必 要 再 创 建 一 个 新 的

使 用 V is u a l J + + 编 程 - 图1760使 用 V is u a l J + + 编 程 - 图1761O n P a in t 的 参 数 是 P a in tE v e n t 它 包 含 了 事 件 特 定 的 数 据 当 创 建 保 护

使 用 V is u a l J + + 编 程 - 图1762使 用 V is u a l J + + 编 程 - 图1763成 员 的 子 类 时 已 经 隐 含 知 道 了 发 送 事 件 的 对 象 因 为 这 个 发 送 者 是 th is

使 用 V is u a l J + + 编 程 - 图1764使 用 V is u a l J + + 编 程 - 图1765使 用 V is u a l J + + 编 程 - 图1766使 用 V is u a l J + + 编 程 - 图1767 类 的 当 前 实 例 使 用 V is u a l J + + 编 程 - 图1768 事 件 数 据 随 着 事 件 的 不 同 而 不 同 在 这 种 情 况 下

使 用 V is u a l J + + 编 程 - 图1769P 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;

}

使 用 V is u a l J + + 编 程 - 图1770使 用 V is u a l J + + 编 程 - 图1771使 用 V is u a l J + + 编 程 - 图1772使 用 V is u a l J + + 编 程 - 图1773使 用 V is u a l J + + 编 程 - 图1774使 用 V is u a l J + + 编 程 - 图1775使 用 V is u a l J + + 编 程 - 图1776使 用 V is u a l J + + 编 程 - 图1777使 用 V is u a l J + + 编 程 - 图1778使 用 V is u a l J + + 编 程 - 图1779使 用 V is u a l J + + 编 程 - 图1780使 用 V is u a l J + + 编 程 - 图1781使 用 V is u a l J + + 编 程 - 图1782使 用 V is u a l J + + 编 程 - 图1783使 用 V is u a l J + + 编 程 - 图1784P 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 使 用 V is u a l J + + 编 程 - 图1785 一 个 W in 3 2 设 备 的 上 下 文 G ra ph ic s 对 象 公布 方 法 来 绘 制 字 符 串 行 位 置 省 略 号 等 等 可 以 改 变 字 体 前 景 色和 背 景 色 属 性 的 值 这 将 正 确 显 示 因 为 通 过 P a in tE v e n t 事 件 传 入 的G ra ph ic s 对 象 是 使 用 基 于 控 件 中 设 置 的 正 确 字 体 和 刷 子 建 立 的 有 关 绘图 的 更 详 细 资 料 参 见 本 章 后 面 的 修 改 可 视 显 示 部 分

使 用 窗 口 句 柄

使 用 V is u a l J + + 编 程 - 图1786使 用 V is u a l J + + 编 程 - 图1787使 用 V is u a l J + + 编 程 - 图1788使 用 V is u a l J + + 编 程 - 图1789使 用 V is u a l J + + 编 程 - 图1790C on tro l 基 类 通 过 扩 展 c o m .m s . w fc .a pp .W indow 的 私 有 成 员 封 装 W in 3 2 HW N D 句 柄 使 用 V is u a l J + + 编 程 - 图1791 W ind ow 类 管 理 为 控 件 创 建 的 HW N D 窗 口 过 程 子 类无 论 什 么 时 候 需 要 一 个 带 有 调 用 C on tro l .g e t H a nd le 的 句 柄 如 果 需 要

使 用 V is u a l J + + 编 程 - 图1792使 用 V is u a l J + + 编 程 - 图1793使 用 V is u a l J + + 编 程 - 图1794就 会 创 建 这 个 句 柄 或 句 柄 存 在 时 就 返 回 句 柄 创 建 句 柄 时 C on tro l

使 用 V is u a l J + + 编 程 - 图1795使 用 V is u a l J + + 编 程 - 图1796使 用 V is u a l J + + 编 程 - 图1797使 用 V is u a l J + + 编 程 - 图1798使 用 V is u a l J + + 编 程 - 图1799使 用 V is u a l J + + 编 程 - 图1800使 用 V is u a l J + + 编 程 - 图1801使 用 V is u a l J + + 编 程 - 图1802使 用 V is u a l J + + 编 程 - 图1803类 首 先 调 用 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 事 件 因 此 在 创 建 和 撤 消 句 柄 事 件 期 间 这 个 句 柄是 合 法 的

使 用 V is u a l J + + 编 程 - 图1804使 用 V is u a l J + + 编 程 - 图1805使 用 V is u a l J + + 编 程 - 图1806任 何 给 定 句 柄 的 生 存 期 都 是 通 过 控 件 的 实 现 来 确 定 的 但 是 任 何 控 件的 实 例 的 生 存 期 都 不 依 赖 于 句 柄 的 生 存 期

使 用 V is u a l J + + 编 程 - 图1807使 用 V is u a l J + + 编 程 - 图1808使 用 V is u a l J + + 编 程 - 图1809使 用 V is u a l J + + 编 程 - 图1810使 用 V is u a l J + + 编 程 - 图1811使 用 V is u a l J + + 编 程 - 图1812使 用 V is u a l J + + 编 程 - 图1813使 用 V is u a l J + + 编 程 - 图1814W 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

}

使 用 V is u a l J + + 编 程 - 图1815使 用 V is u a l J + + 编 程 - 图1816使 用 V is u a l J + + 编 程 - 图1817通 常 在 使 用 控 件 之 前 立 即 利 用 句 柄 得 到 它 是 最 安 全 的

使 用 V is u a l J + + 编 程 - 图1818使 用 V is u a l J + + 编 程 - 图1819使 用 V is u a l J + + 编 程 - 图1820使 用 V is u a l J + + 编 程 - 图1821使 用 V is u a l J + + 编 程 - 图1822使 用 V is u a l J + + 编 程 - 图1823使 用 V is u a l J + + 编 程 - 图1824使 用 V is u a l J + + 编 程 - 图1825使 用 V is u a l J + + 编 程 - 图1826有 时 可 能 需 要 调 用 recre a te H a n d le 方 法 来 重 新 创 建 句 柄 先 撤 消 然 后立 即 再 次 创 建 使 用 V is u a l J + + 编 程 - 图1827 如 果 调 用 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 检 索 状 态 的 特 殊 逻 辑 一 个 例 子是 列 表 框 如 果 句 柄 重 建 你 可 能 想 从 破 坏 的 句 柄 的 列 表 框 中 保 存 所 有

使 用 V is u a l J + + 编 程 - 图1828使 用 V is u a l J + + 编 程 - 图1829使 用 V is u a l J + + 编 程 - 图1830使 用 V is u a l J + + 编 程 - 图1831使 用 V is u a l J + + 编 程 - 图1832使 用 V is u a l J + + 编 程 - 图1833使 用 V is u a l J + + 编 程 - 图1834项 如 果 需 要 窗 口 格 式 重 新 应 用 程 序 到 窗 口 而 不 需 要 重 建 句 柄 则 可以 调 用 upda te S ty le s 这 将 调 用 g e t C re ate P a ra m s 方 法 并 且 在 HW N D 中 重 新 应 用 这 个 格 式 和 扩 展 格 式

使 用 V is u a l J + + 编 程 - 图1835使 用 V is u a l J + + 编 程 - 图1836使 用 V is u a l J + + 编 程 - 图1837使 用 V is u a l J + + 编 程 - 图1838使 用 V is u a l J + + 编 程 - 图1839使 用 V is u a l J + + 编 程 - 图1840使 用 V is u a l J + + 编 程 - 图1841使 用 V is u a l J + + 编 程 - 图1842使 用 V is u a l J + + 编 程 - 图1843使 用 V is u a l J + + 编 程 - 图1844使 用 V is u a l J + + 编 程 - 图1845使 用 V is u a l J + + 编 程 - 图1846使 用 V is u a l J + + 编 程 - 图1847注 意 如 果 没 有 创 建 句 柄 调 用 这 些 函 数 不 会 起 任 何 作 用 这 在 属 性 设定 方 法 中 是 有 用 的 因 为 不 想 迫 使 句 柄 创 建 而 如 果 句 柄 已 经 创 建 可能 需 要 改 变 HW N D 通 过 这 个 约 定 就 可 以 不 必 为 简 单 的 属 性 变 化 而强 制 创 建 句 柄 了 较 早 强 制 创 建 句 柄 可 能 代 价 较 大 因 为 用 户 可 能 设 置需 要 句 柄 重 建 的 其 他 属 性 需 要 创 建 句 柄 的 最 好 方 法 只 能 是 显 示 控 件 的可 视 性 但 不 调 整 属 性

W F C 控 件 中 的 线 程

使 用 V is u a l J + + 编 程 - 图1848使 用 V is u a l J + + 编 程 - 图1849使 用 V is u a l J + + 编 程 - 图1850使 用 V is u a l J + + 编 程 - 图1851使 用 V is u a l J + + 编 程 - 图1852使 用 V is u a l J + + 编 程 - 图1853使 用 V is u a l J + + 编 程 - 图1854使 用 V is u a l J + + 编 程 - 图1855Ja 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 派 生 的 所 有 东 西 使 用 V is u a l J + + 编 程 - 图1856 需 要 这 种线 程 模 型 而 多 数 的 W F C 组 件 是 自 由 线 程

使 用 V is u a l J + + 编 程 - 图1857使 用 V is u a l J + + 编 程 - 图1858使 用 V is u a l J + + 编 程 - 图1859使 用 V is u a l J + + 编 程 - 图1860使 用 V is u a l J + + 编 程 - 图1861使 用 V is u a l J + + 编 程 - 图1862使 用 V is u a l J + + 编 程 - 图1863使 用 V is u a l J + + 编 程 - 图1864C 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 并 且 限 制 所 出 现 的 交 叉 线程 调 度 费 用 的 数 量

使 用 V is u a l J + + 编 程 - 图1865使 用 V is u a l J + + 编 程 - 图1866使 用 V is u a l J + + 编 程 - 图1867使 用 V is u a l J + + 编 程 - 图1868使 用 V is u a l J + + 编 程 - 图1869使 用 V is u a l J + + 编 程 - 图1870使 用 V is u a l J + + 编 程 - 图1871使 用 V is u a l J + + 编 程 - 图1872使 用 V is u a l J + + 编 程 - 图1873使 用 V is u a l J + + 编 程 - 图1874注 意 Windows 消 息 循 环 依 赖 于 在 上 面 创 建 HWND 的 线 程 如 果 在一 个 新 线 程 上 创 建 控 件 的 HWND 则 这 个 新 线 程 不 再 接 收 信 息 对更 详 细 的 资 料 参 见 第 1 2 章 W F C 编 程 概 念 中 的 使 用 WFC 和 Java 线 程

使 用 V is u a l J + + 编 程 - 图1875使 用 V is u a l J + + 编 程 - 图1876使 用 V is u a l J + + 编 程 - 图1877使 用 V is u a l J + + 编 程 - 图1878使 用 V is u a l J + + 编 程 - 图1879使 用 V is u a l J + + 编 程 - 图1880使 用 V is u a l J + + 编 程 - 图1881虽 然 大 多 数 W F C 组 件 支 持 自 由 线 程 但 大 多 数 方 法 调 用 不 是 同 步 的同 步 调 用 非 常 昂 贵 只 有 需 要 时 才 会 这 样 做 例 如 在 对 象 上 同 步 调 用多 个 方 法 将 得 到 非 常 有 用 的 执 行 结 果

定 义 控 件 属 性

使 用 V is u a l J + + 编 程 - 图1882使 用 V is u a l J + + 编 程 - 图1883使 用 V is u a l J + + 编 程 - 图1884使 用 V is u a l J + + 编 程 - 图1885大 多 数 控 件 公 布 一 个 允 许 用 户 确 定 控 件 行 为 和 外 表 的 设 置 或 属 性 在W F C 控 件 中 可 以 使 用 ge t 和 se t 函 数 把 属 性 创 建 为 成 员 但 是 W F C 还 提 供 类 和 接 口 帮 助 用 户 把 控 件 集 成 到 设 计 阶 段 环 境 中

使 用 V is u a l J + + 编 程 - 图1886使 用 V is u a l J + + 编 程 - 图1887下 面 提 供 有 关 在 控 件 中 创 建 公 布 和 自 定 义 属 性 的 信 息

创 建 和 公 布 属 性

使 用 V is u a l J + + 编 程 - 图1888使 用 V is u a l J + + 编 程 - 图1889使 用 V is u a l J + + 编 程 - 图1890定 义 控 件 属 性 与 向 任 何 类 中 添 加 属 性 相 似 除 此 之 外 向 C la ssIn fo 类中 添 加 成 员 可 以 使 属 性 在 P rope r t ie s 窗 口 中 是 可 见 的

添 加 属 性 定 义

使 用 V is u a l J + + 编 程 - 图1891使 用 V is u a l J + + 编 程 - 图1892使 用 V is u a l J + + 编 程 - 图1893使 用 V is u a l J + + 编 程 - 图1894属 性 存 储 在 控 件 的 私 有 成 员 变 量 中 可 以 提 供 一 个 公 共 的 ge t< 属 性 > 方法 来 公 布 属 性 值 如 果 想 使 属 性 是 可 读 写 的 还 可 以 提 供 公 共 的 se t< 属性 > 方 法 用 来 获 取 包 含 新 属 性 值 的 参 数

使 用 V is u a l J + + 编 程 - 图1895使 用 V is u a l J + + 编 程 - 图1896注 意 WFC Compon ent Builder 将 为 用 户 创 建 属 性 骨 架

使 用 V is u a l J + + 编 程 - 图1897在 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 {

使 用 V is u a l J + + 编 程 - 图1898p 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 ( ) {

使 用 V is u a l J + + 编 程 - 图1899r e tu rn m y P r o p

}

使 用 V is u a l J + + 编 程 - 图1900使 用 V is u a l J + + 编 程 - 图1901p u b lic s e t M y P ro p in t n e w V a lu e 使 用 V is u a l J + + 编 程 - 图1902 { m y P ro p = n e w V a lu e

}

}

使 用 V is u a l J + + 编 程 - 图1903使 用 V is u a l J + + 编 程 - 图1904使 用 V is u a l J + + 编 程 - 图1905使 用 V is u a l J + + 编 程 - 图1906使 用 V is u a l J + + 编 程 - 图1907使 用 V is u a l J + + 编 程 - 图1908使 用 V is u a l J + + 编 程 - 图1909注 意 属 性 定 义 中 使 用 的 名 字 应 该 以 一 个 小 写 字 母 开 头 除 非 开 始两 个 字 母 都 是 大 写 紧 跟 在 get 或 set 后 面 的 函 数 名 字 应 该 有 一个 大 写 字 母 例 如 对 text 函 数 应 该 有 getText 和 setText 而对 于 MDIChild 应 该 有 getMDIChil d 和 setMDIChil d

在 设 计 阶 段 公 布 属 性

使 用 V is u a l J + + 编 程 - 图1910使 用 V is u a l J + + 编 程 - 图1911为 了 在 P rope r t ie s 窗 口 中 使 属 性 是 可 见 的 可 以 做 下 列 事 情

  • 使 用 V is u a l J + + 编 程 - 图1912使 用 V is u a l J + + 编 程 - 图1913

    建 指 出 新 属 性 的 类 名 字 和 数 据 类 型 的 P rope r ty Info 类 的 一 个 静 态最 终 实 例

  • 使 用 V is u a l J + + 编 程 - 图1914使 用 V is u a l J + + 编 程 - 图1915超 越 超 类 的 g e t P rope r t ie s 方 法 并 且 添 加 超 类 的 现 有 属 性 其 次 是 新

使 用 V is u a l J + + 编 程 - 图1916属 性

使 用 V is u a l J + + 编 程 - 图1917使 用 V is u a l J + + 编 程 - 图1918使 用 V is u a l J + + 编 程 - 图1919使 用 V is u a l J + + 编 程 - 图1920使 用 V is u a l J + + 编 程 - 图1921使 用 V is u a l J + + 编 程 - 图1922使 用 V is u a l J + + 编 程 - 图1923注 意 getPropert ies 方 法 是 用 于 公 布 方 法 事 件 扩 展 器 使 用 V is u a l J + + 编 程 - 图1924 extender 使 用 V is u a l J + + 编 程 - 图1925 和 类 属 性 的 可 以 使 用 的 几 种 方 法 之 一 有 关 其 他 方 法的 细 节 参 见 本 章 后 面 的 使 用 控 件 事 件

使 用 V is u a l J + + 编 程 - 图1926下 例 显 示 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

}

}

使 用 V is u a l J + + 编 程 - 图1927使 用 V is u a l J + + 编 程 - 图1928使 用 V is u a l J + + 编 程 - 图1929使 用 V is u a l J + + 编 程 - 图1930有 关 使 用 P rope r ty Info 类 的 更 多 信 息 参 见 本 章 后 面 的 指 定 自 定 义 控件 属 性

对 齐 属 性 举 例

使 用 V is u a l J + + 编 程 - 图1931使 用 V is u a l J + + 编 程 - 图1932使 用 V is u a l J + + 编 程 - 图1933使 用 V is u a l J + + 编 程 - 图1934使 用 V is u a l J + + 编 程 - 图1935这 部 分 提 供 S upe r L a b e l 类 对 齐 属 性 的 完 整 举 例 它 允 许 用 户 指 定 如 何要 求 标 签 内 的 文 本 对 齐 靠 左 靠 右 和 居 中 这 个 例 子 说 明 如 何 做 下 列操 作

  • 使 用 V is u a l J + + 编 程 - 图1936定 义 和 公 布 属 性

  • 使 用 V is u a l J + + 编 程 - 图1937使 用 V is u a l J + + 编 程 - 图1938使 用 V is u a l J + + 编 程 - 图1939使 用 枚 举 e num 类 为 属 性 定 义 允 许 使 用 的 值

  • 使 用 V is u a l J + + 编 程 - 图1940为 新 属 性 值 提 供 验 证

  • 使 用 V is u a l J + + 编 程 - 图1941画 控 件 时 使 用 对 齐 属 性 值

  • 使 用 V is u a l J + + 编 程 - 图1942在 设 计 阶 段 公 布 属 性

使 用 V is u a l J + + 编 程 - 图1943使 用 V is u a l J + + 编 程 - 图1944使 用 V is u a l J + + 编 程 - 图1945使 用 V is u a l J + + 编 程 - 图1946这 个 例 子 的 代 码 参 见 本 章 后 面 的 一 个 完 整 例 子

基 本 对 齐 属 性

使 用 V is u a l J + + 编 程 - 图1947使 用 V is u a l J + + 编 程 - 图1948创 建 对 齐 属 性 的 代 码 如 下 所 示 在 se tA lig n m e n t 方 法 中 调 用 in v a lid a te

使 用 V is u a l J + + 编 程 - 图1949使 用 V is u a l J + + 编 程 - 图1950使 用 V is u a l J + + 编 程 - 图1951函 数 间 接 强 制 这 个 控 件 重 画 以 便 它 影 响 新 属 性 值

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

}

创 建 枚 举 属 性 值

使 用 V is u a l J + + 编 程 - 图1952使 用 V is u a l J + + 编 程 - 图1953使 用 V is u a l J + + 编 程 - 图1954使 用 V is u a l J + + 编 程 - 图1955使 用 V is u a l J + + 编 程 - 图1956使 用 V is u a l J + + 编 程 - 图1957使 用 V is u a l J + + 编 程 - 图1958使 用 V is u a l J + + 编 程 - 图1959使 用 V is u a l J + + 编 程 - 图1960使 用 V is u a l J + + 编 程 - 图1961使 用 V is u a l J + + 编 程 - 图1962因 为 属 性 只 有 三 个 可 能 的 值 可 以 使 用 一 个 枚 举 e num 使 用 V is u a l J + + 编 程 - 图1963 定 义 它 们虽 然 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

使 用 V is u a l J + + 编 程 - 图1964使 用 V is u a l J + + 编 程 - 图1965使 用 V is u a l J + + 编 程 - 图1966使 用 V is u a l J + + 编 程 - 图1967使 用 V is u a l J + + 编 程 - 图1968枚 举 对 象 在 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 ) ;

}

}

使 用 V is u a l J + + 编 程 - 图1969使 用 V is u a l J + + 编 程 - 图1970使 用 V is u a l J + + 编 程 - 图1971注 意 把 有 效 的 方 法 创 建 为 静 态 成 员 允 许 用 户 调 用 它 而 不 必 先 创建 一 个 类 实 例

提 供 属 性 验 证

使 用 V is u a l J + + 编 程 - 图1972使 用 V is u a l J + + 编 程 - 图1973使 用 V is u a l J + + 编 程 - 图1974使 用 V is u a l J + + 编 程 - 图1975使 用 V is u a l J + + 编 程 - 图1976使 用 V is u a l J + + 编 程 - 图1977使 用 V is u a l J + + 编 程 - 图1978设 置 属 性 时 为 测 试 用 户 指 定 的 有 效 对 齐 值 可 以 向 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 异 常

使 用 V is u a l J + + 编 程 - 图1979下 例 显 示 使 用 添 加 的 验 证 修 改 的 se tA lig n m e n t 方 法

使 用 V is u a l J + + 编 程 - 图1980使 用 V is u a l J + + 编 程 - 图1981使 用 V is u a l J + + 编 程 - 图1982pu b lic vo id s e t A l ignm en t in t v a lu e 使 用 V is u a l J + + 编 程 - 图1983 { if A lig n S t y le . v a lid ( v a lu e) 使 用 V is u a l J + + 编 程 - 图1984

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

}

使 用 V is u a l J + + 编 程 - 图1985使 用 V is u a l J + + 编 程 - 图1986使 用 V is u a l J + + 编 程 - 图1987使 用 V is u a l J + + 编 程 - 图1988使 用 V is u a l J + + 编 程 - 图1989注 意 有 关 使 用 invalidate 重 画 控 件 的 信 息 参 见 本 章 后 面 的 修改 可 视 显 示

使 用 V is u a l J + + 编 程 - 图1990使 用 V is u a l J + + 编 程 - 图1991使 用 V is u a l J + + 编 程 - 图1992通 过 施 加 W F C In v a l id E num E x c e p tion 可 以 得 到 非 检 查 异 常 和 与 之 关联 的 预 定 义 信 息 这 个 信 息 转 换 成 多 种 语 言 以 便 在 不 同 场 所 运 行 这 个

使 用 V is u a l J + + 编 程 - 图1993使 用 V is u a l J + + 编 程 - 图1994控 件 自 动 获 得 有 意 义 的 错 误 信 息

画 控 件 时 使 用 属 性 值

使 用 V is u a l J + + 编 程 - 图1995使 用 V is u a l J + + 编 程 - 图1996使 用 V is u a l J + + 编 程 - 图1997使 用 V is u a l J + + 编 程 - 图1998使 用 V is u a l J + + 编 程 - 图1999对 齐 属 性 影 响 控 件 中 文 本 的 外 表 所 以 无 论 什 么 时 候 画 控 件 绘 制 代码 必 须 检 查 属 性 值 从 而 使 用 它

使 用 V is u a l J + + 编 程 - 图2000使 用 V is u a l J + + 编 程 - 图2001使 用 V is u a l J + + 编 程 - 图2002使 用 V is u a l J + + 编 程 - 图2003使 用 V is u a l J + + 编 程 - 图2004通 过 超 越 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);

}

在 设 计 阶 段 公 布 属 性

使 用 V is u a l J + + 编 程 - 图2005使 用 V is u a l J + + 编 程 - 图2006使 用 V is u a l J + + 编 程 - 图2007使 用 V is u a l J + + 编 程 - 图2008在 设 计 阶 段 为 使 对 齐 属 性 可 用 需 要 把 C la ssIn fo 分 成 首 先 定 义 属 性 的类 通 过 创 建 P rope r ty Info 的 实 例 使 用 V is u a l J + + 编 程 - 图2009 然 后 通 过 调 用 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 ) ;

}

}

使 用 V is u a l J + + 编 程 - 图2010使 用 V is u a l J + + 编 程 - 图2011使 用 V is u a l J + + 编 程 - 图2012使 用 V is u a l J + + 编 程 - 图2013使 用 V is u a l J + + 编 程 - 图2014注 意 传 递 到 PropertyIn fo 的 第 三 个 参 数 使 用 V is u a l J + + 编 程 - 图2015在 这 里 是AlignStyle .class 使 用 V is u a l J + + 编 程 - 图2016 是 属 性 的 正 常 数 据 类 型 然 而 因 为 这 个 属 性是 一 个 枚 举 值 所 以 传 递 创 建 扩 展 Enum 的 类

使 用 V is u a l J + + 编 程 - 图2017因 为 A lig n S tyle 是 从 E num 类 派 生 的 所 以 P rope r t ie s 窗 口 使 用 与 E num

使 用 V is u a l J + + 编 程 - 图2018使 用 V is u a l J + + 编 程 - 图2019类 相 关 的 编 辑 器 结 果 是 允 许 设 置 属 性 值 的 下 拉 列 表

使 用 V is u a l J + + 编 程 - 图2020使 用 V is u a l J + + 编 程 - 图2021使 用 V is u a l J + + 编 程 - 图2022使 用 V is u a l J + + 编 程 - 图2023使 用 V is u a l J + + 编 程 - 图2024使 用 V is u a l J + + 编 程 - 图2025使 用 V is u a l J + + 编 程 - 图2026注 意 为 创 建 不 在 设 计 阶 段 公 布 的 属 性 使 用 V is u a l J + + 编 程 - 图2027 例 如 只 是 运 行 时 属 性 使 用 V is u a l J + + 编 程 - 图2028使 用 PropertyIn fo 对 象 把 BrowsableA ttribute 属 性 设 置 为 N O 详 情 参 见 本 章 后 面 的 指 定 自 定 义 控 件 属 性 的 属 性

一 个 完 整 例 子

使 用 V is u a l J + + 编 程 - 图2029使 用 V is u a l J + + 编 程 - 图2030下 例 显 示 使 用 了 对 齐 属 性 的 完 整 标 签 控 件 这 个 对 齐 属 性 包 括 了 前 面 讨论 的 所 有 特 征

// 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 ) ;

}

}

}

指 定 自 定 义 控 件 属 性

使 用 V is u a l J + + 编 程 - 图2031当 创 建 控 件 属 性 并 且 创 建 P rope r ty Info 对 象 来 设 置 它 的 属 性 时 , 可 以 指 定不 同 选 项 来 自 定 义 这 个 属 性

使 用 V is u a l J + + 编 程 - 图2032使 用 V is u a l J + + 编 程 - 图2033使 用 V is u a l J + + 编 程 - 图2034使 用 V is u a l J + + 编 程 - 图2035注 意 使 用 PropertyIn fo 类 的 详 细 信 息 已 经 在 本 章 前 面 部 分 定义 控 件 属 性 中 提 供 了

使 用 V is u a l J + + 编 程 - 图2036创 建 P rope r ty Info 对 象 的 基 本 语 法 是

使 用 V is u a l J + + 编 程 - 图2037使 用 V is u a l J + + 编 程 - 图2038new 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 )

使 用 V is u a l J + + 编 程 - 图2039例 如 下 面 是 在 M yc on tro l 控 件 中 名 叫 m y P ro p 的 属 性 的 P ro p e r ty In fo

使 用 V is u a l J + + 编 程 - 图2040对 象

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);

使 用 V is u a l J + + 编 程 - 图2041使 用 V is u a l J + + 编 程 - 图2042使 用 V is u a l J + + 编 程 - 图2043使 用 V is u a l J + + 编 程 - 图2044可 以 通 过 为 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 得 到 的 属 性 可 以 创 建 和 添 加 自 己 的 属 性 下 表 列 出

使 用 V is u a l J + + 编 程 - 图2045在 P rope r ty Info 类 中 预 定 义 的 属 性

属性 说明

使 用 V is u a l J + + 编 程 - 图2046B row sa b le A t tr ib u te 指定 在 P ro p e rties 窗口 中属 性 是 否是 可见 的 默认 值

使 用 V is u a l J + + 编 程 - 图2047使 用 V is u a l J + + 编 程 - 图2048使 用 V is u a l J + + 编 程 - 图2049使 用 V is u a l J + + 编 程 - 图2050是 YE S 这个 属性 可 以 与 P e rs is ta b le A t t r ib u te 属性 见下 面 使 用 V is u a l J + + 编 程 - 图2051 联 合 使 用 来 定 义 控 件 属 性 这 个 控 件 属 性 的值保 存 在 控 件 中 但是 在 P ropertie s 窗口 中不 能 编 辑

使 用 V is u a l J + + 编 程 - 图2052Ca te g o ry A t tr ib u te 指定 放 入 P ro p erties 窗口 中的 当 前 控件 属性 的 类 别

使 用 V is u a l J + + 编 程 - 图2053使 用 V is u a l J + + 编 程 - 图2054使 用 V is u a l J + + 编 程 - 图2055使 用 V is u a l J + + 编 程 - 图2056如 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 并且 在 需 要调 用 的 类 别 字 串中传 递它 来 创建 一 个 新类 别

使 用 V is u a l J + + 编 程 - 图2057D a ta B in d a b le A ttrib u te 指 定 控 件 属 性 是 数 据 绑 定 的 候 选 属 性 默 认 值

使 用 V is u a l J + + 编 程 - 图2058使 用 V is u a l J + + 编 程 - 图2059是 .N O 当 这 个 属 性 值 设 为 .Y E S 时 D a ta B in d 将 在下 拉 列表 中 列 出这 个控 件 属 性

使 用 V is u a l J + + 编 程 - 图2060D e fa u lt V a lu e A ttrib u te 简 单 属性 的 默 认值 当用 户在 P ro p e rties 窗口 中重 设

使 用 V is u a l J + + 编 程 - 图2061使 用 V is u a l J + + 编 程 - 图2062使 用 V is u a l J + + 编 程 - 图2063使 用 V is u a l J + + 编 程 - 图2064使 用 V is u a l J + + 编 程 - 图2065属性 值时 使 用 这 个 值 Fo rm s D e s ig n e r 还 比 较 默认值 与 当 前 值 如 果 它们 匹配 则 Fo rm s D e s ig n e r 不生 成 设 置 属 性 值 的 代 码 这 可 以 减 少 为 窗 体 生 成 的代码 量

使 用 V is u a l J + + 编 程 - 图2066使 用 V is u a l J + + 编 程 - 图2067使 用 V is u a l J + + 编 程 - 图2068注意 还 可 以通 过创 建 一 个 r e s e t < 属 性 > 方法 来创 建一 个 默 认 值 详 情 参见 下一 部分 指 定 动 态 默 认 值

使 用 V is u a l J + + 编 程 - 图2069使 用 V is u a l J + + 编 程 - 图2070和永 久 性 属 性

使 用 V is u a l J + + 编 程 - 图2071使 用 V is u a l J + + 编 程 - 图2072不 同 数 据 类 型 的 许 多 公 共 值 都 预 定 义 成 静 态 值 使 用 V is u a l J + + 编 程 - 图2073 例如 对布 尔 值 已 经 定义 了值 TRU E 和 FA L S E 使 用 V is u a l J + + 编 程 - 图2074

使 用 V is u a l J + + 编 程 - 图2075使 用 V is u a l J + + 编 程 - 图2076使 用 V is u a l J + + 编 程 - 图2077D e sc r ip tio nA t t ribu te 当 用 户选 择 当 前控 件属 性 时 定义 在 P ro p erties 窗口

的 底 部显 示 的 文本 默认 值是

使 用 V is u a l J + + 编 程 - 图2078

L o c a liza b leA t tr ib u te

如 果 用 户 选 择 本 地 化 一 个 窗 体

则 指 定 控 件 属

性 存

储在 源 文 件 中 默认 值 是 NO

然 后 用户 可以 不

必 修

使 用 V is u a l J + + 编 程 - 图2079使 用 V is u a l J + + 编 程 - 图2080使 用 V is u a l J + + 编 程 - 图2081改 代 码而 本 地 化这 个源 文 件

使 用 V is u a l J + + 编 程 - 图2082P e rs is ta b le A t t r ib u te 在 设 计 阶 段 保 存 控 件 属 性 的 包 容 器 时 指 定 是 否 保

使 用 V is u a l J + + 编 程 - 图2083使 用 V is u a l J + + 编 程 - 图2084使 用 V is u a l J + + 编 程 - 图2085使 用 V is u a l J + + 编 程 - 图2086使 用 V is u a l J + + 编 程 - 图2087使 用 V is u a l J + + 编 程 - 图2088使 用 V is u a l J + + 编 程 - 图2089使 用 V is u a l J + + 编 程 - 图2090使 用 V is u a l J + + 编 程 - 图2091使 用 V is u a l J + + 编 程 - 图2092存 这 个 控 件 属 性 的 值 默认 值是 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 窗口 使用 的 自

使 用 V is u a l J + + 编 程 - 图2093使 用 V is u a l J + + 编 程 - 图2094使 用 V is u a l J + + 编 程 - 图2095使 用 V is u a l J + + 编 程 - 图2096使 用 V is u a l J + + 编 程 - 图2097使 用 V is u a l J + + 编 程 - 图2098定义 编 辑 器 如 果 指定 一个 无 值 编辑 器 则 P ro p e rtie s 窗 口 使 用 一 个 与 控 件 属 性 的 数 据 类 型 相 关 的 编 辑器 有 关 详 情 参 见 本 章 后 面 的 创 建 自 定 义 属 性值编 辑 器

使 用 V is u a l J + + 编 程 - 图2099使 用 V is u a l J + + 编 程 - 图2100使 用 V is u a l J + + 编 程 - 图2101使 用 V is u a l J + + 编 程 - 图2102为 了 指 定 一 个 属 性 需 要 创 建 一 个 所 需 属 性 的 实 例 或 者 使 用 一 个 预 定 义实 例 例 如 B row sa b le A t t r ibu te . N O 使 用 V is u a l J + + 编 程 - 图2103 然 后 使 用 如 下 语 法 把 它 添 加 到P rope r ty Info 定 义 中

使 用 V is u a l J + + 编 程 - 图2104使 用 V is u a l J + + 编 程 - 图2105使 用 V is u a l J + + 编 程 - 图2106new 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

使 用 V is u a l J + + 编 程 - 图2107使 用 V is u a l J + + 编 程 - 图2108[M e m b er A ttrib u te [M e m b er A ttrib u te ...] ] )

使 用 V is u a l J + + 编 程 - 图2109下 例 显 示 如 何 使 用 预 定 义 属 性 为 m y P ro p 控 件 属 性 定 义 一 个 描 述 和 默 认值

pub lic s ta t ic fina l P rop e rty In fo m y P rop=

使 用 V is u a l J + + 编 程 - 图2110n 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 ) ;

使 用 V is u a l J + + 编 程 - 图2111使 用 V is u a l J + + 编 程 - 图2112使 用 V is u a l J + + 编 程 - 图2113使 用 V is u a l J + + 编 程 - 图2114使 用 V is u a l J + + 编 程 - 图2115使 用 V is u a l J + + 编 程 - 图2116使 用 V is u a l J + + 编 程 - 图2117使 用 V is u a l J + + 编 程 - 图2118使 用 V is u a l J + + 编 程 - 图2119使 用 V is u a l J + + 编 程 - 图2120使 用 V is u a l J + + 编 程 - 图2121只 需 把 属 性 作 为 参 数 包 括 到 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

指 定 动 态 默 认 值 和 永 久 性 属 性

使 用 V is u a l J + + 编 程 - 图2122使 用 V is u a l J + + 编 程 - 图2123使 用 V is u a l J + + 编 程 - 图2124使 用 V is u a l J + + 编 程 - 图2125使 用 V is u a l J + + 编 程 - 图2126使 用 V is u a l J + + 编 程 - 图2127使 用 V is u a l J + + 编 程 - 图2128使 用 V is u a l J + + 编 程 - 图2129使 用 V is u a l J + + 编 程 - 图2130使 用 V is u a l J + + 编 程 - 图2131使 用 V is u a l J + + 编 程 - 图2132与 指 定 自 定 义 控 件 属 性 的 属 性 中 描 述 的 一 样 当 创 建 一 个 新 的P rope r ty Info 对 象 时 为 设 置 一 个 属 性 的 默 认 值 可 以 指 定 一 个D e fa u ltV a lu e A t t rib u te 属 性 有 时 可 能 想 指 定 一 个 默 认 动 态 值 这 指的 是 在 运 行 时 计 算 的 值 同 样 在 运 行 时 条 件 的 基 础 上 可 能 想 指 定 一 个永 久 属 性 值 使 用 V is u a l J + + 编 程 - 图2133 在 设 计 阶 段 保 存 使 用 V is u a l J + + 编 程 - 图2134

设 置 永 久 属 性 值

使 用 V is u a l J + + 编 程 - 图2135使 用 V is u a l J + + 编 程 - 图2136使 用 V is u a l J + + 编 程 - 图2137使 用 V is u a l J + + 编 程 - 图2138使 用 V is u a l J + + 编 程 - 图2139使 用 V is u a l J + + 编 程 - 图2140使 用 V is u a l J + + 编 程 - 图2141使 用 V is u a l J + + 编 程 - 图2142使 用 V is u a l J + + 编 程 - 图2143默 认 情 况 下 在 设 计 阶 段 当 一 个 控 件 的 属 性 值 从 默 认 值 发 生 变 化 时使 用 V is u a l J + + 编 程 - 图2144 与在 P rope r t ie s 窗 口 中 一 样 使 用 V is u a l J + + 编 程 - 图2145 无 论 什 么 时 候 保 存 主 控 件 都 要 保 存 控 件 的属 性 值 例 如 如 果 在 V isu a l J + + 窗 体 中 实 例 化 控 件 并 且 P rope rtie s 窗 口 中 如 果 改 变 属 性 的 值 则 保 存 窗 体 时 也 就 保 存 了 这 个 属 性 的 值

使 用 V is u a l J + + 编 程 - 图2146使 用 V is u a l J + + 编 程 - 图2147使 用 V is u a l J + + 编 程 - 图2148使 用 V is u a l J + + 编 程 - 图2149使 用 V is u a l J + + 编 程 - 图2150使 用 V is u a l J + + 编 程 - 图2151使 用 V is u a l J + + 编 程 - 图2152使 用 V is u a l J + + 编 程 - 图2153使 用 V is u a l J + + 编 程 - 图2154使 用 V is u a l J + + 编 程 - 图2155使 用 V is u a l J + + 编 程 - 图2156使 用 V is u a l J + + 编 程 - 图2157使 用 V is u a l J + + 编 程 - 图2158使 用 V is u a l J + + 编 程 - 图2159为 了 更 有 效 率 如 果 属 性 值 与 它 的 默 认 值 相 匹 配 则 这 个 值 不 是 永 久 的在 少 量 的 实 例 中 可 能 要 在 运 行 时 条 件 的 基 础 上 指 定 一 个 永 久 属 性 值 为 使 控 件 保 持 永 久 性 需 超 越 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( ) {

使 用 V is u a l J + + 编 程 - 图2160retu rn fo n t != n u ll

}

使 用 V is u a l J + + 编 程 - 图2161使 用 V is u a l J + + 编 程 - 图2162使 用 V is u a l J + + 编 程 - 图2163使 用 V is u a l J + + 编 程 - 图2164使 用 V is u a l J + + 编 程 - 图2165使 用 V is u a l J + + 编 程 - 图2166使 用 V is u a l J + + 编 程 - 图2167使 用 V is u a l J + + 编 程 - 图2168使 用 V is u a l J + + 编 程 - 图2169使 用 V is u a l J + + 编 程 - 图2170使 用 V is u a l J + + 编 程 - 图2171注 意 比 较 上 述 说 明 周 围 属 性 使 用 V is u a l J + + 编 程 - 图2172 它 们 的 值 是 从 父 属 性 继 承 的 使 用 V is u a l J + + 编 程 - 图2173 例如 字 体 和 背 景 色 返 回 null 代 表 它 们 被 设 置 成 默 认 值 但 是 明确 地 获 得 这 样 属 性 的 值 例 如 调 用 getFont 方 法 则 返 回 实际 字 体 信 息

计 算 动 态 默 认 值

使 用 V is u a l J + + 编 程 - 图2174使 用 V is u a l J + + 编 程 - 图2175使 用 V is u a l J + + 编 程 - 图2176为 了 给 在 运 行 时 属 性 创 建 一 个 默 认 值 需 要 为 这 个 属 性 创 建 一 个 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();

}

使 用 V is u a l J + + 编 程 - 图2177使 用 V is u a l J + + 编 程 - 图2178还 可 以 超 越 从 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 is u a l J + + 编 程 - 图2179使 用 V is u a l J + + 编 程 - 图2180使 用 V is u a l J + + 编 程 - 图2181使 用 V is u a l J + + 编 程 - 图2182使 用 V is u a l J + + 编 程 - 图2183V isu a l J + + 6 . 0 的 P rope r t ie s 窗 口 为 公 布 在 控 件 中 的 属 性 值 提 供 了 编 辑 能力 事 实 上 P rope r t ie s 窗 口 正 好 是 一 个 真 正 的 主 编 辑 器 可 以 指 定 一个 自 定 义 编 辑 器 或 者 可 以 依 靠 P rope r t ie s 窗 口 的 默 认 编 辑 能 力

使 用 V is u a l J + + 编 程 - 图2184使 用 V is u a l J + + 编 程 - 图2185使 用 V is u a l J + + 编 程 - 图2186使 用 V is u a l J + + 编 程 - 图2187使 用 V is u a l J + + 编 程 - 图2188使 用 V is u a l J + + 编 程 - 图2189这 种 机 制 是 这 样 的 P rope r t ie s 窗 口 首 先 检 查 你 是 否 指 定 了 自 定 义 值 编辑 器 如 果 没 有 它 将 在 属 性 类 型 的 类 中 寻 找 一 个 名 叫 Ed i t 的 内 部 类如 果 没 有 发 现 编 辑 器 它 遍 历 类 型 层 寻 找 具 有 编 辑 器 的 任 何 超 类 因 为有 一 个 与 ja va . la n g.O b je c t 关 联 的

使 用 V is u a l J + + 编 程 - 图2190使 用 V is u a l J + + 编 程 - 图2191使 用 V is u a l J + + 编 程 - 图2192使 用 V is u a l J + + 编 程 - 图2193使 用 V is u a l J + + 编 程 - 图2194O b je c t E d ito r 类 所 以 总 会 发 现 一 个 编 辑 器 P rope r tie s 窗 口 将 为 所 有 简单 类 型 提 供 一 个 默 认 编 辑 器 如 字 串 编 辑 器 整 数 编 辑 器 等 等

使 用 V is u a l J + + 编 程 - 图2195指 定 自 定 义 值 编 辑 器 的 原 因 有 许 多 典 型 的 自 定 义 属 性 编 辑

使 用 V is u a l J + + 编 程 - 图2196器 任 务 包 括

  • 文 本 向 值 的 转 换

  • 值 绘 制

  • 指 定 值 的 子 属 性

  • 显 示 自 定 义 对 话 框

  • 显 示 自 定 义 下 拉 列 表

  • 使 用 V is u a l J + + 编 程 - 图2197通 过 指 定 一 个 应 该 取 代 指 定 值 的 常 数 名 来 参 与 代 码 生 成

使 用 V is u a l J + + 编 程 - 图2198使 用 V is u a l J + + 编 程 - 图2199使 用 V is u a l J + + 编 程 - 图2200详 情 参 见 下 一 部 分 定 义 自 定 义 值 编 辑 器

定 义 自 定 义 值 编 辑 器

使 用 V is u a l J + + 编 程 - 图2201使 用 V is u a l J + + 编 程 - 图2202使 用 V is u a l J + + 编 程 - 图2203使 用 V is u a l J + + 编 程 - 图2204为 创 建 自 定 义 值 编 辑 器 必 须 实 现 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 用 以 提 供 所 有 成 员 的默 认 实 现

使 用 V is u a l J + + 编 程 - 图2205使 用 V is u a l J + + 编 程 - 图2206使 用 V is u a l J + + 编 程 - 图2207使 用 V is u a l J + + 编 程 - 图2208使 用 V is u a l J + + 编 程 - 图2209使 用 V is u a l J + + 编 程 - 图2210为 创 建 在 P rope r t ie s 窗 口 中 显 示 的 值 作 为 字 串 使 用 V is u a l J + + 编 程 - 图2211 超 越 ge t T e x t F ro m 方 法 为 改 变 在 控 件 中 受 到 影 响 的 值 并 且 在 P rope r t ie s 窗 口 中 显 示超 越 g e t V a lue F rom 方 法

使 用 V is u a l J + + 编 程 - 图2212使 用 V is u a l J + + 编 程 - 图2213使 用 V is u a l J + + 编 程 - 图2214使 用 V is u a l J + + 编 程 - 图2215使 用 V is u a l J + + 编 程 - 图2216使 用 V is u a l J + + 编 程 - 图2217下 面 例 子 说 明 一 个 在 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 ) ) ;

}

}

使 用 V is u a l J + + 编 程 - 图2218为 使 用 正 确 的 编 辑 器 交 换 信 息 而 通 过 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 把 值 转换 为 字 符串

使 用 V is u a l J + + 编 程 - 图2219使 用 V is u a l J + + 编 程 - 图2220G 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 窗口 的 一 个列 表 中显示 这 些 数 组

使 用 V is u a l J + + 编 程 - 图2221G e t V a lu e F ro m T e x t 从 一 个字 符 串 返回 一个 值 必须 实现 这个 方 法

Pa in t V a lu e 在 指 定的 范 围 内描 述一 个 值 的表 示法

使 用 V is u a l J + + 编 程 - 图2222使 用 V is u a l J + + 编 程 - 图2223使 用 V is u a l J + + 编 程 - 图2224两 个 附 加 方 法 — — 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 对 象 可 以 作 为 构 造 器 的 一 部 分 正 常 传 递

使 用 V is u a l J + + 编 程 - 图2225使 用 V is u a l J + + 编 程 - 图2226ge t S tyle 方 法 用 于 获 取 和 设 置 在 值 编 辑 器 中 指 定 行 为 的 标 志 有 效 的 格式 是

  • S T Y L E _ NO E D IT AB L E T E XT 表 明 值 编 辑 器 不 支 持 在

使 用 V is u a l J + + 编 程 - 图2227使 用 V is u a l J + + 编 程 - 图2228使 用 V is u a l J + + 编 程 - 图2229使 用 V is u a l J + + 编 程 - 图2230g e t V a lue F rom T e xt 方 法 中 接 收 任 意 文 本 它 应 该 接 收 从g e t T ex t F ro m V alu e 返 回 的 文 本 一 般 情 况 下 这 个 格 式 将 导 致 属 性 编辑 器 禁 止 在 值 编 辑 器 类 型 的 属 性 编 辑 框 中 键 入 字 符

  • 使 用 V is u a l J + + 编 程 - 图2231使 用 V is u a l J + + 编 程 - 图2232使 用 V is u a l J + + 编 程 - 图2233S T Y L E_ P A IN TV A L U E 表 明 实 现 pa in t V a lue 方 法 的 值 编 辑 器 一 般情 况 下 这 将 导 致 属 性 编 辑 器 描 述 值 编 辑 器 类 型 的 属 性 表 示 法

  • 使 用 V is u a l J + + 编 程 - 图2234使 用 V is u a l J + + 编 程 - 图2235使 用 V is u a l J + + 编 程 - 图2236S T Y L E_ V A L U ES 表 明 实 现 ge t V a lu e 方 法 的 值 编 辑 器 一 般 情 况 下这 将 导 致 属 性 编 辑 器 显 示 值 编 辑 器 类 型 的 属 性 下 拉 列 表

  • 使 用 V is u a l J + + 编 程 - 图2237使 用 V is u a l J + + 编 程 - 图2238使 用 V is u a l J + + 编 程 - 图2239使 用 V is u a l J + + 编 程 - 图2240S

    T Y L E_ ED IT V A L U E 表 明 实 现 e d it V a lu e 方 法 的 值 编 辑 器 一 般情 况 下 这 将 导 致 属 性 编 辑 器 显 示 一 个 值 编 辑 器 类 型 的 属 性 省 略 按钮

  • 使 用 V is u a l J + + 编 程 - 图2241使 用 V is u a l J + + 编 程 - 图2242使 用 V is u a l J + + 编 程 - 图2243使 用 V is u a l J + + 编 程 - 图2244S

    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 中 显 示 一 个 与 启 动 模 型 对 话 框 不 同 的 下 拉列 表 这 个 格 式 是 很 有 用 的

  • 使 用 V is u a l J + + 编 程 - 图2245使 用 V is u a l J + + 编 程 - 图2246使 用 V is u a l J + + 编 程 - 图2247使 用 V is u a l J + + 编 程 - 图2248使 用 V is u a l J + + 编 程 - 图2249S

    T Y L E_ IM M E D IATE 表 明 这 个 类 型 的 值 适 合 修 改 甚 至 当 这 个 新 值不 完 善 的 时 候 也 可 以 修 改 一 般 情 况 下 这 将 导 致 一 个 属 性 编 辑 器 在编 辑 器 发 生 的 每 一 次 变 化 后 修 改 基 本 属 性 使 用 V is u a l J + + 编 程 - 图2250 例 如 在 编 辑 框 中 输 入 的每 个 字 符 使 用 V is u a l J + + 编 程 - 图2251

  • 使 用 V is u a l J + + 编 程 - 图2252使 用 V is u a l J + + 编 程 - 图2253S

    T Y L E_ P R O P ER T IES 表 明 这 个 类 型 的 值 可 以 有 能 编 辑 的 子 属 性 例如 F ont 对 象 里 的 那 些 值

  • 使 用 V is u a l J + + 编 程 - 图2254使 用 V is u a l J + + 编 程 - 图2255S

    T Y L E _ NO AR R A YE X P A N S ION 表 明 如 果 值 是 一 个 数 组 则 属 性 检查 器 不 能 进 入 数 组

  • 使 用 V is u a l J + + 编 程 - 图2256使 用 V is u a l J + + 编 程 - 图2257S T Y L E _ NO AR R A Y M U L T IS E L E C T 表 明 如 果 值 是 一 个 数 组 则 属 性检 查 器 不 应 该 有 选 择 所 有 数 组 元 素 的 入 口

使 用 V is u a l J + + 编 程 - 图2258使 用 V is u a l J + + 编 程 - 图2259使 用 V is u a l J + + 编 程 - 图2260使 用 V is u a l J + + 编 程 - 图2261使 用 V is u a l J + + 编 程 - 图2262使 用 V is u a l J + + 编 程 - 图2263使 用 V is u a l J + + 编 程 - 图2264使 用 V is u a l J + + 编 程 - 图2265使 用 V is u a l J + + 编 程 - 图2266下 面 例 子 显 示 怎 样 可 以 把 一 个 模 态 对 话 框 显 示 为 自 定 义 属 性 编 辑 器 在这 个 例 子 中 可 以 看 到 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;

}

}

使 用 V is u a l J + + 编 程 - 图2267使 用 V is u a l J + + 编 程 - 图2268使 用 V is u a l J + + 编 程 - 图2269使 用 V is u a l J + + 编 程 - 图2270使 用 V is u a l J + + 编 程 - 图2271使 用 V is u a l J + + 编 程 - 图2272使 用 V is u a l J + + 编 程 - 图2273下 面 例 子 说 明 如 何 显 示 下 拉 对 话 框 当 编 辑 属 性 时 控 件 调 用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 ;

}

}

使 用 控 件 事 件

使 用 V is u a l J + + 编 程 - 图2274使 用 V is u a l J + + 编 程 - 图2275使 用 V is u a l J + + 编 程 - 图2276使 用 V is u a l J + + 编 程 - 图2277使 用 V is u a l J + + 编 程 - 图2278使 用 V is u a l J + + 编 程 - 图2279使 用 V is u a l J + + 编 程 - 图2280使 用 V is u a l J + + 编 程 - 图2281作 为 控 件 的 子 类 控 件 自 动 支 持 一 个 标 准 的 W ind ow s 事 件 设 置 可 以在 控 件 中 捕 获 并 且 处 理 这 些 事 件 并 可 选 择 把 它 们 传 递 到 主 应 用 程 序中 除 此 之 外 还 可 以 定 义 只 有 你 的 控 件 中 才 有 的 自 定 义 事 件 并 且 在需 要 时 激 活 它 们

用 控 件 捕 获 用 户 交 互

使 用 V is u a l J + + 编 程 - 图2282使 用 V is u a l J + + 编 程 - 图2283使 用 V is u a l J + + 编 程 - 图2284在 标 准 事 件 送 到 主 应 用 程 序 之 前 控 件 可 以 捕 获 并 且 处 理 这 些 标 准 事件 交 互 作 用 的 两 个 最 常 见 的 类 型 是 鼠 标 和 键 盘 事 件

捕 获 鼠 标 事 件

使 用 V is u a l J + + 编 程 - 图2285使 用 V is u a l J + + 编 程 - 图2286使 用 V is u a l J + + 编 程 - 图2287使 用 V is u a l J + + 编 程 - 图2288使 用 V is u a l J + + 编 程 - 图2289使 用 V is u a l J + + 编 程 - 图2290使 用 V is u a l J + + 编 程 - 图2291使 用 V is u a l J + + 编 程 - 图2292W 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 除 此 之 外 还 可 以 选 择 接 收 单 击 和 双 击 事 件

使 用 V is u a l J + + 编 程 - 图2293使 用 V is u a l J + + 编 程 - 图2294使 用 V is u a l J + + 编 程 - 图2295使 用 V is u a l J + + 编 程 - 图2296为 了 在 控 件 中 接 收 鼠 标 事 件 可 以 超 越 所 需 的 事 件 为 把 鼠 标 事 件 传 递到 主 应 用 程 序 中 需 调 用 超 类 的 相 应 事 件 方 法

使 用 V is u a l J + + 编 程 - 图2297下 面 这 个 例 子 说 明 如 何 超 越 m ouse M ov e 事 件 处 理 程 序 直 接 显 示 鼠 标

使 用 V is u a l J + + 编 程 - 图2298使 用 V is u a l J + + 编 程 - 图2299的 位 置 这 个 位 置 在 传 递 到 处 理 程 序 的 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

}

捕 获 键 盘 事 件

使 用 V is u a l J + + 编 程 - 图2300使 用 V is u a l J + + 编 程 - 图2301使 用 V is u a l J + + 编 程 - 图2302使 用 V is u a l J + + 编 程 - 图2303使 用 V is u a l J + + 编 程 - 图2304使 用 V is u a l J + + 编 程 - 图2305公 布 的 标 准 键 盘 事 件 是 ke y U p ke y D ow n ke y P re s s 这 些 事 件 是 为 常规 键 和 系 统 键 例 如 F1 到 F1 2 使 用 V is u a l J + + 编 程 - 图2306 触 发 的

使 用 V is u a l J + + 编 程 - 图2307使 用 V is u a l J + + 编 程 - 图2308使 用 V is u a l J + + 编 程 - 图2309使 用 V is u a l J + + 编 程 - 图2310输 入 到 W F C 的 所 有 键 盘 都 使 用 U n ic ode 字 符 数 据 进 行 工 作 当 在 一 个不 支 持 U n ic ode 信 息 的 操 作 系 统 下 像 W ind ow s 95 使 用 V is u a l J + + 编 程 - 图2311 运 行 时 W F C 框架 将 自 动 执 行 所 需 要 的 信 息 过 滤 生 成 U n ic ode 事 件

使 用 V is u a l J + + 编 程 - 图2312下 面 例 子 说 明 在 一 个 控 件 内 如 何 捕 获 键 盘 事 件 这 里 超 越 的 onK e y U p

使 用 V is u a l J + + 编 程 - 图2313方 法 在 把 事 件 传 递 到 主 应 用 程 序 之 前 先 把 数 值 字 符 过 滤 出 来

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

}

}

创 建 自 定 义 事 件

使 用 V is u a l J + + 编 程 - 图2314使 用 V is u a l J + + 编 程 - 图2315W F C 控 件 支 持 从 C on tro l 类 继 承 的 事 件 的 标 准 设 置 如 c lic k

使 用 V is u a l J + + 编 程 - 图2316使 用 V is u a l J + + 编 程 - 图2317使 用 V is u a l J + + 编 程 - 图2318使 用 V is u a l J + + 编 程 - 图2319使 用 V is u a l J + + 编 程 - 图2320使 用 V is u a l J + + 编 程 - 图2321使 用 V is u a l J + + 编 程 - 图2322m ouse D ow n ke y P re s s 等 等 控 件 自 动 公 布 这 些 事 件 并 且 在 自 己 这一 部 分 中 不 用 做 特 殊 的 处 理 就 可 以 在 主 应 用 程 序 中 使 用 它 们 除 非 想超 越 这 个 事 件 来 添 加 特 殊 功 能

使 用 V is u a l J + + 编 程 - 图2323使 用 V is u a l J + + 编 程 - 图2324使 用 V is u a l J + + 编 程 - 图2325使 用 V is u a l J + + 编 程 - 图2326使 用 V is u a l J + + 编 程 - 图2327使 用 V is u a l J + + 编 程 - 图2328使 用 V is u a l J + + 编 程 - 图2329使 用 V is u a l J + + 编 程 - 图2330注 意 有 关 创 建 事 件 处 理 程 序 的 更 多 信 息 在 主 应 用 程 序 中 接 收事 件 参 见 第 1 2 章 有 关 如 何 捕 获 标 准 事 件 并 且 在 控 件 中 处 理 它的 详 情 参 见 本 章 前 面 的 使 用 控 件 捕 获 用 户 交 互

使 用 V is u a l J + + 编 程 - 图2331使 用 V is u a l J + + 编 程 - 图2332使 用 V is u a l J + + 编 程 - 图2333使 用 V is u a l J + + 编 程 - 图2334使 用 V is u a l J + + 编 程 - 图2335使 用 V is u a l J + + 编 程 - 图2336使 用 V is u a l J + + 编 程 - 图2337有 时 你 可 能 想 创 建 只 在 你 的 控 件 才 有 的 自 定 义 事 件 例 如 想 让 控 件使 用 一 个 事 件 来 通 知 状 态 发 生 变 化 的 主 应 用 程 序 例 如 初 始 化 进 程 的完 成 或 者 报 告 一 个 错 误 条 件

使 用 V is u a l J + + 编 程 - 图2338使 用 V is u a l J + + 编 程 - 图2339使 用 V is u a l J + + 编 程 - 图2340使 用 V is u a l J + + 编 程 - 图2341使 用 V is u a l J + + 编 程 - 图2342使 用 V is u a l J + + 编 程 - 图2343使 用 V is u a l J + + 编 程 - 图2344注 意 按 照 约 定 为 标 明 属 性 值 的 变 化 需 要 利 用 下 面 描 述 的 技 术创 建 on<属 性 >Changing 和 on<属 性 >Changed 方 法 更 多 细 节 参 见本 章 后 面 的 提 供 属 性 变 化 通 知

使 用 V is u a l J + + 编 程 - 图2345使 用 V is u a l J + + 编 程 - 图2346使 用 V is u a l J + + 编 程 - 图2347自 定 义 事 件 依 赖 于 V isu a l J + + 委 托 技 术 为 实 现 自 定 义 事 件 需 要 创 建可 以 在 应 用 程 序 中 把 事 件 处 理 程 序 绑 定 到 事 件 的 委 托

使 用 事 件 委 托

使 用 V is u a l J + + 编 程 - 图2348W F C 的 事 件 模 型 使 用 委 托 把 事 件 绑 定 到 处 理 它 们 的 方 法 中 为 了 在

使 用 V is u a l J + + 编 程 - 图2349使 用 V is u a l J + + 编 程 - 图2350使 用 V is u a l J + + 编 程 - 图2351使 用 V is u a l J + + 编 程 - 图2352使 用 V is u a l J + + 编 程 - 图2353使 用 V is u a l J + + 编 程 - 图2354使 用 V is u a l J + + 编 程 - 图2355使 用 V is u a l J + + 编 程 - 图2356V isu a l J + + 中 定 义 一 个 事 件 给 E v e n 类 分 类 然 后 创 建 一 个 基 于 要 绑 定的 c o m .m s. la n g . D e le g a te 的 委 托 类 委 托 允 许 其 他 类 通 过 指 定 处 理 程 序方 法 为 事 件 通 知 注 册 事 件 出 现 时 使 用 V is u a l J + + 编 程 - 图2357 被 调 用 使 用 V is u a l J + + 编 程 - 图2358 委 托 调 用 绑 定 的 方 法 委 托 可 以 绑 定 到 单 个 方 法 中 或 绑 定 到 多 个 方 法 中 这 称 做 多 点 传 送

使 用 V is u a l J + + 编 程 - 图2359使 用 V is u a l J + + 编 程 - 图2360使 用 V is u a l J + + 编 程 - 图2361使 用 V is u a l J + + 编 程 - 图2362使 用 V is u a l J + + 编 程 - 图2363使 用 V is u a l J + + 编 程 - 图2364m u l t ic a s t in g 使 用 V is u a l J + + 编 程 - 图2365 为 事 件 创 建 委 托 时 一 般 是 创 建 一 个 多 点 传 送 事 件 有 少 量 的 异 常 可 以 是 导 致 指 定 进 程 使 用 V is u a l J + + 编 程 - 图2366 显 示 一 个 对 话 框 使 用 V is u a l J + + 编 程 - 图2367 的 事 件 而 这 个指 定 进 程 不 能 感 觉 到 每 个 事 件 重 复 多 遍

使 用 V is u a l J + + 编 程 - 图2368使 用 V is u a l J + + 编 程 - 图2369使 用 V is u a l J + + 编 程 - 图2370使 用 V is u a l J + + 编 程 - 图2371多 点 委 托 维 护 一 个 所 绑 定 到 的 方 法 的 调 用 表 in v o c a tio n lis t 使 用 V is u a l J + + 编 程 - 图2372 多 点 委托 支 持 一 种 组 合 的 方 法 把 一 个 方 法 添 加 到 调 用 表 中 并 且 添 加 一 个 用 来删 除 这 个 新 增 方 法 的 删 除 方 法

  • 使 用 V is u a l J + + 编 程 - 图2373使 用 V is u a l J + + 编 程 - 图2374使 用 V is u a l J + + 编 程 - 图2375使 用 V is u a l J + + 编 程 - 图2376使 用 V is u a l J + + 编 程 - 图2377使 用 V is u a l J + + 编 程 - 图2378使 用 V is u a l J + + 编 程 - 图2379使 用 V is u a l J + + 编 程 - 图2380使 用 V is u a l J + + 编 程 - 图2381个 控 件 通 过 调 用 事 件 的 委 托 可 以 激 活 这 个 事 件 委 托 按 次 序 调 用 绑 定的 方 法 在 大 多 数 情 况 下 使 用 V is u a l J + + 编 程 - 图2382 多 点 委 托 使 用 V is u a l J + + 编 程 - 图2383 委 托 按 次 序 调 用 调 用 表 里 的 每个 绑 定 方 法 提 供 一 个 一 对 多 的 通 告 这 个 策 略 意 味 着 控 件 不 需 要 维 护一 个 用 于 事 件 通 告 的 目 标 对 象 表 委 托 处 理 程 序 全 部 注 册 通 告 和 注销

使 用 V is u a l J + + 编 程 - 图2384使 用 V is u a l J + + 编 程 - 图2385使 用 V is u a l J + + 编 程 - 图2386使 用 V is u a l J + + 编 程 - 图2387使 用 V is u a l J + + 编 程 - 图2388委 托 也 允 许 把 多 个 事 件 绑 定 到 同 一 个 方 法 中 允 许 一 个 多 对 一 的 通 告 例 如 按 钮 单 击 事 件 和 菜 单 命 令 单 击 事 件 都 可 以 调 用 相 同 的 委 托 然 后委 托 调 用 单 个 方 法 用 相 同 的 方 式 处 理 这 两 个 独 立 事 件

使 用 V is u a l J + + 编 程 - 图2389使 用 V is u a l J + + 编 程 - 图2390使 用 V is u a l J + + 编 程 - 图2391使 用 V is u a l J + + 编 程 - 图2392使 用 V is u a l J + + 编 程 - 图2393和 委 托 一 起 使 用 的 绑 定 结 构 是 动 态 的 可 以 在 运 行 时 把 一 个 委 托 绑 定到 调 用 号 与 事 件 处 理 程 序 相 匹 配 的 任 何 方 法 这 个 特 征 允 许 靠 条 件 建 立或 改 变 绑 定 方 法 并 且 把 事 件 处 理 程 序 动 态 附 加 到 控 件 上

创 建 自 定 义 事 件 类

使 用 V is u a l J + + 编 程 - 图2394使 用 V is u a l J + + 编 程 - 图2395使 用 V is u a l J + + 编 程 - 图2396使 用 V is u a l J + + 编 程 - 图2397使 用 V is u a l J + + 编 程 - 图2398使 用 V is u a l J + + 编 程 - 图2399使 用 V is u a l J + + 编 程 - 图2400使 用 V is u a l J + + 编 程 - 图2401使 用 V is u a l J + + 编 程 - 图2402如 果 想 使 用 事 件 传 递 事 件 指 定 数 据 与 C on tro l 类 的 m ouse M ov e 事 件 中x 和 y 属 性 相 似 使 用 V is u a l J + + 编 程 - 图2403 必 须 创 建 一 个 自 定 义 事 件 类 并 且 定 义 它 的 数 据 为创 建 自 定 义 事 件 需 要 给 E v e n t 类 建 立 子 类 为 使 事 件 成 为 一 个 最 高 层的 公 共 类 它 必 须 是 在 一 个 独 立 的 ja v a 文 件 中 在 你 的 类 中 可 以 定义 成 员 来 容 纳 事 件 数 据

使 用 V is u a l J + + 编 程 - 图2404使 用 V is u a l J + + 编 程 - 图2405使 用 V is u a l J + + 编 程 - 图2406使 用 V is u a l J + + 编 程 - 图2407下 面 例 子 显 示 怎 样 创 建 一 个 简 单 错 误 事 件 类 这 个 事 件 类 有 两 个 字 段一 个 用 于 错 误 号 另 一 个 用 于 错 误 信 息 的 文 本

// 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 ;

}

}

创 建 委 托

使 用 V is u a l J + + 编 程 - 图2408使 用 V is u a l J + + 编 程 - 图2409使 用 V is u a l J + + 编 程 - 图2410使 用 V is u a l J + + 编 程 - 图2411为 允 许 事 件 绑 定 需 要 为 事 件 创 建 一 个 用 来 声 明 指 定 调 用 号 的 委 托 处 理程 序 类 如 果 想 把 委 托 绑 定 到 多 个 方 法 中 需 要 把 它 声 明 为 多 个 委 托

使 用 V is u a l J + + 编 程 - 图2412使 用 V is u a l J + + 编 程 - 图2413使 用 V is u a l J + + 编 程 - 图2414委 托 应 该 是 最 高 层 类 所 以 它 应 该 在 一 个 独 立 的 文 件 中下 面 例 子 显 示 前 面 说 明 的 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 ) ;

使 用 V is u a l J + + 编 程 - 图2415使 用 V is u a l J + + 编 程 - 图2416多 点 委 托 必 须 返 回 vo id 因 为 它 们 不 能 返 回 一 个 以 上 方 法 的 结 果

实 现 自 定 义 事 件

使 用 V is u a l J + + 编 程 - 图2417使 用 V is u a l J + + 编 程 - 图2418使 用 V is u a l J + + 编 程 - 图2419使 用 V is u a l J + + 编 程 - 图2420使 用 V is u a l J + + 编 程 - 图2421使 用 V is u a l J + + 编 程 - 图2422为 在 控 件 中 实 现 自 定 义 事 件 需 要 为 主 应 用 程 序 提 供 一 个 方 式 为 事 件 注册 先 创 建 一 个 私 有 委 托 实 例 然 后 创 建 主 应 用 程 序 能 调 用 事 件 注 册 和绑 定 到 指 定 方 法 的 a ddO n< 事 件 > 方 法 如 果 是 多 点 委 托 在 a ddO n< 事件 > 方 法 中 调 用 委 托 的 组 合 方 法 用 来 把 用 户 方 法 添 加 到 委 托 调 用 表 中

使 用 V is u a l J + + 编 程 - 图2423下 面 例 子 显 示 怎 样 为 前 面 说 明 的 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);

}

  • 使 用 V is u a l J + + 编 程 - 图2424使 用 V is u a l J + + 编 程 - 图2425

    情 况 下 还 可 以 提 供 一 个 re m o v e O n < 事 件 > 方 法 以 便 主 应 用 程 序

使 用 V is u a l J + + 编 程 - 图2426能 为 事 件 注 册

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);

}

使 用 V is u a l J + + 编 程 - 图2427使 用 V is u a l J + + 编 程 - 图2428如 果 正 使 用 非 多 点 委 托 则 a ddO n< 事 件 > 方 法 的 语 法 很 简 单

使 用 V is u a l J + + 编 程 - 图2429p 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 ;

}

使 用 V is u a l J + + 编 程 - 图2430使 用 V is u a l J + + 编 程 - 图2431使 用 V is u a l J + + 编 程 - 图2432注 意 从 控 件 得 到 的 Component 类 包 含 实 用 程 序 代 码 用 于 添 加 删除 和 激 活 事 件

在 设 计 阶 段 公 布 事 件

使 用 V is u a l J + + 编 程 - 图2433使 用 V is u a l J + + 编 程 - 图2434使 用 V is u a l J + + 编 程 - 图2435使 用 V is u a l J + + 编 程 - 图2436使 用 V is u a l J + + 编 程 - 图2437使 用 V is u a l J + + 编 程 - 图2438使 用 V is u a l J + + 编 程 - 图2439在 设 计 阶 段 公 布 事 件 与 公 布 属 性 相 似 首 先 创 建 标 有 新 事 件 的 类 名字 和 委 托 的 E v e n t In fo 类 的 一 个 实 例 然 后 超 越 超 类 的 ge t E v e n ts E v e nt In fo 方 法 添 加 超 类 的 存 在 事 件 然 后 再 添 加 新 事 件

使 用 V is u a l J + + 编 程 - 图2440使 用 V is u a l J + + 编 程 - 图2441使 用 V is u a l J + + 编 程 - 图2442使 用 V is u a l J + + 编 程 - 图2443注 意 事 件 名 应 该 以 一 个 小 写 字 母 开 头 使 用 V is u a l J + + 编 程 - 图2444 如 errorEvent 使 用 V is u a l J + + 编 程 - 图2445 除 非开 头 两 个 字 母 都 是 大 写 使 用 V is u a l J + + 编 程 - 图2446 例 如 MIDIChildA ctivated 使 用 V is u a l J + + 编 程 - 图2447

使 用 V is u a l J + + 编 程 - 图2448下 面 举 例 说 明 以 前 看 到 的 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);

}

}

激 活 事 件

使 用 V is u a l J + + 编 程 - 图2449使 用 V is u a l J + + 编 程 - 图2450使 用 V is u a l J + + 编 程 - 图2451使 用 V is u a l J + + 编 程 - 图2452使 用 V is u a l J + + 编 程 - 图2453为 激 活 事 件 需 要 创 建 事 件 类 的 实 例 然 后 把 它 传 递 到 在 类 中 定 义 的 事件 指 定 参 数 中 然 后 调 用 委 托 如 下 例 所 示

// 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 ) ;

使 用 V is u a l J + + 编 程 - 图2454使 用 V is u a l J + + 编 程 - 图2455使 用 V is u a l J + + 编 程 - 图2456使 用 V is u a l J + + 编 程 - 图2457W 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 ) ;

}

}

使 用 V is u a l J + + 编 程 - 图2458使 用 V is u a l J + + 编 程 - 图2459使 用 V is u a l J + + 编 程 - 图2460使 用 V is u a l J + + 编 程 - 图2461如 果 包 括 保 护 成 员 可 以 在 控 件 内 通 过 调 用 事 件 而 不 是 直 接 调 用 调 用方 法 来 激 活 这 个 事 件 如 下 例 所 示

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” ) ) ;

}

一 个 完 整 的 例 子

使 用 V is u a l J + + 编 程 - 图2462使 用 V is u a l J + + 编 程 - 图2463下 面 显 示 一 个 完 整 的 包 括 前 部 分 描 述 的 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 ) ;

}

}

}

提 供 属 性 变 化 通 告

使 用 V is u a l J + + 编 程 - 图2464W F C 为 标 有 属 性 值 正 在 改 变 或 已 经 改 变 的 创 建 事 件 使 用 一 个 命 名 约定

  • 使 用 V is u a l J + + 编 程 - 图2465使 用 V is u a l J + + 编 程 - 图2466使 用 V is u a l J + + 编 程 - 图2467使 用 V is u a l J + + 编 程 - 图2468使 用 V is u a l J + + 编 程 - 图2469使 用 V is u a l J + + 编 程 - 图2470<

    属 性 名 > 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 而 改 变 这 个 属 性

  • 使 用 V is u a l J + + 编 程 - 图2471使 用 V is u a l J + + 编 程 - 图2472为 标 明 一 个 成 功 完 成 了 的 变 化 可 以 激 活 < 属 性 名 >C h a n g e d 事 件

使 用 V is u a l J + + 编 程 - 图2473使 用 V is u a l J + + 编 程 - 图2474注 意 数 据 绑 定 需 要 实 现 < 属 性 名 >Changed 事 件

使 用 V is u a l J + + 编 程 - 图2475使 用 V is u a l J + + 编 程 - 图2476使 用 V is u a l J + + 编 程 - 图2477使 用 V is u a l J + + 编 程 - 图2478这 些 事 件 不 是 为 提 供 数 据 有 效 性 而 设 计 的 但 是 允 许 控 件 越 过 被 编 辑 的属 性 例 如 防 止 一 个 控 件 修 改 它 的 值 数 据 有 效 性 是 在 数 据 源 上 使 用 V is u a l J + + 编 程 - 图2479 例 如一 个 记 录 设 置 使 用 V is u a l J + + 编 程 - 图2480 或 通 过 在 控 件 上 自 定 义 属 性 来 处 理 的

使 用 V is u a l J + + 编 程 - 图2481使 用 V is u a l J + + 编 程 - 图2482使 用 V is u a l J + + 编 程 - 图2483实 现 属 性 变 化 事 件 的 方 式 是 做 一 个 自 定 义 事 件 对 每 个 事 件 可 以 提 供一 个 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< 属 性

使 用 V is u a l J + + 编 程 - 图2484> C ha ng e d 方 法 on< 属 性 名 > C ha ng in g 通 常 使 用 一 个 C a n c e l E v e n t 对 象

使 用 V is u a l J + + 编 程 - 图2485使 用 V is u a l J + + 编 程 - 图2486使 用 V is u a l J + + 编 程 - 图2487使 用 V is u a l J + + 编 程 - 图2488使 用 V is u a l J + + 编 程 - 图2489允 许 停 止 这 个 变 化 有 关 创 建 这 些 方 法 的 细 节 参 见 本 章 前 面 的 创 建自 定 义 事 件

使 用 V is u a l J + + 编 程 - 图2490下 面 举 例 说 明 怎 样 为 调 整 属 性 包 括 属 性 通 告

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);

}

自 定 义 控 件

使 用 V is u a l J + + 编 程 - 图2491使 用 V is u a l J + + 编 程 - 图2492除 了 定 义 控 件 成 员 外 可 以 通 过 自 定 义 控 件 来 定 义 它 的 的 功 能

定 义 控 件 的 显 示

使 用 V is u a l J + + 编 程 - 图2493使 用 V is u a l J + + 编 程 - 图2494在 控 件 中 , 可 以 写 代 码 来 确 定 和 修 改 控 件 的 可 视 表 示 以 下 部 分 提 供 有关 控 件 显 示 的 背 景 信 息 以 及 如 何 管 理 的 信 息

控 件 维 数

使 用 V is u a l J + + 编 程 - 图2495使 用 V is u a l J + + 编 程 - 图2496使 用 V is u a l J + + 编 程 - 图2497使 用 V is u a l J + + 编 程 - 图2498使 用 V is u a l J + + 编 程 - 图2499使 用 V is u a l J + + 编 程 - 图2500使 用 V is u a l J + + 编 程 - 图2501与 控 件 关 联 的 有 三 个 主 要 维 数 边 界 客 户 和 显 示 坐 标 控 件 的 边 界 是外 部 窗 口 控 件 的 坐 标 边 界 总 是 在 父 客 户 坐 标 中 表 示 这 就 是 说 与 父客 户 的 维 数 有 关

使 用 V is u a l J + + 编 程 - 图2502使 用 V is u a l J + + 编 程 - 图2503使 用 V is u a l J + + 编 程 - 图2504客 户 坐 标 是 控 件 可 以 画 进 去 的 区 域 范 围 客 户 控 件 区 域 总 是 以 0 0 使 用 V is u a l J + + 编 程 - 图2505

使 用 V is u a l J + + 编 程 - 图2506为 起 点 并 且 在 属 于 控 件 区 域 的 内 部 客 户 的 基 础 上 扩 大 客 户 坐 标 不 包 含

使 用 V is u a l J + + 编 程 - 图2507非 客 户 区 域 如 应 用 程 序 到 窗 口 的 边 界 使 用 V is u a l J + + 编 程 - 图2508 例 如

使 用 V is u a l J + + 编 程 - 图2509W S _ B OR D E R ,W S _ E X _ C L IE NT E D G E 使 用 V is u a l J + + 编 程 - 图2510 以 及 最 上 层 窗 口 的 标 题 栏

使 用 V is u a l J + + 编 程 - 图2511使 用 V is u a l J + + 编 程 - 图2512使 用 V is u a l J + + 编 程 - 图2513使 用 V is u a l J + + 编 程 - 图2514使 用 V is u a l J + + 编 程 - 图2515使 用 V is u a l J + + 编 程 - 图2516使 用 V is u a l J + + 编 程 - 图2517使 用 V is u a l J + + 编 程 - 图2518显 示 坐 标 是 实 际 定 义 子 控 件 显 示 区 域 的 坐 标 显 示 坐 标 能 够 定 义 比 客 户坐 标 大 的 区 域 在 客 户 坐 标 和 显 示 坐 标 之 间 不 同 的 很 好 的 例 子 就 是 带 有自 动 滚 动 的 窗 体 当 自 动 滚 动 在 窗 体 中 启 用 时 窗 体 的 显 示 大 小 能 够 变得 比 客 户 的 尺 寸 大 在 实 际 窗 体 中 的 结 果 比 物 理 窗 口 要 大 一 些 当 在 窗体 上 移 动 滚 动 条 时 显 示 坐 标 改 变

使 用 V is u a l J + + 编 程 - 图2519使 用 V is u a l J + + 编 程 - 图2520使 用 V is u a l J + + 编 程 - 图2521使 用 V is u a l J + + 编 程 - 图2522使 用 V is u a l J + + 编 程 - 图2523注 意 因 为 控 件 的 边 界 总 是 在 父 客 户 坐 标 中 当 窗 体 滚 动 时 子 控件 的 边 界 将 改 变 以 反 映 它 们 相 对 于 父 客 户 坐 标 的 实 际 位 置

使 用 V is u a l J + + 编 程 - 图2524使 用 V is u a l J + + 编 程 - 图2525使 用 V is u a l J + + 编 程 - 图2526使 用 V is u a l J + + 编 程 - 图2527使 用 V is u a l J + + 编 程 - 图2528使 用 V is u a l J + + 编 程 - 图2529在 多 数 控 件 中 用 户 只 需 要 使 用 客 户 坐 标 如 果 编 写 转 到 主 应 用 程 序 其他 控 件 如 T a bC on tro l 控 件 使 用 V is u a l J + + 编 程 - 图2530 的 控 件 并 且 想 要 启 用 停 靠 或 其 他 布 局机 制 时 显 示 坐 标 是 很 重 要 的

位 置 和 大 小

使 用 V is u a l J + + 编 程 - 图2531控 件 的 布 局 是 由 控 件 从 C on tro l 类 中 继 承 的 几 个 属 性 的 值 组 合 确 定 的

  • 使 用 V is u a l J + + 编 程 - 图2532位 置 属 性 包 含 设 置 控 件 的 左 上 角 x 和 y 坐 标 Po in t 类

  • 使 用 V is u a l J + + 编 程 - 图2533大 小 属 性 包 含 设 置 控 件 的 高 度 和 宽 度 的 Po in t 类

  • 使 用 V is u a l J + + 编 程 - 图2534使 用 V is u a l J + + 编 程 - 图2535使 用 V is u a l J + + 编 程 - 图2536

    点 属 性 固 定 一 个 和 多 个 控 件 的 边 到 它 的 容 器 中 当 该 容 器 重 新 设 置大 小 时 锚 定 的 控 件 边 也 重 新 设 置 大 小

  • 使 用 V is u a l J + + 编 程 - 图2537停 靠 属 性 指 定 控 件 停 靠 在 主 包 容 器 的 哪 边

使 用 V is u a l J + + 编 程 - 图2538使 用 V is u a l J + + 编 程 - 图2539这 些 属 性 可 以 在 运 行 时 间 中 设 置 来 改 变 控 件 的 位 置 和 大 小

使 用 V is u a l J + + 编 程 - 图2540使 用 V is u a l J + + 编 程 - 图2541使 用 V is u a l J + + 编 程 - 图2542使 用 V is u a l J + + 编 程 - 图2543使 用 V is u a l J + + 编 程 - 图2544使 用 V is u a l J + + 编 程 - 图2545使 用 V is u a l J + + 编 程 - 图2546使 用 V is u a l J + + 编 程 - 图2547使 用 V is u a l J + + 编 程 - 图2548使 用 V is u a l J + + 编 程 - 图2549使 用 V is u a l J + + 编 程 - 图2550使 用 V is u a l J + + 编 程 - 图2551使 用 V is u a l J + + 编 程 - 图2552如 果 控 件 的 位 置 或 大 小 在 运 行 时 间 改 变 控 件 接 着 通 知 事 件 当 在 控 件上 改 变 的 任 何 事 情 会 导 致 它 们 重 新 应 用 任 何 布 局 时 将 激 活 布 局 事 件示 例 包 括 添 加 子 控 件 改 变 控 件 的 边 界 线 或 执 行 一 些 其 他 的 由 控 件 指 定的 事 件 如 改 变 属 性 值 等 重 置 大 小 事 件 只 有 在 控 件 的 边 界 改 变 时 激 活默 认 的 W F C 布 局 逻 辑 是 在 C on tro l .on La y out 和 F o rm . o n L a y ou tv 中 处 理停 靠 和 子 控 件 的 锚 定 应 用 在 父 的 布 局 事 件 中 因 此 一 个 面 板 将 布 局 所有 的 子 控 件 并 且 面 板 的 父 将 布 局 所 有 的 面 板

更 新 可 视 显 示

使 用 V is u a l J + + 编 程 - 图2553使 用 V is u a l J + + 编 程 - 图2554使 用 V is u a l J + + 编 程 - 图2555使 用 V is u a l J + + 编 程 - 图2556使 用 V is u a l J + + 编 程 - 图2557所 有 可 视 控 件 必 须 提 供 它 自 己 的 表 现 除 非 控 件 是 其 他 控 件 的 子 类 用户 必 须 通 过 超 越 onP a int 方 法 添 加 定 制 绘 制 逻 辑 到 控 件 中 调 用 超 类 的O n P a in t 方 法 来 显 示 控 件 然 后 添 加 自 己 的 逻 辑 来 定 制 显 示

使 用 V is u a l J + + 编 程 - 图2558使 用 V is u a l J + + 编 程 - 图2559使 用 V is u a l J + + 编 程 - 图2560onP 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 ) ;

}

使 用 V is u a l J + + 编 程 - 图2561使 用 V is u a l J + + 编 程 - 图2562使 用 V is u a l J + + 编 程 - 图2563使 用 V is u a l J + + 编 程 - 图2564使 用 V is u a l J + + 编 程 - 图2565使 用 V is u a l J + + 编 程 - 图2566使 用 V is u a l J + + 编 程 - 图2567W F C 中 的 G ra ph ic s 对 象 功 能 非 常 丰 富 和 完 全 用 户 几 乎 可 以 绘 制 任 何基 本 结 构 包 括 弧 形 椭 圆 矩 形 多 边 形 直 线 和 点 下 表 列 出 了 G ra ph ic s

使 用 V is u a l J + + 编 程 - 图2568对 象 的 常 用 属 性 和 方 法

G r a p h ic s 对象 成 员 说明

se t P e n 方 法 指 定 一 个 用 来 定 义 如 何 绘 制 直 线 和 对 象 周 围 的 边 框

Pe n 对象

使 用 V is u a l J + + 编 程 - 图2569使 用 V is u a l J + + 编 程 - 图2570se tB ru sh 方法 指定 一 个 填 充 控 件 的 B ru sh 对象 例如 在 c lea r R ec t

方法 中 使 用 V is u a l J + + 编 程 - 图2571

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 方法 绘 制 一幅 图 像

使 用 V is u a l J + + 编 程 - 图2572使 用 V is u a l J + + 编 程 - 图2573使 用 V is u a l J + + 编 程 - 图2574d ra w S tr ing 方法 显 示 一个 串 包括 支持 字 环 绕 对齐 剪切 等 等

使 用 V is u a l J + + 编 程 - 图2575使 用 V is u a l J + + 编 程 - 图2576使 用 V is u a l J + + 编 程 - 图2577使 用 V is u a l J + + 编 程 - 图2578使 用 V is u a l J + + 编 程 - 图2579使 用 V is u a l J + + 编 程 - 图2580使 用 V is u a l J + + 编 程 - 图2581使 用 V is u a l J + + 编 程 - 图2582使 用 V is u a l J + + 编 程 - 图2583使 用 V is u a l J + + 编 程 - 图2584在 W F C 中 使 用 标 准 的 W in 3 2 模 型 在 控 件 的 区 域 中 绘 制 被 禁 止 这 些有 效 地 请 求 重 新 绘 制 但 是 不 会 立 即 执 行 绘 制 进 程 在 下 一 个 空 闲 循 环中 绘 制 事 件 异 步 地 送 到 该 控 件 当 事 件 到 达 该 控 件 时 控 件 首 先 调 用eraseB a c k g ro u d 来 清 除 要 绘 制 的 区 域 绘 制 事 件 随 后 发 生 并 剪 取 到 无效 区 域

使 用 V is u a l J + + 编 程 - 图2585使 用 V is u a l J + + 编 程 - 图2586使 用 V is u a l J + + 编 程 - 图2587使 用 V is u a l J + + 编 程 - 图2588使 用 V is u a l J + + 编 程 - 图2589绘 制 事 件 是 合 并 的 所 以 对 于 控 件 的 多 个 无 效 区 域 控 件 将 只 接 收 一个 绘 制 事 件 控 件 接 收 的 合 并 绘 制 事 件 剪 取 到 所 有 无 效 区 域 的 结 合 部分

使 用 V is u a l J + + 编 程 - 图2590下 例 解 释 了 用 户 如 何 调 用 使 无 效 in v a lid a te 使 用 V is u a l J + + 编 程 - 图2591 的 方 法 来 请 求 控 件 重 新 绘

使 用 V is u a l J + + 编 程 - 图2592使 用 V is u a l J + + 编 程 - 图2593制 它 自 己 在 这 个 实 例 中 调 用 使 无 效 的 方 法 不 用 用 来 指 出 剪 取 部 分 的

使 用 V is u a l J + + 编 程 - 图2594使 用 V is u a l J + + 编 程 - 图2595使 用 V is u a l J + + 编 程 - 图2596R 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

}

使 用 V is u a l J + + 编 程 - 图2597使 用 V is u a l J + + 编 程 - 图2598使 用 V is u a l J + + 编 程 - 图2599注 意 如 果 修 改 多 个 属 性 使 用 V is u a l J + + 编 程 - 图2600 或 两 次 修 改 同 一 属 性 使 用 V is u a l J + + 编 程 - 图2601 控 件 将 不 两 次执 行 整 个 绘 制 操 作

使 用 V is u a l J + + 编 程 - 图2602使 用 V is u a l J + + 编 程 - 图2603使 用 V is u a l J + + 编 程 - 图2604要 强 制 绘 制 操 作 同 步 发 生 用 户 可 以 调 用 控 件 的 更 新 方 法 该 方 法 强 制控 件 立 即 执 行 所 有 未 决 定 的 绘 制 事 件

在 绘 制 时 消 除 闪 烁

使 用 V is u a l J + + 编 程 - 图2605使 用 V is u a l J + + 编 程 - 图2606使 用 V is u a l J + + 编 程 - 图2607使 用 V is u a l J + + 编 程 - 图2608使 用 V is u a l J + + 编 程 - 图2609使 用 V is u a l J + + 编 程 - 图2610使 用 V is u a l J + + 编 程 - 图2611使 用 V is u a l J + + 编 程 - 图2612要 消 除 控 件 中 的 闪 烁 用 户 应 该 考 虑 超 越 onE ra se B a c k g round 事 件 这些 事 件 的 默 认 实 现 是 使 用 b ack C o lo r 属 性 的 当 前 值 清 除 控 件 的 背 景 但是 并 不 总 是 需 要 重 新 绘 制 控 件 的 整 个 区 域 并 且 进 行 这 些 不 需 要 的 操作 时 将 会 导 致 闪 烁 当 控 件 有 大 区 域 或 是 复 杂 的 绘 制 逻 辑 时 通 常 会 出现 这 种 情 况

使 用 V is u a l J + + 编 程 - 图2613使 用 V is u a l J + + 编 程 - 图2614在 这 个 例 子 中 dra w S tr ing 方 法 用 来 在 控 件 中 放 置 文 本 如 果 背 景 没 有

使 用 V is u a l J + + 编 程 - 图2615使 用 V is u a l J + + 编 程 - 图2616使 用 V is u a l J + + 编 程 - 图2617使 用 V is u a l J + + 编 程 - 图2618使 用 V is u a l J + + 编 程 - 图2619被 e ra se B a c kg round 方 法 清 除 那 么 它 将 看 起 来 就 像 从 没 有 被 绘 制 一 样产 生 一 个 透 明 的 显 示

使 用 V is u a l J + + 编 程 - 图2620使 用 V is u a l J + + 编 程 - 图2621使 用 V is u a l J + + 编 程 - 图2622使 用 V is u a l J + + 编 程 - 图2623使 用 V is u a l J + + 编 程 - 图2624注 意 控 件 并 不 是 真 正 透 明 但 是 因 为 屏 幕 区 域 中 以 前 的 内 容 没有 重 新 绘 制 它 们 是 始 终 可 见 的

使 用 V is u a l J + + 编 程 - 图2625使 用 V is u a l J + + 编 程 - 图2626使 用 V is u a l J + + 编 程 - 图2627使 用 V is u a l J + + 编 程 - 图2628使 用 V is u a l J + + 编 程 - 图2629使 用 V is u a l J + + 编 程 - 图2630使 用 V is u a l J + + 编 程 - 图2631要 在 没 有 闪 烁 的 情 况 下 创 建 实 心 的 控 件 应 该 避 免 绘 制 将 要 使 用 前 景 信息 重 新 绘 制 的 区 域 的 背 景 这 样 操 作 的 最 简 单 途 径 就 是 要 确 保 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 ;

  1. c lea r R ect( g e t C lien t R ect());

  2. d ra w S t r ing ( g e t T ex t ( ) , 0 , 0 ) ;

}

使 用 V is u a l J + + 编 程 - 图2632使 用 V is u a l J + + 编 程 - 图2633使 用 V is u a l J + + 编 程 - 图2634使 用 V is u a l J + + 编 程 - 图2635使 用 V is u a l J + + 编 程 - 图2636使 用 V is u a l J + + 编 程 - 图2637使 用 V is u a l J + + 编 程 - 图2638使 用 V is u a l J + + 编 程 - 图2639这 是 在 oN P a in t 方 法 中 带 有 简 单 代 码 的 小 例 子 在 这 种 情 况 下 用 户 可能 看 不 到 超 越 onE ra se B a c k g round 事 件 的 好 处 但 是 在 自 己 的 控 件 中绘 制 的 代 码 可 能 会 更 复 杂 使 用 示 例 中 的 技 术 会 极 大 地 减 少 闪 烁

使 用 V is u a l J + + 编 程 - 图2640其 他 添 加 控 件 可 视 稳 定 性 的 技 术 是 双 缓 冲 用 户 在 屏 幕 上 的 图 像 在 该 技

使 用 V is u a l J + + 编 程 - 图2641使 用 V is u a l J + + 编 程 - 图2642术 中 用 户 维 护 整 个 客 户 区 域 的 位 图 并 且 随 后 创 建 一 个 基 于 图 像 的

使 用 V is u a l J + + 编 程 - 图2643使 用 V is u a l J + + 编 程 - 图2644G ra ph ic s 对 象 利 用 缓 冲 区 更 新 图 像 的 性 能 比 正 常 的 要 快

使 用 V is u a l J + + 编 程 - 图2645使 用 V is u a l J + + 编 程 - 图2646使 用 V is u a l J + + 编 程 - 图2647使 用 V is u a l J + + 编 程 - 图2648使 用 V is u a l J + + 编 程 - 图2649使 用 V is u a l J + + 编 程 - 图2650使 用 V is u a l J + + 编 程 - 图2651使 用 V is u a l J + + 编 程 - 图2652使 用 V is u a l J + + 编 程 - 图2653只 是 在 已 经 超 越 onE ra se B a c k g round 并 优 化 绘 制 代 码 时 及 始 终 感 到 有闪 烁 时 用 户 才 应 该 使 用 双 缓 冲 区 技 术 双 缓 冲 区 技 术 是 需 要 许 多 资 源的 操 作 因 为 用 户 要 维 护 控 件 图 像 的 附 加 副 本 对 于 大 的 图 像 这 样 做会 需 要 大 量 的 内 存 使 用 V is u a l J + + 编 程 - 图2654 附 加 内 存 的 大 小 取 决 于 图 像 大 小 和 它 的 色 深 使 用 V is u a l J + + 编 程 - 图2655 如果 缓 冲 区 存 储 一 个 大 的 区 域 维 护 缓 冲 区 还 会 减 缓 执 行 速 度

使 用 V is u a l J + + 编 程 - 图2656使 用 V is u a l J + + 编 程 - 图2657要 在 控 件 中 使 用 双 缓 冲 区 进 行 下 列 操 作

  • 使 用 V is u a l J + + 编 程 - 图2658指 定 正 在 处 理 的 onE ra se B a c k g round 事 件

  • 使 用 V is u a l J + + 编 程 - 图2659使 用 V is u a l J + + 编 程 - 图2660使 用 V is u a l J + + 编 程 - 图2661使 用 V is u a l J + + 编 程 - 图2662使 用 V is u a l J + + 编 程 - 图2663使 用 V is u a l J + + 编 程 - 图2664

    越 O n R e s iz e 方 法 来 创 建 一 个 新 的 缓 冲 区 来 匹 配 新 的 客 户 区 域 对老 的 缓 冲 区 进 行 处 理 使 之 在 资 源 中 释 放 也 是 一 个 好 的 方 法 用 户 还可 以 调 用 使 无 效 的 方 法 默 认 情 况 下 W ind ow s 将 只 是 使 在 重 设 大 小时 直 接 影 响 区 域 的 部 分 无 效

  • 使 用 V is u a l J + + 编 程 - 图2665使 用 V is u a l J + + 编 程 - 图2666使 用 V is u a l J + + 编 程 - 图2667使 用 V is u a l J + + 编 程 - 图2668

    绘 制 代 码 中 从 缓 冲 区 中 创 建 一 个 G ra ph ic s 对 象 并 且 在 该 对 象 上执 行 所 有 的 绘 图 操 作 用 户 必 须 明 确 为 基 于 这 些 定 义 的 G ra ph ic s 对 象设 置 b ack C o lo r 和 pe n 属 性

使 用 V is u a l J + + 编 程 - 图2669使 用 V is u a l J + + 编 程 - 图2670使 用 V is u a l J + + 编 程 - 图2671下 例 在 控 件 中 的 客 户 区 域 中 绘 制 一 个 简 单 的 星 形 图 案 如 果不 包 括 一 个 双 缓 冲 区 控 件 的 闪 烁 会 非 常 引 人 注 目

/ / 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 {

}

}

为 控 件 添 加 位 图

使 用 V is u a l J + + 编 程 - 图2672使 用 V is u a l J + + 编 程 - 图2673使 用 V is u a l J + + 编 程 - 图2674使 用 V is u a l J + + 编 程 - 图2675使 用 V is u a l J + + 编 程 - 图2676使 用 V is u a l J + + 编 程 - 图2677使 用 V is u a l J + + 编 程 - 图2678作 为 控 件 的 可 视 部 分 用 户 可 以 指 定 一 个 16 16 像 素 的 位 图 到 该 控 件当 控 件 可 以 使 用 时 位 图 显 示 在 V isu a l J + + 的 工 具 箱 中 控 件 的 位 图 还为 没 有 运 行 时 表 示 的 控 件 显 示 如 计 时 器

使 用 V is u a l J + + 编 程 - 图2679使 用 V is u a l J + + 编 程 - 图2680使 用 V is u a l J + + 编 程 - 图2681使 用 V is u a l J + + 编 程 - 图2682使 用 V is u a l J + + 编 程 - 图2683使 用 V is u a l J + + 编 程 - 图2684注 意 只 有 当 控 件 作 为 一 个 W F C 控 件 使 用 时 才 使 用 位 图 如 果 作为 ActiveX 控 件 使 用 控 件 在 工 具 栏 中 显 示 一 个 标 准 的 预 定 义 的位 图

使 用 V is u a l J + + 编 程 - 图2685使 用 V is u a l J + + 编 程 - 图2686使 用 V is u a l J + + 编 程 - 图2687使 用 V is u a l J + + 编 程 - 图2688使 用 V is u a l J + + 编 程 - 图2689默 认 情 况 下 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 文 件 所 在 的 目 录 中 就 可 以 将 位 图 与 它 关 联

使 用 V is u a l J + + 编 程 - 图2690使 用 V is u a l J + + 编 程 - 图2691使 用 V is u a l J + + 编 程 - 图2692作 为 选 择 用 户 可 以 使 用 超 越 在 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 " ) ;

}

使 用 V is u a l J + + 编 程 - 图2693使 用 V is u a l J + + 编 程 - 图2694使 用 V is u a l J + + 编 程 - 图2695使 用 V is u a l J + + 编 程 - 图2696使 用 V is u a l J + + 编 程 - 图2697用 户 所 指 定 的 位 图 大 小 不 能 超 过 16 16 像 素 并 且 应 该 使 用 16 色 或 更少 的 颜 色 V isu a l J + + 能 够 自 动 重 新 设 置 尺 寸 不 正 确 的 位 图 大 小 但 是这 种 图 形 的 结 果 看 起 来 并 不 太 好

创 建 控 件 定 制 器

使 用 V is u a l J + + 编 程 - 图2698使 用 V is u a l J + + 编 程 - 图2699使 用 V is u a l J + + 编 程 - 图2700使 用 V is u a l J + + 编 程 - 图2701使 用 V is u a l J + + 编 程 - 图2702使 用 V is u a l J + + 编 程 - 图2703使 用 V is u a l J + + 编 程 - 图2704使 用 V is u a l J + + 编 程 - 图2705使 用 V is u a l J + + 编 程 - 图2706使 用 V is u a l J + + 编 程 - 图2707定 制 器 cu s to m iz er 使 用 V is u a l J + + 编 程 - 图2708 是 每 个 实 例 设 计 时 间 元 数 据 的 类 型 C la ssIn fo 类定 义 指 定 到 类 的 元 数 据 相 反 定 制 器 提 供 了 访 问 到 更 高 级 的 设 计 事 件功 能 通 过 创 建 一 个 Cu s to m iz e r 对 象 用 户 可 以 添 加 功 能 到 其 控 件 中如 指 定 一 个 设 计 时 间 活 动 添 加 控 件 动 词 或 创 建 设 计 页 使 用 V is u a l J + + 编 程 - 图2709 定 制 属 性 页 使 用 V is u a l J + + 编 程 - 图2710作 为 带 有 值 的 编 辑 器 这 里 有 一 个 默 认 的 c o m .m s. w fc .c o re . Ic u s to m iz e r

使 用 V is u a l J + + 编 程 - 图2711使 用 V is u a l J + + 编 程 - 图2712co m .m s . w fc .c o re .C u s to m iz er 的 实 现 用 户 可 以 超 越 在 C la ssIn fo 中 的

使 用 V is u a l J + + 编 程 - 图2713ge t C u s to m iz e r 方 法 来 返 回 一 个 定 制 器 的 实 例

指 定 设 计 时 间 激 活

使 用 V is u a l J + + 编 程 - 图2714使 用 V is u a l J + + 编 程 - 图2715使 用 V is u a l J + + 编 程 - 图2716使 用 V is u a l J + + 编 程 - 图2717使 用 V is u a l J + + 编 程 - 图2718使 用 V is u a l J + + 编 程 - 图2719使 用 V is u a l J + + 编 程 - 图2720使 用 V is u a l J + + 编 程 - 图2721使 用 V is u a l J + + 编 程 - 图2722使 用 V is u a l J + + 编 程 - 图2723W F C 支 持 控 件 的 设 计 时 间 激 活 如 设 计 时 间 滚 动 或 项 目 扩 充 通 过 简单 的 击 中 测 试 方 案 当 选 中 控 件 时 击 中 测 试 请 求 将 传 递 到 控 件 的 定 制器 中 如 果 击 中 测 试 返 回 值 为 真 将 认 为 控 件 在 该 位 置 是 激 活 的 利 用这 个 简 单 的 结 构 控 件 区 域 的 激 活 便 是 无 缝 的 如 选 项 卡 条 的 选 项 卡 区域

使 用 V is u a l J + + 编 程 - 图2724使 用 V is u a l J + + 编 程 - 图2725下 例 举 例 说 明 了 一 个 简 单 的 击 中 测 试 方 法 该 方 法 允 许 控 件 在 鼠 标 移 动过 控 件 顶 部 的 50 像 素 时 来 接 收 消 息

使 用 V is u a l J + + 编 程 - 图2726使 用 V is u a l J + + 编 程 - 图2727注 意 控 件 只 能 在 它 是 主 选 中 组 件 时 被 激 活 使 用 V is u a l J + + 编 程 - 图2728 并 且 getHitTest 事件 被 激 活 使 用 V is u a l J + + 编 程 - 图2729

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 ;

}

}

}

指 定 控 件 动 词

使 用 V is u a l J + + 编 程 - 图2730使 用 V is u a l J + + 编 程 - 图2731使 用 V is u a l J + + 编 程 - 图2732动 词 可 定 义 设 计 时 间 中 能 够 在 控 件 上 执 行 的 动 作 在 设 计 器 中 动 词 通常 显 示 在 对 应 于 该 控 件 的 快 捷 菜 单 上

使 用 V is u a l J + + 编 程 - 图2733使 用 V is u a l J + + 编 程 - 图2734使 用 V is u a l J + + 编 程 - 图2735使 用 V is u a l J + + 编 程 - 图2736使 用 V is u a l J + + 编 程 - 图2737使 用 V is u a l J + + 编 程 - 图2738要 创 建 一 个 动 词 需 细 分 subc la ss 使 用 V is u a l J + + 编 程 - 图2739 Cu s to m iz e r 类 然 后 创 建 一 个Cu s to m iz e r V e rb 对 象 该 对 象 允 许 用 户 指 定 动 词 中 的 文 本 并 且 创 建 一个 绑 定 动 词 的 动 作 到 指 定 方 法 上 的 委 托

使 用 V is u a l J + + 编 程 - 图2740使 用 V is u a l J + + 编 程 - 图2741使 用 V is u a l J + + 编 程 - 图2742使 用 V is u a l J + + 编 程 - 图2743使 用 V is u a l J + + 编 程 - 图2744使 用 V is u a l J + + 编 程 - 图2745使 用 V is u a l J + + 编 程 - 图2746下 例 说 明 了 如 何 创 建 一 个 调 用 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 is u a l J + + 编 程 - 图2747使 用 V is u a l J + + 编 程 - 图2748使 用 V is u a l J + + 编 程 - 图2749使 用 V is u a l J + + 编 程 - 图2750使 用 V is u a l J + + 编 程 - 图2751使 用 V is u a l J + + 编 程 - 图2752使 用 V is u a l J + + 编 程 - 图2753对 于 数 据 和 委 托 用 户 还 可 以 指 定 这 些 项 选 中 和 启 用 状 态 并 将 位 图 与这 些 项 关 联 尽 管 通 常 V isu a l J + + 将 不 显 示 在 定 制 器 中 指 定 的 位 图 例如 在 快 捷 菜 单 中 使 用 V is u a l J + + 编 程 - 图2754 其 他 宿 主 可 能 支 持 该 特 性

指 定 设 计 页

使 用 V is u a l J + + 编 程 - 图2755使 用 V is u a l J + + 编 程 - 图2756使 用 V is u a l J + + 编 程 - 图2757使 用 V is u a l J + + 编 程 - 图2758使 用 V is u a l J + + 编 程 - 图2759设 计 页 是 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 方 法

使 用 V is u a l J + + 编 程 - 图2760使 用 V is u a l J + + 编 程 - 图2761使 用 V is u a l J + + 编 程 - 图2762使 用 V is u a l J + + 编 程 - 图2763注 意 尽 管 W F C 支 持 设 计 页 但 是 我 们 还 是 建 议 通 过 定 制 编 辑 器 动 词 和 设 计 事 件 激 活 来 为 控 件 提 供 功 能 有 关 细 节 请 见 本 章 前 面 的

使 用 V is u a l J + + 编 程 - 图2764使 用 V is u a l J + + 编 程 - 图2765使 用 V is u a l J + + 编 程 - 图2766创 建 定 制 属 性 值 编 辑 器 部 分

使 用 V is u a l J + + 编 程 - 图2767使 用 V is u a l J + + 编 程 - 图2768使 用 V is u a l J + + 编 程 - 图2769下 例 说 明 了 如 何 为 对 齐 属 性 创 建 一 个 设 计 页 对 齐 属 性 使 用 V is u a l J + + 编 程 - 图2770 左 对 齐 居 中

使 用 V is u a l J + + 编 程 - 图2771使 用 V is u a l J + + 编 程 - 图2772使 用 V is u a l J + + 编 程 - 图2773使 用 V is u a l J + + 编 程 - 图2774使 用 V is u a l J + + 编 程 - 图2775使 用 V is u a l J + + 编 程 - 图2776使 用 V is u a l J + + 编 程 - 图2777使 用 V is u a l J + + 编 程 - 图2778使 用 V is u a l J + + 编 程 - 图2779使 用 V is u a l J + + 编 程 - 图2780使 用 V is u a l J + + 编 程 - 图2781右 对 齐 使 用 V is u a l J + + 编 程 - 图2782 是 由 一 个 选 项 按 钮 组 来 执 行 的 在 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 } ) ;

}

}

使 用 控 件

使 用 V is u a l J + + 编 程 - 图2783使 用 V is u a l J + + 编 程 - 图2784当 创 建 了 W F C 控 件 之 后 用 户 可 以 在 主 环 境 中 使 用 想 要 使 用 的 任 何 控件

注 册 控 件

使 用 V is u a l J + + 编 程 - 图2785使 用 V is u a l J + + 编 程 - 图2786使 用 V is u a l J + + 编 程 - 图2787使 用 V is u a l J + + 编 程 - 图2788使 用 V is u a l J + + 编 程 - 图2789控 件 必 须 在 它 将 要 运 行 的 计 算 机 上 注 册 控 件 必 须 包 括 注 册 进 程 可 以 读取 用 来 标 识 该 控 件 的 信 息 并 且 这 些 信 息 将 放 入 该 控 件 将 要 运 行 的 计算 机 的 W ind ow s 注 册 表 中 通 过 阅 读 注 册 信 息 应 用 程 序 可 以 找 到 并

使 用 V is u a l J + + 编 程 - 图2790加 载 控 件

使 用 V is u a l J + + 编 程 - 图2791使 用 V is u a l J + + 编 程 - 图2792使 用 V is u a l J + + 编 程 - 图2793使 用 V is u a l J + + 编 程 - 图2794使 用 V is u a l J + + 编 程 - 图2795使 用 V is u a l J + + 编 程 - 图2796注 意 如 果 在 编 译 控 件 项 目 的 计 算 机 上 使 用 这 些 控 件 用 户 将 不 需要 注 册 这 些 控 件 编 译 进 程 已 经 自 动 注 册 了 这 些 控 件 如 果 正 在Visual J++ 中 使 用 这 些 控 件 用 户 也 不 需 要 明 确 地 包 括 注 册 信 息

使 用 V is u a l J + + 编 程 - 图2797使 用 V is u a l J + + 编 程 - 图2798使 用 V is u a l J + + 编 程 - 图2799使 用 V is u a l J + + 编 程 - 图2800使 用 V is u a l J + + 编 程 - 图2801使 用 V is u a l J + + 编 程 - 图2802使 用 V is u a l J + + 编 程 - 图2803主 应 用 程 序 也 需 要 一 个 用 于 控 件 的 类 型 库 .tlb 文 件 使 用 V is u a l J + + 编 程 - 图2804 该 库 中 包 含 了有 关 控 件 成 员 的 信 息 应 用 程 序 在 类 型 库 中 读 取 这 些 信 息 用 来 知 道 控件 支 持 何 种 属 性 事 件 和 方 法 V isu a l J + + 可 以 自 动 为 在 编 译 进 程 中 的控 件 生 成 类 型 库

指 定 注 册 和 类 型 库 信 息

使 用 V is u a l J + + 编 程 - 图2805注 册 需 要 下 面 的 信 息

  • 使 用 V is u a l J + + 编 程 - 图2806使 用 V is u a l J + + 编 程 - 图2807使 用 V is u a l J + + 编 程 - 图2808使 用 V is u a l J + + 编 程 - 图2809使 用 V is u a l J + + 编 程 - 图2810使 用 V is u a l J + + 编 程 - 图2811类 ID c ls id 这 是 一 个 唯 一 标 识 控 件 的 GU ID 全 局 唯 一 的 ID

使 用 V is u a l J + + 编 程 - 图2812控 件 自 身 和 类 型 库 中 需 要 一 个 类 ID

  • 使 用 V is u a l J + + 编 程 - 图2813使 用 V is u a l J + + 编 程 - 图2814使 用 V is u a l J + + 编 程 - 图2815使 用 V is u a l J + + 编 程 - 图2816

    序 ID pro g ID 当 创 建 一 个 控 件 的 实 例 时 如

使 用 V is u a l J + + 编 程 - 图2817使 用 V is u a l J + + 编 程 - 图2818M y P ro je c t .M y C on tro l 使 用 V is u a l J + + 编 程 - 图2819 在 主 应 用 程 序 中 所 使 用 的 名 称

使 用 V is u a l J + + 编 程 - 图2820使 用 V is u a l J + + 编 程 - 图2821使 用 V is u a l J + + 编 程 - 图2822使 用 V is u a l J + + 编 程 - 图2823使 用 V is u a l J + + 编 程 - 图2824使 用 V is u a l J + + 编 程 - 图2825如 果 已 经 使 用 了 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 的 细 节 见 本 书 第 十 七 章

使 用 V is u a l J + + 编 程 - 图2826使 用 V is u a l J + + 编 程 - 图2827使 用 V is u a l J + + 编 程 - 图2828使 用 V is u a l J + + 编 程 - 图2829最 后 用 户 还 可 以 手 工 创 建 并 包 含 控 件 的 类 ID 如 果 想 要 保 证 为 控 件留 下 相 同 的 类 ID 或 者 为 一 些 其 他 的 目 的 想 要 知 道 类 ID 并 且 不 想 让

使 用 V is u a l J + + 编 程 - 图2830使 用 V is u a l J + + 编 程 - 图2831使 用 V is u a l J + + 编 程 - 图2832使 用 V is u a l J + + 编 程 - 图2833使 用 V is u a l J + + 编 程 - 图2834使 用 V is u a l J + + 编 程 - 图2835使 用 V is u a l J + + 编 程 - 图2836使 用 V is u a l J + + 编 程 - 图2837V isu a l J + + 来 生 成 用 户 可 能 要 这 样 操 作 可 以 使 用 U u id g e n .e x e 这 样 的程 序 生 成 一 个 GU ID 该 程 序 是 一 个 免 费 的 实 用 程 序 在 M ic rosoft W e b 节 点 上 可 用 用 户 总 共 必 须 提 供 两 个 类 ID 一 个 用 于 控 件 而 另 一 个用 于 它 的 类 型 库

使 用 V is u a l J + + 编 程 - 图2838要 将 手 工 注 册 信 息 添 加 到 注 册 程 序 中 用 户 应 该 将 其 包 括 在 控 件 的 .ja v a

使 用 V is u a l J + + 编 程 - 图2839使 用 V is u a l J + + 编 程 - 图2840文 件 中 的 命 令 内 嵌 注 释 中 格 式 为

/ *

* @ co m .r eg is ter( clsid = gu id , type lib = gu id )

*/

使 用 V is u a l J + + 编 程 - 图2841例 如 一 个 注 册 块 应 该 看 起 来 如 下 所 示 使 用 V is u a l J + + 编 程 - 图2842 在 例 子 中 出 现 了 折 行 是 因 为

使 用 V is u a l J + + 编 程 - 图2843使 用 V is u a l J + + 编 程 - 图2844c las s ID 太 长 但 是 在 你 的 文 件 中 不 要 将 其 折 行 使 用 V is u a l J + + 编 程 - 图2845

/ *

* @ 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)

*/

使 用 V is u a l J + + 编 程 - 图2846使 用 V is u a l J + + 编 程 - 图2847使 用 V is u a l J + + 编 程 - 图2848使 用 V is u a l J + + 编 程 - 图2849使 用 V is u a l J + + 编 程 - 图2850当 为 控 件 编 译 项 目 时 编 译 进 程 查 找 该 块 如 果 找 到 编 译 进 程 为 该 控件 生 成 一 个 类 型 库 它 也 将 该 控 件 和 类 型 库 注 册 到 计 算 机 上

创 建 prog ID

使 用 V is u a l J + + 编 程 - 图2851注 册 进 程 自 动 为 使 用 下 列 格 式 的 控 件 建 立 一 个 prog ID P ro jc e t N a m e .C on tro l N a m e

使 用 V is u a l J + + 编 程 - 图2852使 用 V is u a l J + + 编 程 - 图2853例 如 控 件 项 目 可 能 为 M y P ro je c t 并 且 控 件 的 .ja v a 文 件 可 能 是

使 用 V is u a l J + + 编 程 - 图2854使 用 V is u a l J + + 编 程 - 图2855使 用 V is u a l J + + 编 程 - 图2856M y C o n tro l . ja v a 当 注 册 之 后 控 件 的 pro g ID 将 为 M y P ro je c t .M yc on tro l

运 行 注 册 进 程

使 用 V is u a l J + + 编 程 - 图2857如 果 想 要 在 编 译 某 个 控 件 的 计 算 机 上 使 用 该 控 件 则 不 需 要 来 注 册 它 ─

  • 使 用 V is u a l J + + 编 程 - 图2858使 用 V is u a l J + + 编 程 - 图2859使 用 V is u a l J + + 编 程 - 图2860使 用 V is u a l J + + 编 程 - 图2861编 译 进 程 已 经 自 动 为 用 户 注 册 了 但 是 如 果 将 该 控 件 发 布 到 其 他 计算 机 上 则 必 须 在 那 里 注 册 该 控 件

使 用 V is u a l J + + 编 程 - 图2862使 用 V is u a l J + + 编 程 - 图2863使 用 V is u a l J + + 编 程 - 图2864使 用 V is u a l J + + 编 程 - 图2865如 果 已 经 将 控 件 作 为 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

使 用 V is u a l J + + 编 程 - 图2866使 用 V is u a l J + + 编 程 - 图2867使 用 V is u a l J + + 编 程 - 图2868使 用 V is u a l J + + 编 程 - 图2869使 用 V is u a l J + + 编 程 - 图2870使 用 V is u a l J + + 编 程 - 图2871如 果 控 件 简 单 地 编 译 为 一 个 .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 is u a l J + + 编 程 - 图2872 使 用 下 面的 语 法 在 命 令 行 中 注 册 控 件

V jr eg p a th / c on tr ol N a m e

使 用 V is u a l J + + 编 程 - 图2873使 用 V is u a l J + + 编 程 - 图2874使 用 V is u a l J + + 编 程 - 图2875当 运 行 此 命 令 时 它 注 册 M s ja v a l .d l l 作 为 该 控 件 的 服 务 器 控 件 的 名 字和 路 径 作 为 参 数

在 主 应 用 程 序 中 使 用 控 件 工 作

使 用 V is u a l J + + 编 程 - 图2876可 以 使 用 控 件 在 主 应 用 程 序 中 工 作 如 可 以 使 用 任 何 想 要 使 用 的 控 件 在

使 用 V is u a l J + + 编 程 - 图2877使 用 V is u a l J + + 编 程 - 图2878V 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 is u a l J + + 编 程 - 图2879使 用 V is u a l J + + 编 程 - 图2880中 创 建 的 任 何 控 件 下 面 列 出 的 东 西 必 须 在 主 计 算 机 上 存 在

  • 使 用 V is u a l J + + 编 程 - 图2881使 用 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 )

使 用 V is u a l J + + 编 程 - 图2882使 用 V is u a l J + + 编 程 - 图2883使 用 V is u a l J + + 编 程 - 图2884可 分 配 的 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 下 不 可 用

使 用 V is u a l J + + 编 程 - 图2885使 用 V is u a l J + + 编 程 - 图2886使 用 V is u a l J + + 编 程 - 图2887另 外 对 于 每 个 控 件 用 户 必 须 分 配 下 列 文 件

  • 使 用 V is u a l J + + 编 程 - 图2888在 项 目 中 用 于 所 有 类 的 .c la ss 文 件

  • 使 用 V is u a l J + + 编 程 - 图2889使 用 V is u a l J + + 编 程 - 图2890使 用 V is u a l J + + 编 程 - 图2891在 编 译 进 程 中 为 项 目 生 成 的 类 型 库 .tlb 文 件

  • 使 用 V is u a l J + + 编 程 - 图2892在 编 译 进 程 中 为 控 件 生 成 的 .d a t 文 件

  • 使 用 V is u a l J + + 编 程 - 图2893包 含 注 册 信 息 的 V J PR O J S .SR G 文 件

使 用 V is u a l J + + 编 程 - 图2894使 用 V is u a l J + + 编 程 - 图2895使 用 V is u a l J + + 编 程 - 图2896注 意 如 果 正 在 编 译 该 控 件 的 计 算 机 上 运 行 这 些 控 件 所 有 这 些 文件 都 可 以 使 用

使 用 V is u a l J + + 编 程 - 图2897使 用 V is u a l J + + 编 程 - 图2898使 用 V is u a l J + + 编 程 - 图2899使 用 V is u a l J + + 编 程 - 图2900使 用 V is u a l J + + 编 程 - 图2901使 用 V is u a l J + + 编 程 - 图2902使 用 V is u a l J + + 编 程 - 图2903使 用 V is u a l J + + 编 程 - 图2904使 用 V is u a l J + + 编 程 - 图2905使 用 V is u a l J + + 编 程 - 图2906使 用 V is u a l J + + 编 程 - 图2907使 用 V is u a l J + + 编 程 - 图2908当 在 主 机 上 安 装 了 这 些 文 件 之 后 用 户 必 须 像 在 本 章 前 面 的 注 册 控 件一 部 分 介 绍 的 那 样 注 册 该 控 件 随 后 可 以 创 建 该 控 件 的 实 例 在 许 多 主应 用 程 序 中 用 户 可 以 将 该 控 件 添 加 到 工 具 栏 中 例 如 在 V isu a l B a s ic 中 用 户 可 以 右 击 工 具 箱 选 择 C o m pone n ts 然 后 选 择 该 控 件

在 In te rn e t E xp lore r 中 使 用 控 件

使 用 V is u a l J + + 编 程 - 图2909使 用 V is u a l J + + 编 程 - 图2910要 在 In te rn e t E xp lore r 中 使 用 控 件 需 要 创 建 一 个 <O BJ E C T 使 用 V is u a l J + + 编 程 - 图2911 元 素 在

使 用 V is u a l J + + 编 程 - 图2912使 用 V is u a l J + + 编 程 - 图2913C L A S S ID 属 性 中 按 照 下 面 列 出 的 几 种 方 法 之 一 识 别 控 件

  • 使 用 V is u a l J + + 编 程 - 图2914使 用 V is u a l J + + 编 程 - 图2915按 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 >

  • 使 用 V is u a l J + + 编 程 - 图2916使 用 V is u a l J + + 编 程 - 图2917按 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 >

  • 使 用 V is u a l J + + 编 程 - 图2918使 用 V is u a l J + + 编 程 - 图2919使 用 V is u a l J + + 编 程 - 图2920使

    用 控 件 名 这 种 语 法 需 要 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 控 件

使 用 V is u a l J + + 编 程 - 图2921使 用 V is u a l J + + 编 程 - 图2922使 用 V is u a l J + + 编 程 - 图2923使 用 V is u a l J + + 编 程 - 图2924用 户 可 以 使 用 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 使 用 V is u a l J + + 编 程 - 图2925 和 组 合 c o m posite 使 用 V is u a l J + + 编 程 - 图2926

使 用 V is u a l J + + 编 程 - 图2927使 用 V is u a l J + + 编 程 - 图2928使 用 V is u a l J + + 编 程 - 图2929使 用 V is u a l J + + 编 程 - 图2930使 用 V is u a l J + + 编 程 - 图2931使 用 V is u a l J + + 编 程 - 图2932定 制 控 件 源 于 c o m .m s. w fc .u i . c o n t ro l 类 用 户 可 以 在 一 个 退 出 W F C 控件 的 整 个 和 子 类 中 设 计 定 制 的 控 件 有 关 创 建 定 制 控 件 的 更 多 信 息 见在 本 章 前 面 的 编 写 W F C 控 件 一 部 分

使 用 V is u a l J + + 编 程 - 图2933组 合 控 件 是 包 括 其 他 控 件 的 控 件 所 有 组 合 控 件 均 源 于

使 用 V is u a l J + + 编 程 - 图2934使 用 V is u a l J + + 编 程 - 图2935使 用 V is u a l J + + 编 程 - 图2936co 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 来 布 局 定 义 组 合 控 件 的 控件

使 用 V is u a l J + + 编 程 - 图2937使 用 V is u a l J + + 编 程 - 图2938在 本 部 分 中 要 创 建 控 件 用 户 需 要 学 习 如 何

  • 使 用 V is u a l J + + 编 程 - 图2939使 用 F o rm s D e sig n e r 来 定 义 控 件 的 布 局

  • 使 用 V is u a l J + + 编 程 - 图2940添 加 使 用 W F C C o m pone nt B u i lde r 的 属 性 和 事 件

  • 使 用 V is u a l J + + 编 程 - 图2941为 控 件 添 加 支 持 代 码

创 建 控 件 对 象

使 用 V is u a l J + + 编 程 - 图2942使 用 V is u a l J + + 编 程 - 图2943使 用 V is u a l J + + 编 程 - 图2944使 用 V is u a l J + + 编 程 - 图2945使 用 V is u a l J + + 编 程 - 图2946使 用 V is u a l J + + 编 程 - 图2947使 用 V is u a l J + + 编 程 - 图2948使 用 V is u a l J + + 编 程 - 图2949V 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 类

注 意

在 开 始 下 面 的 进 程 之 前

关 闭 所 有 打 开 的 项 目

使 用 V is u a l J + + 编 程 - 图2950

File 菜

单 上

单 击 Close All 使 用 V is u a l J + + 编 程 - 图2951

使 用 C o n tr o l 模 板 创 建 控 件 项 目

F ile N e w

文 件 使 用 V is u a l J + + 编 程 - 图2952

使 用 V is u a l J + + 编 程 - 图2953 新 建

菜 单 上 单 击 N e w

使 用 V is u a l J + + 编 程 - 图2954 选 项 卡 上 扩 展

P ro je c t 新 项 目 使 用 V is u a l J + + 编 程 - 图2955

V isu a l J + + P ro je c ts

文 件 夹

单 击

C o m pone n ts 然 后 选 择 C on tro l 控 件 使 用 V is u a l J + + 编 程 - 图2956 图 标

  1. 使 用 V is u a l J + + 编 程 - 图2957使 用 V is u a l J + + 编 程 - 图2958使 用 V is u a l J + + 编 程 - 图2959使 用 V is u a l J + + 编 程 - 图2960使 用 V is u a l J + + 编 程 - 图2961使 用 V is u a l J + + 编 程 - 图2962使 用 V is u a l J + + 编 程 - 图2963使 用 V is u a l J + + 编 程 - 图2964使 用 V is u a l J + + 编 程 - 图2965使 用 V is u a l J + + 编 程 - 图2966使 用 V is u a l J + + 编 程 - 图2967使 用 V is u a l J + + 编 程 - 图2968使 用 V is u a l J + + 编 程 - 图2969使 用 V is u a l J + + 编 程 - 图2970在 N a m e 名 称 使 用 V is u a l J + + 编 程 - 图2971 框 中 为 项 目 输 入 一 个 名 称在 此 时 输 入 G roupC he c k

  2. 使 用 V is u a l J + + 编 程 - 图2972使 用 V is u a l J + + 编 程 - 图2973使 用 V is u a l J + + 编 程 - 图2974

    L o c a tio n 位 置 使 用 V is u a l J + + 编 程 - 图2975 框 中 输 入 要 存 储 项 目 的 路 径 或 者 单 击 B ro w s e

使 用 V is u a l J + + 编 程 - 图2976使 用 V is u a l J + + 编 程 - 图2977 浏 览 使 用 V is u a l J + + 编 程 - 图2978 按 钮 来 定 位 到 某 个 目 录

  1. 使 用 V is u a l J + + 编 程 - 图2979使 用 V is u a l J + + 编 程 - 图2980

    击 O p e n 打 开 使 用 V is u a l J + + 编 程 - 图2981

使 用 V is u a l J + + 编 程 - 图2982该 项 目 的 折 叠 视 图 出 现 在 P ro ject E x p lo rer 中

  1. 使 用 V is u a l J + + 编 程 - 图2983使 用 V is u a l J + + 编 程 - 图2984

    P ro ject E x p lo rer 中 扩 展 该 项 目 节 点

使 用 V is u a l J + + 编 程 - 图2985— 个 带 有 默 认 名 C on tro l 1 .ja v a 的 文 件 添 加 到 项 目 中

  1. 使 用 V is u a l J + + 编 程 - 图2986要 将

    该 该 控 件 源 文 件 名 重 命 名 为 G roupC he c k . ja v a 在 P ro je c t E xp lo re r

使 用 V is u a l J + + 编 程 - 图2987使 用 V is u a l J + + 编 程 - 图2988使 用 V is u a l J + + 编 程 - 图2989中 可 以 右 击 该 文 件 名 然 后 单 击 R e n a m e 重 命 名 使 用 V is u a l J + + 编 程 - 图2990

使 用 V is u a l J + + 编 程 - 图2991使 用 V is u a l J + + 编 程 - 图2992使 用 V is u a l J + + 编 程 - 图2993使 用 V is u a l J + + 编 程 - 图2994使 用 V is u a l J + + 编 程 - 图2995使 用 V is u a l J + + 编 程 - 图2996注 意 重 命 名 该 文 件 不 会 重 命 名 在 源 代 码 中 与 之 关 系 的 类 反 之 亦然 用 户 必 须 手 工 改 变 所 有 老 的 名 称 的 实 例 使 用 V is u a l J + + 编 程 - 图2997 用 户 可 以 创 建 一 个 空的 项 目 并 且 添 加 Control 类 到 该 项 目 中 然 后 在 控 件 创 建 之 前 命名 该 控 件 使 用 V is u a l J + + 编 程 - 图2998

使 用 V is u a l J + + 编 程 - 图2999下 一 步 是 来 设 计 控 件 的 布 局

设 计 控 件 的 布 局

使 用 V is u a l J + + 编 程 - 图3000使 用 V is u a l J + + 编 程 - 图3001使 用 V is u a l J + + 编 程 - 图3002使 用 V is u a l J + + 编 程 - 图3003使 用 V is u a l J + + 编 程 - 图3004使 用 F o rm s D e sig n e r 来 设 计 组 合 控 件 的 布 局 该 进 程 与 设 计 窗 体 布 局 的进 程 是 一 样 的 用 户 可 以 从 工 具 箱 中 添 加 控 件 在 U s e r C on tro l 的 接 口上 移 动 控 件 和 重 置 控 件 的 大 小 指 定 属 性 和 创 建 事 件 处 理 程 序

使 用 V is u a l J + + 编 程 - 图3005使 用 V is u a l J + + 编 程 - 图3006使 用 V is u a l J + + 编 程 - 图3007使 用 V is u a l J + + 编 程 - 图3008该 方 案 示 范 了 如 何 创 建 一 个 组 合 控 件 该 控 件 中 包 含 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 控 件 的 一 部 分

使 用 V is u a l J + + 编 程 - 图3009使 用 V is u a l J + + 编 程 - 图3010使 用 V is u a l J + + 编 程 - 图3011使 用 V is u a l J + + 编 程 - 图3012使 用 V is u a l J + + 编 程 - 图3013添 加 控 件 当 C h eck B o x 控 件 未 被 选 取 时 则 禁 用 组 合 控 件 中 的 该 组 件但 选 取 C h eck B o x 控 件 时 将 启 用 组 合 控 件 中 的 该 控 件

添 加 控 件 到 U s e r C o n tr o l

  1. 使 用 V is u a l J + + 编 程 - 图3014在 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 中 打 开该 控 件

  2. 使 用 V is u a l J + + 编 程 - 图3015使 用 V is u a l J + + 编 程 - 图3016使 用 V is u a l J + + 编 程 - 图3017在 工 具 箱 中 选 择 W F C Co n t ro l W F C 控 件 使 用 V is u a l J + + 编 程 - 图3018 选 项 卡

使 用 V is u a l J + + 编 程 - 图3019使 用 V is u a l J + + 编 程 - 图3020使 用 V is u a l J + + 编 程 - 图3021如 果 工 具 箱 没 有 显 示 在 V ie w 视 图 使 用 V is u a l J + + 编 程 - 图3022 菜 单 中 单 击 T oo lbox

  1. 使 用 V is u a l J + + 编 程 - 图3023要 添 加 G roup B o x 控 件 到 U s e r C on tro l 中 可 以 在 工 具 箱 中 单 击

使 用 V is u a l J + + 编 程 - 图3024使 用 V is u a l J + + 编 程 - 图3025G roup B o x 控 件 然 后 单 击 U s e r C on tro l 设 计 表 面

使 用 V is u a l J + + 编 程 - 图3026G roup B o x 控 件 以 默 认 的 名 字 g roup B ox1 添 加

  1. 使 用 V is u a l J + + 编 程 - 图3027要 添 加 C h eck B o x 控 件 到 U s e r C on tro l 可 以 在 工 具 箱 中 单 击 C h eck B o x

使 用 V is u a l J + + 编 程 - 图3028使 用 V is u a l J + + 编 程 - 图3029控 件 然 后 拖 动 该 控 件 移 动 到 先 前 添 加 的 G roup B o x 控 件 的 左 上 角

使 用 V is u a l J + + 编 程 - 图3030使 用 V is u a l J + + 编 程 - 图3031C h eck B o x 控 件 以 默 认 的 名 字 c h e c kB ox1 添 加 确 保 C h eck B o x 控 件包 含 在 G roup B o x 控 件 中

使 用 V is u a l J + + 编 程 - 图3032使 用 V is u a l J + + 编 程 - 图3033使 用 V is u a l J + + 编 程 - 图3034使 用 V is u a l J + + 编 程 - 图3035使 用 V is u a l J + + 编 程 - 图3036要 节 省 屏 幕 的 空 间 重 新 设 置 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 中 的 控 件 的 大 小 也 是 很 重 要 的

设 置 控 件 的 大 小

  1. 使 用 V is u a l J + + 编 程 - 图3037使 用 V is u a l J + + 编 程 - 图3038使 用 V is u a l J + + 编 程 - 图3039重 新 设 置 环 绕 在 G roup B o x 和 C h eck B o x 控 件 周 围 U s e r C on tro l 的 设 计表 面 来 去 除 附 加 的 空 间 使 用 V is u a l J + + 编 程 - 图3040 要 重 置 设 计 表 面 的 大 小 选 择 该 接 口 并 且拖 动 设 置 大 小 柄 使 用 V is u a l J + + 编 程 - 图3041

使 用 V is u a l J + + 编 程 - 图3042使 用 V is u a l J + + 编 程 - 图3043当 U s e r C on tro l 设 计 表 面 添 加 到 窗 体 时 它 的 大 小 是 控 件 的 默 认 大 小

  1. 使 用 V is u a l J + + 编 程 - 图3044使 用 V is u a l J + + 编 程 - 图3045使 用 V is u a l J + + 编 程 - 图3046使 用 V is u a l J + + 编 程 - 图3047使 用 V is u a l J + + 编 程 - 图3048使 用 V is u a l J + + 编 程 - 图3049使 用 V is u a l J + + 编 程 - 图3050使 用 V is u a l J + + 编 程 - 图3051使 用 V is u a l J + + 编 程 - 图3052要 允 许 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 顶部 使 用 V is u a l J + + 编 程 - 图3053 Le f t 左 使 用 V is u a l J + + 编 程 - 图3054 R ig h t 右 使 用 V is u a l J + + 编 程 - 图3055 和 Bo t to m 底 部 使 用 V is u a l J + + 编 程 - 图3056

使 用 V is u a l J + + 编 程 - 图3057G roup B o x 控 件 现 在 被 锚 定 到 U s e r C on tro l 的 边 界 上

  1. 使 用 V is u a l J + + 编 程 - 图3058要 将

    G roup B o x 控 件 的 正 确 显 示 提 供 给 用 户 修 改 已 经 添 加 到

使 用 V is u a l J + + 编 程 - 图3059U s e r C on tro l 中 的 G roup B o x 和 C h eck B o x 的 属 性设 置 控 件 的 属 性

  1. 使 用 V is u a l J + + 编 程 - 图3060要 删 除 G roup B o x 控 件 的 默 认 标 题 可 以 在 P ro p e rtie s 窗 口 中 选 择 te x t

使 用 V is u a l J + + 编 程 - 图3061使 用 V is u a l J + + 编 程 - 图3062属 性 并 且 清 除 它 的 内 容

  1. 使 用 V is u a l J + + 编 程 - 图3063使 用 V is u a l J + + 编 程 - 图3064使 用 V is u a l J + + 编 程 - 图3065要 设 置 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

使 用 V is u a l J + + 编 程 - 图3066下 一 步 是 添 加 属 性 到 控 件 中

使 用 W F C C o m p onent B u ilde r添 加 定 制 属 性

使 用 V is u a l J + + 编 程 - 图3067使 用 V is u a l J + + 编 程 - 图3068使 用 V is u a l J + + 编 程 - 图3069使 用 V is u a l J + + 编 程 - 图3070使 用 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 添 加 属 性

  1. 使 用 V is u a l J + + 编 程 - 图3071使 用 V is u a l J + + 编 程 - 图3072在 P ro je c t E x p lore r 中 右 击 控 件 的 源 文 件 然 后 单 击 V ie w C ode 使 用 V is u a l J + + 编 程 - 图3073

使 用 V is u a l J + + 编 程 - 图3074看 代 码 使 用 V is u a l J + + 编 程 - 图3075

使 用 V is u a l J + + 编 程 - 图3076使 用 V is u a l J + + 编 程 - 图3077文 本 编 辑 器 打 开 并 且 显 示 控 件 的 源 文 件

  1. 使 用 V is u a l J + + 编 程 - 图3078使 用 V is u a l J + + 编 程 - 图3079使 用 V is u a l J + + 编 程 - 图3080使 用 V is u a l J + + 编 程 - 图3081使 用 V is u a l J + + 编 程 - 图3082使 用 V is u a l J + + 编 程 - 图3083使 用 V is u a l J + + 编 程 - 图3084在 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 使 用 V is u a l J + + 编 程 - 图3085

  2. 使 用 V is u a l J + + 编 程 - 图3086使 用 V is u a l J + + 编 程 - 图3087在 W F C C o m pone nt B u i lde r 的 P rope r t ie s 部 分 单 击 Ad d

  3. 使 用 V is u a l J + + 编 程 - 图3088使 用 V is u a l J + + 编 程 - 图3089使 用 V is u a l J + + 编 程 - 图3090使 用 V is u a l J + + 编 程 - 图3091在 A dd W F C P rope r ty 添 加 W F C 属 性 使 用 V is u a l J + + 编 程 - 图3092 对 话 框 中 为 G rou p B ox 控件 按 照 下 表 格 定 义 ch ec k e d 属 性 然 后 单 击 OK

字段 值

使 用 V is u a l J + + 编 程 - 图3093N a m e 名称 使 用 V is u a l J + + 编 程 - 图3094 che c ke d

使 用 V is u a l J + + 编 程 - 图3095使 用 V is u a l J + + 编 程 - 图3096D a ta T yp e 数据 类 型 Bo o le a n

使 用 V is u a l J + + 编 程 - 图3097使 用 V is u a l J + + 编 程 - 图3098Ca te g o ry 分类 B e hav ior

使 用 V is u a l J + + 编 程 - 图3099使 用 V is u a l J + + 编 程 - 图3100使 用 V is u a l J + + 编 程 - 图3101D 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 检 测 是否 控件 的 复 选框被选 取 使 用 V is u a l J + + 编 程 - 图3102

使 用 V is u a l J + + 编 程 - 图3103使 用 V is u a l J + + 编 程 - 图3104R e a d -o n ly P ro p e rty 只读 属 性 un c h e c k e d

使 用 V is u a l J + + 编 程 - 图3105D e c la re M e m b e r V a r ia b le 声 明 成 员变量 使 用 V is u a l J + + 编 程 - 图3106

un c h e c k e d

  1. 使 用 V is u a l J + + 编 程 - 图3107使 用 V is u a l J + + 编 程 - 图3108在 W F C C o m pone nt B u i lde r 中 单 击 OK

使 用 V is u a l J + + 编 程 - 图3109使 用 V is u a l J + + 编 程 - 图3110W 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 类 中

使 用 V is u a l J + + 编 程 - 图3111下 一 步 是 添 加 代 码 到 g e t C h e ck ed 和 se t C h e c k e d 方 法 中

添 加 代 码 到 属 性 方 法 中

使 用 V is u a l J + + 编 程 - 图3112使 用 V is u a l J + + 编 程 - 图3113W F C C o m pone nt B u i lde r 创 建 方 法 和 字 段 需 要 定 义 和 执 行 定 制 的 属 性一 般 是 用 户 自 己 修 改 代 码 来 提 供 自 己 的 实 现 操 作

添 加 代 码 到 属 性 方 法 中

  1. 使 用 V is u a l J + + 编 程 - 图3114使 用 V is u a l J + + 编 程 - 图3115对 于 要 返 回 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();

  1. 使 用 V is u a l J + + 编 程 - 图3116使 用 V is u a l J + + 编 程 - 图3117使 用 V is u a l J + + 编 程 - 图3118对 于 要 设 置 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);

使 用 V is u a l J + + 编 程 - 图3119使 用 V is u a l J + + 编 程 - 图3120这 些 代 码 基 于 传 递 到 该 属 性 的 值 来 设 置 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 方

使 用 V is u a l J + + 编 程 - 图3121法 的 调 用 o n C h eck C h an g e d 方 法 的 调 用 用 来 切 换 定 制 事 件

使 用 V is u a l J + + 编 程 - 图3122使 用 V is u a l J + + 编 程 - 图3123c h e c ke dC h a ng e d 中 该 事 件 在 后 面 将 添 加 到 该 方 案 中

使 用 V is u a l J + + 编 程 - 图3124使 用 V is u a l J + + 编 程 - 图3125使 用 V is u a l J + + 编 程 - 图3126使 用 V is u a l J + + 编 程 - 图3127E 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 控 件 中 的 控 件

使 用 V is u a l J + + 编 程 - 图3128这 些 方 法 也 将 在 后 面 添 加 到 该 方 案 中

使 用 W F C C o m p onent B u ilde r添 加 事 件

使 用 V is u a l J + + 编 程 - 图3129使 用 V is u a l J + + 编 程 - 图3130使 用 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 添 加 事 件

  1. 使 用 V is u a l J + + 编 程 - 图3131使 用 V is u a l J + + 编 程 - 图3132使 用 V is u a l J + + 编 程 - 图3133使 用 V is u a l J + + 编 程 - 图3134使 用 V is u a l J + + 编 程 - 图3135使 用 V is u a l J + + 编 程 - 图3136使 用 V is u a l J + + 编 程 - 图3137在 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 使 用 V is u a l J + + 编 程 - 图3138

  2. 使 用 V is u a l J + + 编 程 - 图3139使 用 V is u a l J + + 编 程 - 图3140使 用 V is u a l J + + 编 程 - 图3141在 W F C C o m pone nt B u i lde r 的 E v e n t 事 件 使 用 V is u a l J + + 编 程 - 图3142 部 分 单 击 Ad d

  3. 使 用 V is u a l J + + 编 程 - 图3143使 用 V is u a l J + + 编 程 - 图3144在 A dd W F C E v e n t 添 加 W F C 事 件 使 用 V is u a l J + + 编 程 - 图3145 对 话 框 中 按 下 表 为 G r oupC he c k

使 用 V is u a l J + + 编 程 - 图3146使 用 V is u a l J + + 编 程 - 图3147控 件 定 义 c h e c ke dC h a ng e d 事 件 然 后 单 击 OK

使 用 V is u a l J + + 编 程 - 图3148使 用 V is u a l J + + 编 程 - 图3149使 用 V is u a l J + + 编 程 - 图3150使 用 V is u a l J + + 编 程 - 图3151字段 值

N a m e

使 用 V is u a l J + + 编 程 - 图3152 名称

c h e c k e dCha nge d

T y p e

类型 使 用 V is u a l J + + 编 程 - 图3153

Ev e n t 事件

使 用 V is u a l J + + 编 程 - 图3154使 用 V is u a l J + + 编 程 - 图3155Ca te g o ry 种类 使 用 V is u a l J + + 编 程 - 图3156 Ac t io n 活动 使 用 V is u a l J + + 编 程 - 图3157

使 用 V is u a l J + + 编 程 - 图3158D e sc r ip tio n 说明 使 用 V is u a l J + + 编 程 - 图3159 当 事 件的 复 选 框选 取状 态 改 变时 发生

  1. 使 用 V is u a l J + + 编 程 - 图3160使 用 V is u a l J + + 编 程 - 图3161在 W F C C o m pone nt B u i lde r 中 单 击 OK

使 用 V is u a l J + + 编 程 - 图3162W 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

使 用 V is u a l J + + 编 程 - 图3163使 用 V is u a l J + + 编 程 - 图3164使 用 V is u a l J + + 编 程 - 图3165使 用 V is u a l J + + 编 程 - 图3166re 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 委 托 的 实 例 该 委 托 由 事 件 使 用

使 用 V is u a l J + + 编 程 - 图3167下 一 步 是 超 越 继 承 方 法

超 越 U s e r C on tro l的 方 法

使 用 V is u a l J + + 编 程 - 图3168使 用 V is u a l J + + 编 程 - 图3169使 用 V is u a l J + + 编 程 - 图3170使 用 V is u a l J + + 编 程 - 图3171使 用 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 超 越 方 法

  1. 使 用 V is u a l J + + 编 程 - 图3172使 用 V is u a l J + + 编 程 - 图3173在 C la ss O u t l in e 中 扩 展 类 的 节 点

  2. 使 用 V is u a l J + + 编 程 - 图3174使 用 V is u a l J + + 编 程 - 图3175扩 展 Inhe r i te d m e m b e r 节 点 然 后 右 击 想 要 超 越 的 方 法 名

使 用 V is u a l J + + 编 程 - 图3176使 用 V is u a l J + + 编 程 - 图3177使 用 V is u a l J + + 编 程 - 图3178如 果 该 方 法 可 以 被 超 越 则 快 捷 菜 单 上 显 示 O v e r r ide M e thod 超 越 方法 使 用 V is u a l J + + 编 程 - 图3179

  1. 使 用 V is u a l J + + 编 程 - 图3180单 击 O v e r r ide M e thod

使 用 V is u a l J + + 编 程 - 图3181C la ss O u t l in e 为 指 定 的 方 法 添 加 一 个 方 法 定 义 到 用 户 的 源 代 码 中

  1. 使 用 V is u a l J + + 编 程 - 图3182使 用 V is u a l J + + 编 程 - 图3183使 用 V is u a l J + + 编 程 - 图3184使 用 V is u a l J + + 编 程 - 图3185使 用 V is u a l J + + 编 程 - 图3186使 用 V is u a l J + + 编 程 - 图3187对 于 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 方 法 创 建 超 越 的 方 法

使 用 V is u a l J + + 编 程 - 图3188下 一 步 是 添 加 代 码 到 超 越 方 法 中

添 加 代 码 到 超 越 方 法

使 用 V is u a l J + + 编 程 - 图3189使 用 V is u a l J + + 编 程 - 图3190使 用 V is u a l J + + 编 程 - 图3191当 已 经 使 用 C la ss O u t l in e 创 建 了 超 越 方 法 之 后 用 户 将 实 现 代 码 提 供 到方 法 定 义 中 保 留 或 是 删 除 到 超 类 的 调 用 取 决 于 用 户 如 何 执 行 超 越 方法

添 加 代 码 到 ad d 方 法

使 用 V is u a l J + + 编 程 - 图3192使 用 V is u a l J + + 编 程 - 图3193使 用 V is u a l J + + 编 程 - 图3194使 用 V is u a l J + + 编 程 - 图3195要 添 加 控 件 到 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 方 法

  1. 使 用 V is u a l J + + 编 程 - 图3196使 用 V is u a l J + + 编 程 - 图3197使 用 V is u a l J + + 编 程 - 图3198使 用 V is u a l J + + 编 程 - 图3199在 添 加 代 码 代 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 ;

  1. 使 用 V is u a l J + + 编 程 - 图3200添 加 下 面 的 代 码 替 代 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) ;

使 用 V is u a l J + + 编 程 - 图3201使 用 V is u a l J + + 编 程 - 图3202使 用 V is u a l J + + 编 程 - 图3203使 用 V is u a l J + + 编 程 - 图3204使 用 V is u a l J + + 编 程 - 图3205使 用 V is u a l J + + 编 程 - 图3206使 用 V is u a l J + + 编 程 - 图3207使 用 V is u a l J + + 编 程 - 图3208使 用 V is u a l J + + 编 程 - 图3209这 些 代 码 检 测 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 控 件 中 所 以 当 添加 控 件 时 该 控 件 的 启 用 或 禁 用 的 状 态 是 非 常 重 要 的

使 用 V is u a l J + + 编 程 - 图3210使 用 V is u a l J + + 编 程 - 图3211使 用 V is u a l J + + 编 程 - 图3212使 用 V is u a l J + + 编 程 - 图3213使 用 V is u a l J + + 编 程 - 图3214使 用 V is u a l J + + 编 程 - 图3215这 些 代 码 然 后 调 用 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 方 法 的 超 类 版 并 且带 有 作 为 参 数 传 递 的 控 件

添 加 代 码 到 控 件 相 关 的 方 法

使 用 V is u a l J + + 编 程 - 图3216使 用 V is u a l J + + 编 程 - 图3217使 用 V is u a l J + + 编 程 - 图3218所 以 用 户 可 以 访 问 在 G roup B o x 中 的 控 件 用 户 在 ge t C on tro l

使 用 V is u a l J + + 编 程 - 图3219使 用 V is u a l J + + 编 程 - 图3220g e t C o n tro l C ount 和 g e tC o n tro ls 方 法 中 提 供 代 码 用 来 调 用 G roup B o x 控件 的 这 些 代 码 的 实 现

添 加 代 码 到 控 件 关 系 的 方 法

  1. 使 用 V is u a l J + + 编 程 - 图3221使 用 V is u a l J + + 编 程 - 图3222在 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 ) ;

  1. 使 用 V is u a l J + + 编 程 - 图3223在 g e t C o n tro l C ount 方 法 的 定 义 中 输 入 下 列 代 码 来 替 换 由 C la ss O u t l in e

使 用 V is u a l J + + 编 程 - 图3224添 加 的 代 码

retu rn group B o x 1 .g e t C o ntro lC o unt();

  1. 使 用 V is u a l J + + 编 程 - 图3225使 用 V is u a l J + + 编 程 - 图3226在 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 方 法

使 用 V is u a l J + + 编 程 - 图3227控 件 可 以 从 G roupC he c k 控 件 中 删 除 用 户 在 re m o v e 方 法 中 为

使 用 V is u a l J + + 编 程 - 图3228使 用 V is u a l J + + 编 程 - 图3229G roupC he c k 提 供 代 码 用 来 调 用 G roup B o x 控 件 的 re m o v e 方 法添 加 代 码 到 re m o v e 方 法

  • 使 用 V is u a l J + + 编 程 - 图3230在 re m o v e 方 法 中 输 入 下 列 代 码 来 替 换 由 C la s s O u tlin e 已 添 加 的 代

使 用 V is u a l J + + 编 程 - 图3231

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);

}

使 用 V is u a l J + + 编 程 - 图3232使 用 V is u a l J + + 编 程 - 图3233使 用 V is u a l J + + 编 程 - 图3234使 用 V is u a l J + + 编 程 - 图3235这 些 代 码 检 测 m _bR e a dy 变 量 是 否 为 真 如 果 为 真 该 代 码 调 用G roup B o x 控 件 的 re m o v e 方 法 的 版 本 并 带 有 作 为 参 数 传 递 到 该 方 法的 控 件 用 于 m _bR e a dy

使 用 V is u a l J + + 编 程 - 图3236使 用 V is u a l J + + 编 程 - 图3237使 用 V is u a l J + + 编 程 - 图3238使 用 V is u a l J + + 编 程 - 图3239使 用 V is u a l J + + 编 程 - 图3240的 复 选 框 为 真 则 阻 止 C h eck B o x 或 G roup B o x 控 件 被 删 除 如 果m _bR e a dy 为 假 则 代 码 调 用 超 类 方 法 的 译 本 用 来 验 证 控 件 完 全 删除

添 加 代 码 到 set T ex t 方 法

使 用 V is u a l J + + 编 程 - 图3241使 用 V is u a l J + + 编 程 - 图3242使 用 V is u a l J + + 编 程 - 图3243使 用 V is u a l J + + 编 程 - 图3244G roup B o x 控 件 不 提 供 自 动 设 置 控 件 的 文 本 部 分 用 来 计 算 显 示 文 本 的数 量 的 方 法 超 越 se t T e x t 方 法 来 检 测 正 确 的 基 于 文 本 大 小 的 宽 度 来 显示 文 本 使 G roupC he c k 控 件 适 当 显 示 它 的 文 本

添 加 代 码 到 se t T e x t 方 法

  • 使 用 V is u a l J + + 编 程 - 图3245使 用 V is u a l J + + 编 程 - 图3246

    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);

使 用 V is u a l J + + 编 程 - 图3247使 用 V is u a l J + + 编 程 - 图3248使 用 V is u a l J + + 编 程 - 图3249使 用 V is u a l J + + 编 程 - 图3250使 用 V is u a l J + + 编 程 - 图3251使 用 V is u a l J + + 编 程 - 图3252使 用 V is u a l J + + 编 程 - 图3253使 用 V is u a l J + + 编 程 - 图3254这 些 代 码 使 用 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 方 法 的 超 类 版 本

使 用 V is u a l J + + 编 程 - 图3255下 一 步 是 添 加 新 的 方 法 到 该 控 件 中

添 加 方 法 到 该 控 件

使 用 V is u a l J + + 编 程 - 图3256使 用 V is u a l J + + 编 程 - 图3257使 用 V is u a l J + + 编 程 - 图3258使 用 V is u a l J + + 编 程 - 图3259使 用 V is u a l J + + 编 程 - 图3260使 用 V is u a l J + + 编 程 - 图3261当 正 在 开 发 控 件 时 用 户 必 须 经 常 提 供 方 法 以 执 行 控 件 中 的 动 作 对 于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 方 法 中 调 用

添 加 方 法 控 件

  • 使 用 V is u a l J + + 编 程 - 图3262添 加 下 面 的 方 法 定 义 到 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);’

}

}

使 用 V is u a l J + + 编 程 - 图3263使 用 V is u a l J + + 编 程 - 图3264使 用 V is u a l J + + 编 程 - 图3265使 用 V is u a l J + + 编 程 - 图3266en ab le C o n t ro ls 方 法 接 收 一 个 控 件 和 一 个 布 尔 值 用 来 确 定 所 包 含 的控 件 是 否 应 该 禁 用 或 启 用 当 该 方 法 由 se tc h e ck ed 方 法 调 用 时 它 传递 当 前 G roupC he c k 控 件 的 一 个 实 例

使 用 V is u a l J + + 编 程 - 图3267使 用 V is u a l J + + 编 程 - 图3268使 用 V is u a l J + + 编 程 - 图3269使 用 V is u a l J + + 编 程 - 图3270使 用 V is u a l J + + 编 程 - 图3271使 用 V is u a l J + + 编 程 - 图3272en 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 的 递 归 调 用 被 启 用 或 禁用

使 用 V is u a l J + + 编 程 - 图3273下 一 步 是 添 加 代 码 到 构 造 器 中

添 加 代 码 到 构 造 器

使 用 V is u a l J + + 编 程 - 图3274使 用 V is u a l J + + 编 程 - 图3275要 为 控 件 提 供 初 始 设 置 可 以 添 加 代 码 到 构 造 器 中 对 于 G roupC he c k

使 用 V is u a l J + + 编 程 - 图3276使 用 V is u a l J + + 编 程 - 图3277控 件 用 户 添 加 控 件 添 加 到 窗 体 时 设 置 属 性 的 代 码

添 加 代 码 到 构 造 器

  • 使 用 V is u a l J + + 编 程 - 图3278使 用 下 面 的 代 码 替 换 在 构 造 器 中 用 于 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

使 用 V is u a l J + + 编 程 - 图3279使 用 V is u a l J + + 编 程 - 图3280使 用 V is u a l J + + 编 程 - 图3281使 用 V is u a l J + + 编 程 - 图3282使 用 V is u a l J + + 编 程 - 图3283这 些 代 码 将 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 控 件 中的 控 件

使 用 V is u a l J + + 编 程 - 图3284下 一 步 是 编 译 该 控 件

编 译 控 件

使 用 V is u a l J + + 编 程 - 图3285使 用 V is u a l J + + 编 程 - 图3286使 用 V is u a l J + + 编 程 - 图3287使 用 V is u a l J + + 编 程 - 图3288要 使 用 该 控 件 用 户 必 须 编 译 它 当 控 件 编 译 后 用 户 可 以 将 其 添 加 到工 具 箱 中

编 译 控 件

  1. 使 用 V is u a l J + + 编 程 - 图3289使 用 V is u a l J + + 编 程 - 图3290使 用 V is u a l J + + 编 程 - 图3291在 Bu i ld 编 译 使 用 V is u a l J + + 编 程 - 图3292 菜 单 上 单 击 Bu i ld

使 用 V is u a l J + + 编 程 - 图3293使 用 V is u a l J + + 编 程 - 图3294使 用 V is u a l J + + 编 程 - 图3295所 有 编 辑 错 误 或 消 息 出 现 在 T a sk L ist 中 双 击 在 Ta sk L is t 中 的 某 个错 误 可 以 将 插 入 点 移 动 到 在 Te x t 编 辑 器 中 产 生 该 错 误 的 代 码 处 使 用 V is u a l J + + 编 程 - 图3296

  1. 使 用 V is u a l J + + 编 程 - 图3297改 正 错 误 并 且 重 新 编 译 控 件

使 用 V is u a l J + + 编 程 - 图3298下 一 步 是 调 试 控 件

调 试 控 件

使 用 V is u a l J + + 编 程 - 图3299使 用 V is u a l J + + 编 程 - 图3300使 用 V is u a l J + + 编 程 - 图3301使 用 V is u a l J + + 编 程 - 图3302使 用 V is u a l J + + 编 程 - 图3303使 用 V is u a l J + + 编 程 - 图3304使 用 V is u a l J + + 编 程 - 图3305使 用 V is u a l J + + 编 程 - 图3306使 用 V is u a l J + + 编 程 - 图3307使 用 V is u a l J + + 编 程 - 图3308当 编 译 控 件 之 后 可 以 测 试 和 调 试 该 控 件 来 确 保 该 控 件 是 否 如 期 操 作 要 做 到 这 些 应 该 添 加 控 件 到 工 具 箱 中 添 加 窗 体 到 项 目 中 然 后 添 加该 控 件 到 该 窗 体 对 于 G roupC he c k 方 案 来 说 用 户 还 可 以 添 加 控 件 到G roupC he c k 控 件 并 添 加 一 个 用 于 该 控 件 的 事 件 处 理 程 序 随 后 编 译并 且 运 行 该 控 件

添 加 控 件 的 工 具 箱

使 用 V is u a l J + + 编 程 - 图3309使 用 V is u a l J + + 编 程 - 图3310使 用 V is u a l J + + 编 程 - 图3311使 用 V is u a l J + + 编 程 - 图3312当 编 译 控 件 之 后 为 了 要 使 用 该 控 件 应 该 将 其 添 加 到 工 具 箱 中添 加 控 件 到 工 具 箱

  1. 使 用 V is u a l J + + 编 程 - 图3313使 用 V is u a l J + + 编 程 - 图3314右 击 工 具 箱 然 后 单 击 C u s tom iz e T o o lbox 定 制 工 具 栏 使 用 V is u a l J + + 编 程 - 图3315

  2. 使 用 V is u a l J + + 编 程 - 图3316使 用 V is u a l J + + 编 程 - 图3317使 用 V is u a l J + + 编 程 - 图3318使 用 V is u a l J + + 编 程 - 图3319

    单 击 W F C Co n t ro ls使 用 V is u a l J + + 编 程 - 图3320 W F C 控 件 使 用 V is u a l J + + 编 程 - 图3321 选 项 卡 并 且 选 择 要 添 加 的 控 件 名对 于 本 方 案 来 说 单 击 G roupC he c k 控 件

  3. 使 用 V is u a l J + + 编 程 - 图3322单 击 O K

添 加 窗 体 到 项 目

使 用 V is u a l J + + 编 程 - 图3323使 用 V is u a l J + + 编 程 - 图3324要 测 试 和 调 试 控 件 用 户 应 该 添 加 一 个 窗 体 到 项 目 中

添 加 窗 体 到 项 目

  1. 使 用 V is u a l J + + 编 程 - 图3325使 用 V is u a l J + + 编 程 - 图3326使 用 V is u a l J + + 编 程 - 图3327在 P ro je c t E x p lore r 中 右 击 该 项 目 名 称 将 鼠 标 指 向 Ad d 然 后 单 击

使 用 V is u a l J + + 编 程 - 图3328使 用 V is u a l J + + 编 程 - 图3329A dd F o rm 添 加 窗 体 使 用 V is u a l J + + 编 程 - 图3330

  1. 使 用 V is u a l J + + 编 程 - 图3331单 击 Fo rm 图 标

  2. 使 用 V is u a l J + + 编 程 - 图3332使 用 V is u a l J + + 编 程 - 图3333在 N a m e 框 中 输 入 用 于 该 窗 体 的 名 称

使 用 V is u a l J + + 编 程 - 图3334使 用 V is u a l J + + 编 程 - 图3335使 用 V is u a l J + + 编 程 - 图3336要 确 保 输 入 的 窗 体 名 称 不 是 G roupC he c k 这 样 该 窗 体 的 源 文 件 将不 会 与 用 户 控 件 的 名 称 有 冲 突

  1. 使 用 V is u a l J + + 编 程 - 图3337单 击 O p e n

使 用 V is u a l J + + 编 程 - 图3338使 用 V is u a l J + + 编 程 - 图3339带 有 指 定 名 称 的 窗 体 添 加 到 项 目 中 并 且 在 Fo rm s D e s ig n e r 中 打 开

添 加 控 件 到 窗 体

使 用 V is u a l J + + 编 程 - 图3340用 户 添 加 控 件 到 窗 体 中 来 测 试 该 控 件添 加 控 件 到 窗 体

  1. 使 用 V is u a l J + + 编 程 - 图3341选 择 该 窗 体

  2. 使 用 V is u a l J + + 编 程 - 图3342使 用 V is u a l J + + 编 程 - 图3343使 用 V is u a l J + + 编 程 - 图3344

    工 具 箱 中 双 击 要 添 加 的 控 件控 件 添 加 到 窗 体 的 中 间

添 加 控 件 到 G ro u p C h e c k 控 件

使 用 V is u a l J + + 编 程 - 图3345使 用 V is u a l J + + 编 程 - 图3346要 确 保 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

控 件

使 用 V is u a l J + + 编 程 - 图3347使 用 V is u a l J + + 编 程 - 图3348使 用 V is u a l J + + 编 程 - 图3349使 用 V is u a l J + + 编 程 - 图3350的 中 间

创 建 事 件 处 理 程 序

使 用 V is u a l J + + 编 程 - 图3351使 用 V is u a l J + + 编 程 - 图3352使 用 V is u a l J + + 编 程 - 图3353使 用 V is u a l J + + 编 程 - 图3354使 用 V is u a l J + + 编 程 - 图3355使 用 V is u a l J + + 编 程 - 图3356G 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 事 件 的 事 件 处 理 程 序

  1. 使 用 V is u a l J + + 编 程 - 图3357使 用 V is u a l J + + 编 程 - 图3358在 P rope r t ie s 窗 口 中 单 击 E v e n ts 工 具 栏 按 钮

  2. 使 用 V is u a l J + + 编 程 - 图3359使 用 V is u a l J + + 编 程 - 图3360使 用 V is u a l J + + 编 程 - 图3361要 显 示 G roupC he c k 控 件 的 事 件 在 窗 体 上 选 择 G rou pC he c k 控 件或 者 在 P rope r t ie s 窗 口 中 选 择 G roupC he c k 控 件 的 名 称

  3. 使 用 V is u a l J + + 编 程 - 图3362双 击 c h e c ke dC h a ng e d 事 件 来 创 建 带 有 默 认 方 法 名 的 事 件 处 理 程 序

使 用 V is u a l J + + 编 程 - 图3363Te x t 编 辑 器 打 开 一 个 空 的 事 件 处 理 程 序

使 用 V is u a l J + + 编 程 - 图3364使 用 V is u a l J + + 编 程 - 图3365使 用 V is u a l J + + 编 程 - 图3366要 确 定 c h e c ke dC h a ng e d 事 件 是 否 触 发 可 以 添 加 代 码 到 该 事 件 处 理 程序 中 用 来 在 每 次 事 件 触 发 时 在 窗 体 上 显 示 一 个 消 息 框

为 事 件 处 理 程 序 添 加 代 码

  • 使 用 V is u a l J + + 编 程 - 图3367使 用 V is u a l J + + 编 程 - 图3368在 该 事 件 处 理 程 序 的 定 义 中 添 加 下 面 的 一 行 代 码

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 . " )

编 译 并 测 试 控 件

使 用 V is u a l J + + 编 程 - 图3369使 用 V is u a l J + + 编 程 - 图3370使 用 V is u a l J + + 编 程 - 图3371使 用 V is u a l J + + 编 程 - 图3372当 已 经 将 控 件 添 加 到 窗 体 并 添 加 控 件 到 G roupC he c k 控 件 中 及 添 加用 于 控 件 的 c h e c ke dC h a ng e d 事 件 的 事 件 处 理 程 序 之 后 用 户 可 以 编 译并 运 行 该 项 目

编 译 和 运 行 窗 体

  1. 使 用 V is u a l J + + 编 程 - 图3373使 用 V is u a l J + + 编 程 - 图3374使 用 V is u a l J + + 编 程 - 图3375使 用 V is u a l J + + 编 程 - 图3376在 Bu i ld 菜 单 上 单 击 Bu i ld 如 果 收 到 任 何 编 译 错 误 或 消 息 改 正 错误 并 重 新 编 译 项 目 使 用 V is u a l J + + 编 程 - 图3377

  2. 使 用 V is u a l J + + 编 程 - 图3378单 击 在 D e bug 菜 单 上 的 S ta r t

使 用 V is u a l J + + 编 程 - 图3379使 用 V is u a l J + + 编 程 - 图3380使 用 V is u a l J + + 编 程 - 图3381因 为 用 户 正 在 第 一 次 运 行 该 项 目 并 且 由 于 该 项 目 有 两 个 .ja v a 文 件则 显 示 P ro je c t P rope r tie s 对 话 框

  1. 使 用 V is u a l J + + 编 程 - 图3382使 用 V is u a l J + + 编 程 - 图3383在 L a unc h 选 项 卡 上 选 择 D e fa u l t 选 项 按 钮

  2. 使 用 V is u a l J + + 编 程 - 图3384使 用 V is u a l J + + 编 程 - 图3385当 项 目 运 行 时 指 定 Fo rm 1 将 加 载

使 用 V is u a l J + + 编 程 - 图3386使 用 V is u a l J + + 编 程 - 图3387使 用 V is u a l J + + 编 程 - 图3388关 于 P ro ject 属 性 的 详 细 信 息 请 参 见 第 一 章 的 P ro je c t 选 项

使 用 V is u a l J + + 编 程 - 图3389使 用 V is u a l J + + 编 程 - 图3390当 该 项 目 运 行 时 用 户 可 以 操 作 该 控 件 用 来 确 定 该 控 件 是 否操 作 正 确

在 运 行 时 间 测 试 该 控 件

  • 使 用 V is u a l J + + 编 程 - 图3391在 G roupC he c k 控 件 中 单 击 复 选 框

使 用 V is u a l J + + 编 程 - 图3392使 用 V is u a l J + + 编 程 - 图3393使 用 V is u a l J + + 编 程 - 图3394使 用 V is u a l J + + 编 程 - 图3395使 用 V is u a l J + + 编 程 - 图3396— 个 消 息 框 显 示 出 来 通 知 用 户 c h e c ke dC h a ng e d 事 件 触 发 每 次 当复 选 框 的 选 取 状 态 改 变 时 该 事 件 发 生 包 含 在 G roupC he c k 控 件 中的 控 件 的 启 用 或 禁 用 取 决 于 该 控 件 的 选 取 状 态

使 用 V is u a l J + + 编 程 - 图3397使 用 V is u a l J + + 编 程 - 图3398使 用 V is u a l J + + 编 程 - 图3399使 用 V is u a l J + + 编 程 - 图3400有 关 将 W F C 控 件 作 为 Ac t iv e X 控 件 输 出 的 更 多 信 息 见 本 书 的 第 16 章中 的 创 建 和 导 入 Ac t iv e X 控 件

第 14 章 在 Ja v a 中 编 制 动 态 H T M L

使 用 V is u a l J + + 编 程 - 图3401使 用 V is u a l J + + 编 程 - 图3402使 用 V is u a l J + + 编 程 - 图3403使 用 V is u a l J + + 编 程 - 图3404使 用 V is u a l J + + 编 程 - 图3405使 用 V is u a l J + + 编 程 - 图3406使 用 V is u a l J + + 编 程 - 图3407通 过 使 用 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 使 用 V is u a l J + + 编 程 - 图3408 框 架 的 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

使 用 V is u a l J + + 编 程 - 图3409使 用 V is u a l J + + 编 程 - 图3410D H T M L 使 用 V is u a l J + + 编 程 - 图3411

使 用 V is u a l J + + 编 程 - 图3412本 章 包 含 下 面 的 主 题

  • 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 软 件 包

快 速 开 始

使 用 V is u a l J + + 编 程 - 图3413使 用 V is u a l J + + 编 程 - 图3414使 用 V is u a l J + + 编 程 - 图3415使 用 V is u a l J + + 编 程 - 图3416使 用 V is u a l J + + 编 程 - 图3417使 用 V is u a l J + + 编 程 - 图3418使 用 V is u a l J + + 编 程 - 图3419为 了 帮 助 用 户 通 过 使 用 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 个 基 本步 骤

  1. 使 用 V is u a l J + + 编 程 - 图3420使 用 V is u a l J + + 编 程 - 图3421通 过 从 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 命 令 来 创 建 新 项 目

使 用 V is u a l J + + 编 程 - 图3422使 用 V is u a l J + + 编 程 - 图3423使 用 V is u a l J + + 编 程 - 图3424使 用 V is u a l J + + 编 程 - 图3425这 就 产 生 了 一 个 包 含 名 为 C la ss1 的 类 的 对 象 该 对 象 扩 展D h D o c u m e n t 这 些 类 描 述 动 态 的 HTM L 文 档 加 入 初 始 化 代 码 到in it F o rm 方 法 中 可 以 控 制 文 档 的 内 容 和 行 为

使 用 V is u a l J + + 编 程 - 图3426使 用 V is u a l J + + 编 程 - 图3427通 过 做 下 面 的 工 作 可 以 扩 展 文 档 的 行 为

  1. 使 用 V is u a l J + + 编 程 - 图3428使 用 V is u a l J + + 编 程 - 图3429使 用 V is u a l J + + 编 程 - 图3430创 建 新 的 元 素 例 如 D h B u tto m 使 用 V is u a l J + + 编 程 - 图3431 或 创 建 描 述 文 档 中 HT M L 页 上 的 使 用 V is u a l J + + 编 程 - 图3432现 有 元 素 的 元 素 对 象

  2. 使 用 V is u a l J + + 编 程 - 图3433对 一 些 元 素 挂 上 事 件 处 理 程 序

  3. 使 用 V is u a l J + + 编 程 - 图3434使 用 V is u a l J + + 编 程 - 图3435使 用 V is u a l J + + 编 程 - 图3436在 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 方 法 连 接 任 何 一 个 现 有 元 素

  4. 使 用 V is u a l J + + 编 程 - 图3437使 用 V is u a l J + + 编 程 - 图3438

    写 在 步 骤 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 ");

}

}

使 用 V is u a l J + + 编 程 - 图3439使 用 V is u a l J + + 编 程 - 图3440使 用 V is u a l J + + 编 程 - 图3441使 用 V is u a l J + + 编 程 - 图3442用 来 练 习 的 Ja va 部 分 已 经 完 成 其 他 部 分 是 HTM L 的 代 码 下 例 显 示了 由 C ode - b e h in d H T M L 对 象 模 式 产 生 的 HT M L 文 档 的 简 化 版 本 这 里有 两 个 连 接 HTM L 到 用 户 项 目 中 的 代 码 的 元 素

  1. 使 用 V is u a l J + + 编 程 - 图3443< O B J EC T> 标 记 加 载 c o m .m s . w fc .h tm l .dh M odu le 类 该 类 通 过 Ja v a 的

使 用 V is u a l J + + 编 程 - 图3444V irtu a l M a c h in e fo r J a v a 实 例 化

  1. 使 用 V is u a l J + + 编 程 - 图3445使 用 V is u a l J + + 编 程 - 图3446< 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 文 件

然 后 可 以 看 到

应 用 程 序 的 运 行

使 用 V is u a l J + + 编 程 - 图3447使 用 V is u a l J + + 编 程 - 图3448使 用 V is u a l J + + 编 程 - 图3449使 用 in it F o rm 方 法

使 用 V is u a l J + + 编 程 - 图3450使 用 V is u a l J + + 编 程 - 图3451使 用 V is u a l J + + 编 程 - 图3452使 用 V is u a l J + + 编 程 - 图3453使 用 V is u a l J + + 编 程 - 图3454使 用 V is u a l J + + 编 程 - 图3455使 用 V is u a l J + + 编 程 - 图3456使 用 V is u a l J + + 编 程 - 图3457在 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 模 板 使 用 V is u a l J + + 编 程 - 图3458 并 且它 由 类 的 构 造 器 调 用

使 用 V is u a l J + + 编 程 - 图3459使 用 V is u a l J + + 编 程 - 图3460使 用 V is u a l J + + 编 程 - 图3461用 户 将 使 用 in it F o rm 方 法 来 初 始 化 Ja va 组 件 该 组 件 代 表 用 户 想 要 访问 和 加 入 代 码 的 HTM L 元 素 当 在 Fo rm - d e r iv ed 类 中 有 in it F o rm 方 法

使 用 V is u a l J + + 编 程 - 图3462使 用 V is u a l J + + 编 程 - 图3463使 用 V is u a l J + + 编 程 - 图3464使 用 V is u a l J + + 编 程 - 图3465使 用 V is u a l J + + 编 程 - 图3466并 从 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 页 中 的 元 素

使 用 V is u a l J + + 编 程 - 图3467使 用 V is u a l J + + 编 程 - 图3468使 用 V is u a l J + + 编 程 - 图3469使 用 V is u a l J + + 编 程 - 图3470使 用 V is u a l J + + 编 程 - 图3471使 用 V is u a l J + + 编 程 - 图3472特 别 是 这 就 意 味 着 在 in it F o rm 中 不 支 持 调 用 重 新 设 置 或 删 除 属 性 或元 素 的 任 何 方 法 这 条 规 则 也 同 样 适 用 于 试 图 定 位 到 已 有 HTM L 页 上的 任 何 方 法 例 如 D h D o c u m e n t .f indE le m e nt

使 用 V is u a l J + + 编 程 - 图3473使 用 V is u a l J + + 编 程 - 图3474使 用 V is u a l J + + 编 程 - 图3475使 用 V is u a l J + + 编 程 - 图3476使 用 V is u a l J + + 编 程 - 图3477使 用 V is u a l J + + 编 程 - 图3478使 用 V is u a l J + + 编 程 - 图3479使 用 V is u a l J + + 编 程 - 图3480这 是 因 为 直 到 调 用 了 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类

使 用 V is u a l J + + 编 程 - 图3481使 用 V is u a l J + + 编 程 - 图3482使 用 V is u a l J + + 编 程 - 图3483使 用 V is u a l J + + 编 程 - 图3484元 素 是 源 于 D h E lem en t 的 对 象 是 在 c o m .m s. w fc .h tm l 软 件 包 中 所 有 用户 界 面 元 素 的 超 类 当 使 用 源 于 D h E lem en t 的 任 何 对 象 时 会 有 某 种 一致 性

  • 使 用 V is u a l J + + 编 程 - 图3485使 用 V is u a l J + + 编 程 - 图3486使 用 V is u a l J + + 编 程 - 图3487使 用 V is u a l J + + 编 程 - 图3488使 用 V is u a l J + + 编 程 - 图3489每 个 事 件 都 有 一 个 空 的 构 造 器 因 此 用 户 能 够 使 用 一 个 新 的 语 句 实例 化 任 何 元 素 然 后 一 致 设 置 属 性 挂 接 事 件 处 理 程 序 和 调 用 方 法

  • 使 用 V is u a l J + + 编 程 - 图3490使 用 V is u a l J + + 编 程 - 图3491使 用 V is u a l J + + 编 程 - 图3492事 件 是 非 模 态 的 设 置 属 性 或 调 用 方 法 总 是 以 任 何 顺 序 进 行 并 且 在一 些 外 部 的 状 态 或 环 境 中 它 是 无 条 件 的

  • 使 用 V is u a l J + + 编 程 - 图3493使 用 V is u a l J + + 编 程 - 图3494每 个 包 容 器 都 有 一 个 带 有 最 适 合 的 安 全 类 型 元 素 的 添 加 方 法

  • 使 用 V is u a l J + + 编 程 - 图3495使 用 V is u a l J + + 编 程 - 图3496使 用 V is u a l J + + 编 程 - 图3497使 用 V is u a l J + + 编 程 - 图3498使 用 V is u a l J + + 编 程 - 图3499使 用 V is u a l J + + 编 程 - 图3500使 用 V is u a l J + + 编 程 - 图3501使 用 V is u a l J + + 编 程 - 图3502使 用 V is u a l J + + 编 程 - 图3503使 用 V is u a l J + + 编 程 - 图3504

    浏 览 器 环 境 中 直 到 用 户 添 加 元 素 或 是 在 它 的 父 系 中 最 上 层 的 包容 器 元 素 使 用 V is u a l J + + 编 程 - 图3505 到 文 档 中 时 才 可 以 见 到 它 然 而 这 只 是 一 个 假 象 不是 编 程 模 型 的 一 部 分 因 为 它 们 不 管 是 否 可 视 都 始 终 以 同 样 的 方 法来 工 作 所 以 用 户 不 需 要 改 变 编 程 元 素 的 方 法

使 用 V is u a l J + + 编 程 - 图3506使 用 V is u a l J + + 编 程 - 图3507使 用 V is u a l J + + 编 程 - 图3508使 用 V is u a l J + + 编 程 - 图3509使 用 V is u a l J + + 编 程 - 图3510使 用 V is u a l J + + 编 程 - 图3511使 用 V is u a l J + + 编 程 - 图3512使 用 V is u a l J + + 编 程 - 图3513当 调 用 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 使 用 V is u a l J + + 编 程 - 图3514

使 用 V is u a l J + + 编 程 - 图3515使 用 V is u a l J + + 编 程 - 图3516使 用 V is u a l J + + 编 程 - 图3517使 用 V is u a l J + + 编 程 - 图3518f indE le m e nt 和 se t B oundE le m e n ts 使 用 的 搜 索 规 则 假 定 用 户 想 要 绑 定 到有 特 殊 名 字 的 ID 属 性 值 的 元 素 使 用 f indE le m e nt 用 户 还 可 以 列 举 所有 在 文 档 中 的 元 素 直 到 发 现 自 己 感 兴 趣 的 某 个 元 素 为 止

使 用 包 容 器

使 用 V is u a l J + + 编 程 - 图3519使 用 V is u a l J + + 编 程 - 图3520使 用 V is u a l J + + 编 程 - 图3521使 用 V is u a l J + + 编 程 - 图3522使 用 V is u a l J + + 编 程 - 图3523使 用 V is u a l J + + 编 程 - 图3524使 用 V is u a l J + + 编 程 - 图3525包 容 器 就 是 能 够 容 纳 其 他 元 素 的 元 素 基 本 的 例 子 就 是 <D IV > 元 素 它可 以 包 含 任 意 的 其 他 HTM L 项 更 复 杂 的 例 子 包 括 表 单 元 格 和 文 档 本身 在 多 数 情 况 下 包 容 器 能 够 任 意 嵌 套 例 如 某 个 表 嵌 套 到 其 他 表 的单 元 格 中

使 用 V is u a l J + + 编 程 - 图3526使 用 V is u a l J + + 编 程 - 图3527使 用 V is u a l J + + 编 程 - 图3528使 用 V is u a l J + + 编 程 - 图3529使 用 V is u a l J + + 编 程 - 图3530包 容 器 与 其 他 元 素 相 似 它 们 使 用 ne w 语 句 来 创 建 并 且 多 数 能 够 在页 中 进 行 位 置 和 大 小 的 选 择 用 户 可 以 在 一 个 包 容 器 中 选 择 元 素 的 位 置和 大 小 并 且 可 以 设 置 它 们 的 Z -次 序 关 系 D H T M L 的 一 个 最 重 要 特 性

使 用 V is u a l J + + 编 程 - 图3531就 是 用 户 可 以 在 自 己 的 代 码 中 改 变 这 些 元 素 的 属 性

使 用 V is u a l J + + 编 程 - 图3532使 用 V is u a l J + + 编 程 - 图3533使 用 V is u a l J + + 编 程 - 图3534使 用 V is u a l J + + 编 程 - 图3535使 用 V is u a l J + + 编 程 - 图3536当 然 用 户 也 可 以 使 用 常 用 的 HTM L 布 局 规 则 来 设 置 包 容 器 中 元 素 的位 置 调 用 元 素 的 se t L o catio n 方 法 或 是 调 用 se t B ounds 方 法 来 设 置 它 的绝 对 位 置 或 者 调 用 re se t L o ca tio n 来 允 许 HTM L 布 局 引 擎 选 择 位 置 但是 必 须 放 在 HTM L 流 程 布 局 中 最 后 一 个 元 素 的 后 面 使 用 V is u a l J + + 编 程 - 图3537

  • 使 用 V is u a l J + + 编 程 - 图3538使 用 V is u a l J + + 编 程 - 图3539使 用 V is u a l J + + 编 程 - 图3540使 用 V is u a l J + + 编 程 - 图3541使 用 V is u a l J + + 编 程 - 图3542使 用 V is u a l J + + 编 程 - 图3543使 用 V is u a l J + + 编 程 - 图3544使 用 V is u a l J + + 编 程 - 图3545使 用 V is u a l J + + 编 程 - 图3546旦 创 建 了 一 个 包 容 器 元 素 用 户 就 可 以 通 过 使 用 S e t N ew E lem en ts 或添 加 方 法 来 添 加 元 素 到 该 包 容 器 中 这 种 结 构 遵 循 规 则 的 父 - 子 关 系 模式 元 素 可 以 是 其 他 包 容 器 添 加 到 成 为 它 的 子 包 容 器 的 包 容 器 中 事实 上 直 到 最 顶 部 不 是 任 何 其 他 包 容 器 的 一 部 分 的 包 容 器 添 加 到 文 档时 才 有 元 素 和 文 档 相 联

使 用 V is u a l J + + 编 程 - 图3547使 用 V is u a l J + + 编 程 - 图3548使 用 V is u a l J + + 编 程 - 图3549用 户 可 以 通 过 使 用 包 容 器 的 se t B ound 方 法 来 选 择 包 容 器 的 位 置 和 大 小例 如 创 建 包 容 器 的 语 句 如 下

D h F o rm m yfo rm = d h F o rm ();

使 用 V is u a l J + + 编 程 - 图3550使 用 V is u a l J + + 编 程 - 图3551然 后 用 户 就 可 以 在 包 容 器 上 设 置 各 种 属 性 包 括 当 鼠 标 在 面 板 上 盘 旋 时显 示 的 工 具 提 示

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);

使 用 V is u a l J + + 编 程 - 图3552使 用 V is u a l J + + 编 程 - 图3553最 后 用 户 可 以 将 刚 刚 创 建 的 包 容 器 加 入 到 在 D h D o c u m e n t 派 生 类 如

使 用 V is u a l J + + 编 程 - 图3554C la ss1 . ja v a 使 用 V is u a l J + + 编 程 - 图3555 中 的 文 档 中

th is .a d d ( m y F o rm )

使 用 V is u a l J + + 编 程 - 图3556使 用 V is u a l J + + 编 程 - 图3557使 用 V is u a l J + + 编 程 - 图3558使 用 V is u a l J + + 编 程 - 图3559当 加 入 元 素 到 包 容 器 中 时 用 户 能 够 通 过 使 用 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 ) ;

使 用 V is u a l J + + 编 程 - 图3560使 用 V is u a l J + + 编 程 - 图3561使 用 V is u a l J + + 编 程 - 图3562使 用 V is u a l J + + 编 程 - 图3563使 用 V is u a l J + + 编 程 - 图3564使 用 V is u a l J + + 编 程 - 图3565在 元 素 加 入 之 后 还 可 以 使 用 se t Z In d e x 方 法 围 绕 着 Z 次 序 中 来 移 动 元素 例 如 下 面 的 语 法 没 有 清 楚 地 在 添 加 的 元 素 上 设 置 Z 次 序 但 是使 用 了 默 认 的 Z 次 序 在 所 有 其 他 元 素 的 顶 部 使 用 V is u a l J + + 编 程 - 图3566

m yfo rm .a d d ( m y T e x t);

使 用 V is u a l J + + 编 程 - 图3567使 用 V is u a l J + + 编 程 - 图3568使 用 V is u a l J + + 编 程 - 图3569用 户 可 以 清 楚 地 设 置 该 元 素 为 下 面 列 出 的 形 式 这 里 的 num 是 整 数 集用 来 描 述 在 它 的 包 容 器 中 的 元 素 关 联 的 Z 次 序

m y T e x t . se t Z Inde x( num ) ;

使 用 V is u a l J + + 编 程 - 图3570使 用 V is u a l J + + 编 程 - 图3571使 用 V is u a l J + + 编 程 - 图3572使 用 V is u a l J + + 编 程 - 图3573带 有 最 小 数 字 的 元 素 是 在 Z 次 序 的 底 部 其 他 元 素 覆 盖 了 它 使 用 V is u a l J + + 编 程 - 图3574 带 有最 大 的 数 字 的 元 素 是 在 Z 次 序 的 顶 部 该 元 素 覆 盖 了 其 他 元 素 使 用 V is u a l J + + 编 程 - 图3575

处 理 事 件

使 用 V is u a l J + + 编 程 - 图3576使 用 V is u a l J + + 编 程 - 图3577使 用 V is u a l J + + 编 程 - 图3578使 用 V is u a l J + + 编 程 - 图3579使 用 V is u a l J + + 编 程 - 图3580使 用 V is u a l J + + 编 程 - 图3581使 用 V is u a l J + + 编 程 - 图3582D 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 " );

}

}

使 用 V is u a l J + + 编 程 - 图3583使 用 V is u a l J + + 编 程 - 图3584使 用 V is u a l J + + 编 程 - 图3585使 用 V is u a l J + + 编 程 - 图3586使 用 V is u a l J + + 编 程 - 图3587使 用 V is u a l J + + 编 程 - 图3588使 用 V is u a l J + + 编 程 - 图3589在 这 些 代 码 中 无 论 何 时 按 钮 触 发 了 onC l ic k 事 件 也 就 是 当 其 被 单 击时 使 用 V is u a l J + + 编 程 - 图3590 便 调 用 m y B u tto n C lic k 事 件 处 理 程 序 在 本 例 中 m ybu ttonC l ic k 事 件 处 理 程 序 中 的 代 码 发 挥 了 很 小 的 作 用 它 仅 仅 设 置 按 钮 上 的 标 题 为新 的 文 本

使 用 V is u a l J + + 编 程 - 图3591使 用 V is u a l J + + 编 程 - 图3592使 用 V is u a l J + + 编 程 - 图3593使 用 V is u a l J + + 编 程 - 图3594使 用 V is u a l J + + 编 程 - 图3595多 数 事 件 按 着 包 含 树 的 所 有 路 径 进 行 传 播 这 就 意 味 着 按 钮 的 单 击 事 件可 以 由 按 钮 的 包 容 器 和 其 本 身 看 到 尽 管 在 程 序 员 一 般 在 距 离 事 件 最 近的 包 容 器 中 处 理 事 件 这 些 事 件 的 模 型 可 能 在 一 些 特 殊 的 情 况 中 很 有用 它 提 供 给 程 序 员 灵 活 地 决 定 事 件 处 理 程 序 代 码 的 最 佳 位 置

使 用 V is u a l J + + 编 程 - 图3596使 用 V is u a l J + + 编 程 - 图3597使 用 V is u a l J + + 编 程 - 图3598使 用 V is u a l J + + 编 程 - 图3599使 用 V is u a l J + + 编 程 - 图3600使 用 V is u a l J + + 编 程 - 图3601许 多 不 同 的 事 件 能 够 被 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 " ) ;

}

}

使 用 V is u a l J + + 编 程 - 图3602使 用 V is u a l J + + 编 程 - 图3603所 有 能 够 触 发 和 捕 获 使 用 V is u a l J + + 编 程 - 图3604 的 事 件 都 在 基 于 co m .m s . w fc .c o re .E v en t 事 件 类中 定 义

使 用 动 态 样 式

使 用 V is u a l J + + 编 程 - 图3605使 用 V is u a l J + + 编 程 - 图3606使 用 V is u a l J + + 编 程 - 图3607使 用 V is u a l J + + 编 程 - 图3608使 用 V is u a l J + + 编 程 - 图3609使 用 V is u a l J + + 编 程 - 图3610用 户 可 以 将 Style 样 式 使 用 V is u a l J + + 编 程 - 图3611 对 象 想 象 为 独 立 的 属 性 集 合 样 式 这 个 术 语取 自 字 处 理 操 作 在 这 里 样 式 表 的 编 辑 与 用 户 的 文 档 无 关 在 库 中 使用 和 应 用 Style 对 象 是 同 样 的

使 用 V is u a l J + + 编 程 - 图3612使 用 V is u a l J + + 编 程 - 图3613使 用 V is u a l J + + 编 程 - 图3614使 用 V is u a l J + + 编 程 - 图3615使 用 V is u a l J + + 编 程 - 图3616使 用 V is u a l J + + 编 程 - 图3617例 如 老 板 告 诉 你 新 的 公 司 徽 标 颜 色 为 红 色 你 需 要 改 变 在 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" ) ;

使 用 V is u a l J + + 编 程 - 图3618使 用 V is u a l J + + 编 程 - 图3619使 用 V is u a l J + + 编 程 - 图3620使 用 V is u a l J + + 编 程 - 图3621当 然 也 可 以 使 用 派 生 的 方 式 来 节 省 时 间 例 如 可 以 考 虑 使 用 下 面 的代 码 来 改 善 这 个 问 题

// 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");

}

使 用 V is u a l J + + 编 程 - 图3622使 用 V is u a l J + + 编 程 - 图3623使 用 V is u a l J + + 编 程 - 图3624直 到 决 定 想 要 这 些 设 置 来 设 置 按 钮 标 签 选 项 卡 和 文 档 等 上 面 这 些

使 用 V is u a l J + + 编 程 - 图3625使 用 V is u a l J + + 编 程 - 图3626使 用 V is u a l J + + 编 程 - 图3627代 码 都 还 适 用 当 在 其 他 程 序 中 或 程 序 的 其 他 部 分 中 使 用 这 些 设 置 时用 户 就 会 发 现 还 有 很 多 的 事 情 要 做

使 用 V is u a l J + + 编 程 - 图3628使 用 V is u a l J + + 编 程 - 图3629使 用 V is u a l J + + 编 程 - 图3630使 用 V is u a l J + + 编 程 - 图3631这 个 问 题 的 答 案 就 是 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" ) ;

使 用 V is u a l J + + 编 程 - 图3632使 用 V is u a l J + + 编 程 - 图3633使 用 V is u a l J + + 编 程 - 图3634然 后 在 编 码 的 其 他 时 候 可 以 将 该 样 式 应 用 到 任 意 数 量 的 元 素 上

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 );

使 用 V is u a l J + + 编 程 - 图3635使 用 V is u a l J + + 编 程 - 图3636使 用 V is u a l J + + 编 程 - 图3637当 在 公 司 中 使 用 高 级 设 置 策 略 的 动 态 特 性 的 时 候 下 面 的 程 序 行 使 用 在它 们 上 面 的 m y S tyle 集 来 设 置 所 有 元 素 的 实 例 化 用 来 改 变 它 们 的 颜色

m y S tyle . se t C o lor( C o lor. B LU E ) ;

使 用 V is u a l J + + 编 程 - 图3638使 用 V is u a l J + + 编 程 - 图3639使 用 V is u a l J + + 编 程 - 图3640使 用 V is u a l J + + 编 程 - 图3641使 用 V is u a l J + + 编 程 - 图3642使 用 V is u a l J + + 编 程 - 图3643这 里 才 是 真 正 重 要 的 部 分 在 运 行 时 所 有 这 些 都 是 有 用 的 每 次 改 变Style 对 象 时 D H T M L 动 态 运 行 并 且 改 变 所 有 的 Style 对 象 应 用 的 所有 元 素

使 用 V is u a l J + + 编 程 - 图3644使 用 V is u a l J + + 编 程 - 图3645使 用 V is u a l J + + 编 程 - 图3646使 用 V is u a l J + + 编 程 - 图3647有 关 更 多 的 信 息 见 下 一 节 理 解 Style 继 承 性

理 解 S ty le 继 承 性

使 用 V is u a l J + + 编 程 - 图3648使 用 V is u a l J + + 编 程 - 图3649使 用 V is u a l J + + 编 程 - 图3650使 用 V is u a l J + + 编 程 - 图3651使 用 V is u a l J + + 编 程 - 图3652使 用 V is u a l J + + 编 程 - 图3653使 用 V is u a l J + + 编 程 - 图3654使 用 V is u a l J + + 编 程 - 图3655如 果 样 式 与 设 置 在 页 面 上 的 设 置 有 冲 突 则 HTM L 重 现 引 擎 可 以 确 定所 要 使 用 的 样 式 例 如 如 果 元 素 直 接 设 置 了 颜 色 属 性D h E lem en t .s e tc o lo r 使 用 V is u a l J + + 编 程 - 图3656 , 那 么 就 使 用 颜 色 属 性 定 义 的 颜 色 然 而 如 果 一 个 元 素 上 有 Style 对 象 D h E le m e n t.s e tS tyle 使 用 V is u a l J + + 编 程 - 图3657 并 且 该 对 象 有 颜 色 属

使 用 V is u a l J + + 编 程 - 图3658使 用 V is u a l J + + 编 程 - 图3659使 用 V is u a l J + + 编 程 - 图3660使 用 V is u a l J + + 编 程 - 图3661使 用 V is u a l J + + 编 程 - 图3662使 用 V is u a l J + + 编 程 - 图3663使 用 V is u a l J + + 编 程 - 图3664使 用 V is u a l J + + 编 程 - 图3665性 设 置 那 么 将 使 用 该 对 象 的 颜 色 设 置 如 果 找 不 到 某 种 颜 色 或 样 式将 使 用 带 有 元 素 的 包 容 器 D h E lem en t .g e t P aren t 使 用 V is u a l J + + 编 程 - 图3666 相 同 的 过 程 如 果 还是 找 不 到 则 使 用 该 包 容 器 的 包 容 器 的 过 程 以 此 类 推

使 用 V is u a l J + + 编 程 - 图3667使 用 V is u a l J + + 编 程 - 图3668使 用 V is u a l J + + 编 程 - 图3669此 过 程 向 上 一 直 到 文 档 如 果 文 档 没 有 颜 色 属 性 设 置 环 境 使 用 V is u a l J + + 编 程 - 图3670 浏 览 器 设置 或 一 些 其 他 环 境 设 置 使 用 V is u a l J + + 编 程 - 图3671 决 定 要 使 用 的 颜 色

使 用 V is u a l J + + 编 程 - 图3672使 用 V is u a l J + + 编 程 - 图3673使 用 V is u a l J + + 编 程 - 图3674因 为 属 性 层 叠 向 下 到 包 容 层 次 所 以 该 过 程 称 为 层 叠 样 式 在 W 3 C

使 用 V is u a l J + + 编 程 - 图3675使 用 V is u a l J + + 编 程 - 图3676使 用 V is u a l J + + 编 程 - 图3677使 用 V is u a l J + + 编 程 - 图3678中 用 于 D h S tyle 对 象 的 基 础 机 制 称 为 S tyle S h eets CS S 样 式 表 使 用 V is u a l J + + 编 程 - 图3679

使 用 动 态 表

使 用 V is u a l J + + 编 程 - 图3680使 用 V is u a l J + + 编 程 - 图3681使 用 V is u a l J + + 编 程 - 图3682使 用 V is u a l J + + 编 程 - 图3683使 用 V is u a l J + + 编 程 - 图3684使 用 表 通 常 与 使 用 库 中 的 任 何 其 他 部 分 没 有 什 么 不 同 应 用 到 表 的 原 则和 编 程 模 型 同 样 也 应 用 到 任 何 其 他 类 型 的 元 素 然 而 表 是 值 得 一 提 的元 素 它 重 要 而 且 常 用

使 用 V is u a l J + + 编 程 - 图3685使 用 V is u a l J + + 编 程 - 图3686使 用 V is u a l J + + 编 程 - 图3687使 用 V is u a l J + + 编 程 - 图3688使 用 V is u a l J + + 编 程 - 图3689要 使 用 表 应 该 建 立 一 个 D h T a b le 对 象 给 它 添 加 D h R o w 对 象 然 后在 行 上 添 加 D h C e l l 对 象 下 面 是 表 使 用 规 则

  • 使 用 V is u a l J + + 编 程 - 图3690用 户 只 能 添 加 D h ro w 对 象 到 D h T a b le 对 象

  • 使 用 V is u a l J + + 编 程 - 图3691用 户 只 能 添 加 D h C e l l 对 象 到 D h R o w 对 象

  • 使 用 V is u a l J + + 编 程 - 图3692用 户 能 添 加 元 素 的 任 何 类 型 到 D h C e l l 对 象

使 用 V is u a l J + + 编 程 - 图3693使 用 V is u a l J + + 编 程 - 图3694使 用 V is u a l J + + 编 程 - 图3695尽 管 这 可 能 有 些 严 格 但 用 户 可 以 使 用 下 面 的 代 码 轻 松 地 创 建 一 个 包 容器 来 模 仿 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 ) ;

}

}

使 用 V is u a l J + + 编 程 - 图3696使 用 V is u a l J + + 编 程 - 图3697使 用 V is u a l J + + 编 程 - 图3698使 用 V is u a l J + + 编 程 - 图3699要 使 用 G rid B a g 类 用 户 只 需 设 置 行 和 列 的 数 字 必 须 与 此 实 现 相 同 使 用 V is u a l J + + 编 程 - 图3700然 后 指 定 元 素 到 单 元 格 下 面 的 代 码 是 使 用 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 } ) ;

}

}

使 用 V is u a l J + + 编 程 - 图3701使 用 V is u a l J + + 编 程 - 图3702使 用 V is u a l J + + 编 程 - 图3703使 用 V is u a l J + + 编 程 - 图3704使 用 V is u a l J + + 编 程 - 图3705使 用 库 最 强 的 功 能 之 一 就 是 表 和 Style 对 象 的 结 合 这 使 得 用 户 可 以 创建 定 制 的 报 表 生 成 器 该 生 成 器 功 能 强 大 具 有 专 业 性 的 外 观 并 且 容易 编 写 代 码

数 据 绑 定 到 表

使 用 V is u a l J + + 编 程 - 图3706使 用 V is u a l J + + 编 程 - 图3707使 用 V is u a l J + + 编 程 - 图3708使 用 V is u a l J + + 编 程 - 图3709表 也 有 数 据 绑 定 的 能 力 使 用 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 } );

}

使 用 V is u a l J + + 编 程 - 图3710使 用 V is u a l J + + 编 程 - 图3711使 用 V is u a l J + + 编 程 - 图3712使 用 V is u a l J + + 编 程 - 图3713如 果 知 道 将 要 返 回 的 数 据 格 式 也 可 以 指 定 表 将 要 使 用 的 模 板 使 用 V is u a l J + + 编 程 - 图3714 重 复 器 使 用 V is u a l J + + 编 程 - 图3715行 用 来 格 式 化 要 返 回 的 数 据 进 行 这 些 操 作 的 步 骤 如 下 所 示

  1. 使 用 V is u a l J + + 编 程 - 图3716创 建 D h T a b le 元 素

Dh Ta b le d a ta Ta b le = n e w Dh Ta b le();

  1. 使 用 V is u a l J + + 编 程 - 图3717使 用 V is u a l J + + 编 程 - 图3718使 用 V is u a l J + + 编 程 - 图3719使 用 V is u a l J + + 编 程 - 图3720使 用 V is u a l J + + 编 程 - 图3721创 建 模 板 行 并 且 将 其 设 置 到 表 中 用 户 还 可 以 有 选 择 地 创 建 标 题 行对 于 在 模 板 单 元 格 中 用 户 要 从 记 录 集 中 接 收 数 据 的 每 项 为 其 创 建 一个 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 ) ;

  1. 使 用 V is u a l J + + 编 程 - 图3722使 用 V is u a l J + + 编 程 - 图3723创 建 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 " ) ;

  1. 使 用 V is u a l J + + 编 程 - 图3724设 置 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 ( ) ;

  1. 使 用 V is u a l J + + 编 程 - 图3725添 加 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 )

使 用 V is u a l J + + 编 程 - 图3726使 用 V is u a l J + + 编 程 - 图3727现 在 表 从 记 录 集 中 放 入 了 数 据 并 且 这 些 数 据 以 模 板 行 格 式 进 行 了 格 式化

在 服 务 器 上 使 用 c o m . m s.w f c .h tm l软 件 包

使 用 V is u a l J + + 编 程 - 图3728使 用 V is u a l J + + 编 程 - 图3729使 用 V is u a l J + + 编 程 - 图3730使 用 V is u a l J + + 编 程 - 图3731使 用 V is u a l J + + 编 程 - 图3732使 用 V is u a l J + + 编 程 - 图3733c o m .m s. w fc .h tm l 也 能 够 在 服 务 器 上 使 用 用 来 提 供 一 种 编 程 模 型 来产 生 HTM L 并 且 将 其 送 到 客 户 页 上 服 务 器 端 不 像 客 户 端 D y n a m ic HTM L 模 型 那 样 由 于 服 务 器 Ja va 类 与 客 户 机 的 文 档 没 有 相 互 作 用

使 用 V is u a l J + + 编 程 - 图3734使 用 V is u a l J + + 编 程 - 图3735使 用 V is u a l J + + 编 程 - 图3736使 用 V is u a l J + + 编 程 - 图3737使 用 V is u a l J + + 编 程 - 图3738所 以 服 务 器 端 的 模 型 是 静 态 的 然 而 服 务 器 由 HTM L 元 素 组 成 并且 当 元 素 在 HTM L 模 板 中 使 用 时 指 定 了 一 个 模 板 则 服 务 器 将 频 繁 地将 它 们 发 送 到 客 户 中

使 用 V is u a l J + + 编 程 - 图3739使 用 V is u a l J + + 编 程 - 图3740使 用 V is u a l J + + 编 程 - 图3741使 用 V is u a l J + + 编 程 - 图3742使 用 V is u a l J + + 编 程 - 图3743使 用 V is u a l J + + 编 程 - 图3744使 用 V is u a l J + + 编 程 - 图3745使 用 V is u a l J + + 编 程 - 图3746使 用 V is u a l J + + 编 程 - 图3747使 用 V is u a l J + + 编 程 - 图3748尽 管 这 不 是 完 全 的 动 态 模 型 它 还 是 一 个 重 要 的 服 务 器 特 性 例 如 用户 能 够 应 用 D h S tyle 属 性 到 一 些 模 板 的 HT M L 代 码 的 所 有 部 分 中 然后 通 过 使 用 改 变 D h S tyle 属 性 来 产 生 不 同 外 观 的 显 示 页 用 户 不 必 通 过程 序 来 产 生 所 有 的 单 独 样 式 改 变 另 外 一 个 优 点 就 是 用 户 能 够 使 用 相同 的 模 型 来 为 客 户 和 服 务 器 应 用 程 序 来 产 生 动 态 HTM L 因 此 HT M L 生 成 器 易 学 易 记

使 用 V is u a l J + + 编 程 - 图3749使 用 V is u a l J + + 编 程 - 图3750使 用 V is u a l J + + 编 程 - 图3751使 用 V is u a l J + + 编 程 - 图3752使 用 V is u a l J + + 编 程 - 图3753使 用 V is u a l J + + 编 程 - 图3754当 前 在 服 务 器 上 有 两 个 产 生 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 脚 本 而 第 二 种 类 型 则 使 用 从

使 用 V is u a l J + + 编 程 - 图3755使 用 V is u a l J + + 编 程 - 图3756D h D o c u m e n t 中 衍 生 的 类 并 且 因 为 此 类 型 在 类 中 比 在 脚 本 中 公 布 更

使 用 V is u a l J + + 编 程 - 图3757使 用 V is u a l J + + 编 程 - 图3758多 的 控 件 所 以 与 在 客 户 机 上 使 用 的 模 型 非 常 相 似

基 于 ASP 的 方 法

使 用 V is u a l J + + 编 程 - 图3759使 用 V is u a l J + + 编 程 - 图3760使 用 V is u a l J + + 编 程 - 图3761使 用 V is u a l J + + 编 程 - 图3762使 用 V is u a l J + + 编 程 - 图3763使 用 V is u a l J + + 编 程 - 图3764使 用 V is u a l J + + 编 程 - 图3765此 种 方 法 在 服 务 器 页 中 使 用 两 个 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 方 法 送 到 客 户 页 中

使 用 V is u a l J + + 编 程 - 图3766使 用 V is u a l J + + 编 程 - 图3767使 用 V is u a l J + + 编 程 - 图3768使 用 V is u a l J + + 编 程 - 图3769使 用 V is u a l J + + 编 程 - 图3770使 用 V is u a l J + + 编 程 - 图3771使 用 V is u a l J + + 编 程 - 图3772使 用 V is u a l J + + 编 程 - 图3773使 用 V is u a l J + + 编 程 - 图3774使 用 V is u a l J + + 编 程 - 图3775使 用 V is u a l J + + 编 程 - 图3776使 用 V is u a l J + + 编 程 - 图3777使 用 V is u a l J + + 编 程 - 图3778使 用 V is u a l J + + 编 程 - 图3779使 用 V is u a l J + + 编 程 - 图3780例 如 用 户 有 一 个 名 为 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 使 用 V is u a l J + + 编 程 - 图3781 来 创 建 一 个 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 的 方 法

使 用 V is u a l J + + 编 程 - 图3782使 用 V is u a l J + + 编 程 - 图3783使 用 V is u a l J + + 编 程 - 图3784使 用 V is u a l J + + 编 程 - 图3785使 用 V is u a l J + + 编 程 - 图3786使 用 V is u a l J + + 编 程 - 图3787使 用 V is u a l J + + 编 程 - 图3788此 种 方 法 稍 微 复 杂 一 些 并 且 与 客 户 模 型 更 接 近 一 些 它 使 用 一 个 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 方 法

使 用 V is u a l J + + 编 程 - 图3789使 用 V is u a l J + + 编 程 - 图3790使 用 V is u a l J + + 编 程 - 图3791使 用 V is u a l J + + 编 程 - 图3792使 用 V is u a l J + + 编 程 - 图3793使 用 V is u a l J + + 编 程 - 图3794使 用 V is u a l J + + 编 程 - 图3795使 用 V is u a l J + + 编 程 - 图3796使 用 V is u a l J + + 编 程 - 图3797使 用 V is u a l J + + 编 程 - 图3798使 用 V is u a l J + + 编 程 - 图3799使 用 V is u a l J + + 编 程 - 图3800使 用 V is u a l J + + 编 程 - 图3801就 像 在 客 户 模 型 中 一 样 用 户 能 够 在 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 方 法 使 用 V is u a l J + + 编 程 - 图3802 并 且 还 添 加 新 的 D h E lem en t 项 到 用 户 的 文 档 流 中然 而 理 解 用 户 不 能 使 用 文 档 级 的 函 数 如 f indE le m e nt 使 用 V is u a l J + + 编 程 - 图3803 这 一 点 是 很重 要 的 而 且 在 服 务 器 端 文 档 中 不 能 使 用 枚 举 操 作 除 非 项 目 已 经 明确 添 加 到 自 己 的 D h D o c u m e n t 派 生 类 中

使 用 V is u a l J + + 编 程 - 图3804按 下 列 步 骤 使 用 基 于 HTM L 的 方 法

  1. 使 用 V is u a l J + + 编 程 - 图3805使 用 V is u a l J + + 编 程 - 图3806创 建 服 务 器 Ja va 类 从 D h D o c u m e n t 中 扩 展 使 用 V is u a l J + + 编 程 - 图3807

  2. 使 用 V is u a l J + + 编 程 - 图3808使 用 V is u a l J + + 编 程 - 图3809在 该 类 中 当 想 使 用 客 户 应 用 程 序 时 执 行 in it F o rm 方 法

  3. 使 用 V is u a l J + + 编 程 - 图3810使 用 V is u a l J + + 编 程 - 图3811使 用 V is u a l J + + 编 程 - 图3812使 用 V is u a l J + + 编 程 - 图3813使 用 V is u a l J + + 编 程 - 图3814从 AS P 中 调 用 S e r v er.C re ateO b je c t 方 法 传 递 D h M odu le 来 创建 D h M odu le 对 象

  4. 使 用 V is u a l J + + 编 程 - 图3815使 用 V is u a l J + + 编 程 - 图3816调 用 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 类的 名 称

  5. 使 用 V is u a l J + + 编 程 - 图3817使 用 V is u a l J + + 编 程 - 图3818调 用 D h M odu le . se t H T M LD oc um e n t 方 法 如 果 有 该 方 法 则 将 服 务 器

使 用 V is u a l J + + 编 程 - 图3819W e b 页 的 完 全 本 地 文 件 名 传 递 给 它

使 用 V is u a l J + + 编 程 - 图3820使 用 V is u a l J + + 编 程 - 图3821使 用 V is u a l J + + 编 程 - 图3822使 用 V is u a l J + + 编 程 - 图3823使 用 V is u a l J + + 编 程 - 图3824如 果 使 用 一 个 空 串 "" 使 用 V is u a l J + + 编 程 - 图3825 调 用 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 代码 段

使 用 V is u a l J + + 编 程 - 图3826使 用 V is u a l J + + 编 程 - 图3827使 用 V is u a l J + + 编 程 - 图3828使 用 V is u a l J + + 编 程 - 图3829如 果 用 户 没 有 调 用 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 > 标 记

使 用 V is u a l J + + 编 程 - 图3830下 例 显 示 了 使 用 模 板 的 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 " )

% >

使 用 V is u a l J + + 编 程 - 图3831使 用 V is u a l J + + 编 程 - 图3832在 运 行 期 间 此 结 构 能 够 识 别 在 服 务 器 用 户 类 的 运 行 和 相 应 的 动 作

  • 使 用 V is u a l J + + 编 程 - 图3833使 用 V is u a l J + + 编 程 - 图3834使 用 V is u a l J + + 编 程 - 图3835旦 实 例 化 用 户 就 可 以 对 D h D o c u m e n t 衍 生 类 添 加 元 素 或 文 本 那 些项 目 就 可 以 添 加 到 在 < / B O DY> 标 记 前 指 定 的 任 意 模 板 中

使 用 V is u a l J + + 编 程 - 图3836使 用 V is u a l J + + 编 程 - 图3837下 例 说 明 了 既 工 作 在 客 户 上 也 工 作 在 服 务 器 上 的 类

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 } ) ;

}

}

使 用 V is u a l J + + 编 程 - 图3838使 用 V is u a l J + + 编 程 - 图3839使 用 V is u a l J + + 编 程 - 图3840使 用 V is u a l J + + 编 程 - 图3841使 用 V is u a l J + + 编 程 - 图3842如 果 用 户 想 要 绑 定 到 在 该 页 上 已 有 的 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>

使 用 V is u a l J + + 编 程 - 图3843用 户 的 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 } ) ;

}

使 用 V is u a l J + + 编 程 - 图3844使 用 V is u a l J + + 编 程 - 图3845使 用 V is u a l J + + 编 程 - 图3846使 用 V is u a l J + + 编 程 - 图3847使 用 V is u a l J + + 编 程 - 图3848使 用 V is u a l J + + 编 程 - 图3849使 用 V is u a l J + + 编 程 - 图3850在 客 户 和 服 务 器 上 HTM L 类 的 执 行 几 乎 一 样 然 而 也 有 一 个 很 重 要的 不 同 点 一 旦 元 素 写 入 使 用 V is u a l J + + 编 程 - 图3851 发 送 到 客 户 使 用 V is u a l J + + 编 程 - 图3852 它 们 就 不 能 像 修 改 客 户 文 档一 样 进 行 修 改 如 果 企 图 再 次 修 改 此 元 素 在 写 入 操 作 已 经 在 元 素 上 执行 之 后 会 出 现 D h C a n t M o d if y E le m e n t 只 与 服 务 器 应 用 程 序 相 关 的 异 常

使 用 V is u a l J + + 编 程 - 图3853使 用 V is u a l J + + 编 程 - 图3854使 用 V is u a l J + + 编 程 - 图3855这 着 重 说 明 了 在 服 务 器 Ja va 类 和 客 户 文 档 之 间 没 有 实 际 互 操 作 的 事实 就 像 在 客 户 上 的 Ja va 类 和 文 档 之 间 一 样 使 用 V is u a l J + + 编 程 - 图3856

使 用 V is u a l J + + 编 程 - 图3857使 用 V is u a l J + + 编 程 - 图3858使 用 V is u a l J + + 编 程 - 图3859使 用 V is u a l J + + 编 程 - 图3860使 用 V is u a l J + + 编 程 - 图3861使 用 V is u a l J + + 编 程 - 图3862使 用 V is u a l J + + 编 程 - 图3863使 用 V is u a l J + + 编 程 - 图3864使 用 V is u a l J + + 编 程 - 图3865使 用 V is u a l J + + 编 程 - 图3866使 用 V is u a l J + + 编 程 - 图3867使 用 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 章 图 形 服 务 器

使 用 V is u a l J + + 编 程 - 图3868使 用 V is u a l J + + 编 程 - 图3869使 用 V is u a l J + + 编 程 - 图3870使 用 V is u a l J + + 编 程 - 图3871使 用 V is u a l J + + 编 程 - 图3872使 用 V is u a l J + + 编 程 - 图3873使 用 V is u a l J + + 编 程 - 图3874使 用 V is u a l J + + 编 程 - 图3875使 用 V is u a l J + + 编 程 - 图3876使 用 V is u a l J + + 编 程 - 图3877通 过 图 形 设 备 接 口 GD I 使 用 V is u a l J + + 编 程 - 图3878 可 以 在 M ic rosoft W indow s 中 显 示 G ra ph ic 对 象 它 是 一 个 与 设 备 无 关 的 图 形 输 出 模 型 处 理 基 于 W ind ow s 应 用程 序 的 图 形 功 能 调 用 并 把 这 些 调 用 传 到 合 适 的 设 备 驱 动 程 序 这 些 驱动 程 序 在 输 出 时 执 行 硬 件 特 定 的 函 数 当 在 设 备 相 关 格 式 与 设 备 相 互 作用 时 GD I 在 应 用 程 序 和 输 出 设 备 之 间 充 当 一 个 缓 冲 区 对 应 用 程 序 提供 与 设 备 无 关 的 视 图

使 用 V is u a l J + + 编 程 - 图3879使 用 V is u a l J + + 编 程 - 图3880使 用 V is u a l J + + 编 程 - 图3881使 用 V is u a l J + + 编 程 - 图3882使 用 V is u a l J + + 编 程 - 图3883使 用 V is u a l J + + 编 程 - 图3884使 用 V is u a l J + + 编 程 - 图3885使 用 V is u a l J + + 编 程 - 图3886使 用 V is u a l J + + 编 程 - 图3887应 用 程 序 开 发 人 员 使 用 GD I 的 功 能 可 以 显 示 图 像 绘 制 控 件 形 状 和文 本 创 建 和 使 用 笔 刷 子 和 字 体 W ind ow s F ounda t ion C la sse s使 用 V is u a l J + + 编 程 - 图3888 W F C 使 用 V is u a l J + + 编 程 - 图3889 G ra ph ic 对 象 与 其 他 W F C 对 象 协 调 诸 如 笔 文 字 和 刷 新 对 象 等 将这 些 能 力 封 装 为 基 于 Ja va 的 对 象

使 用 V is u a l J + + 编 程 - 图3890使 用 V is u a l J + + 编 程 - 图3891使 用 V is u a l J + + 编 程 - 图3892使 用 V is u a l J + + 编 程 - 图3893使 用 V is u a l J + + 编 程 - 图3894使 用 V is u a l J + + 编 程 - 图3895使 用 V is u a l J + + 编 程 - 图3896使 用 V is u a l J + + 编 程 - 图3897使 用 V is u a l J + + 编 程 - 图3898使 用 V is u a l J + + 编 程 - 图3899使 用 V is u a l J + + 编 程 - 图3900使 用 V is u a l J + + 编 程 - 图3901使 用 V is u a l J + + 编 程 - 图3902在 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 对 象

使 用 V is u a l J + + 编 程 - 图3903W F C 提 供 了 几 种 方 法 来 创 建 一 个 G ra ph ic 对 象

使 用 V is u a l J + + 编 程 - 图3904使 用 V is u a l J + + 编 程 - 图3905使 用 V is u a l J + + 编 程 - 图3906使 用 V is u a l J + + 编 程 - 图3907显 式 G ra ph ic 对 象 的 创 建 可 以 在 任 何 可 扩 充 C on tro l 类 的 对 象 上 通过 调 用 crea t G ra p h ics 方 法 来 创 建 一 个 显 式 的 G ra ph ic 对 象

使 用 V is u a l J + + 编 程 - 图3908隐 式 显 示 G ra ph ic 对 象 的 创 建 B itm a p 和 M e ta f i le 对 象 通 过 g e tG ra p h ic s

使 用 V is u a l J + + 编 程 - 图3909方 法 支 持 隐 式 G ra ph ic 对 象 的 创 建

显 式 G raph ic 对 象 的 创 建

使 用 V is u a l J + + 编 程 - 图3910使 用 V is u a l J + + 编 程 - 图3911使 用 V is u a l J + + 编 程 - 图3912扩 充 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 设 备 场 境 句 柄

使 用 V is u a l J + + 编 程 - 图3913使 用 V is u a l J + + 编 程 - 图3914使 用 V is u a l J + + 编 程 - 图3915使 用 V is u a l J + + 编 程 - 图3916使 用 V is u a l J + + 编 程 - 图3917HD C 使 用 V is u a l J + + 编 程 - 图3918 通 常 当 调 用 一 个 W in 3 2 方 法 返 回 HD C 时 可 以 使 用 这 种方 式 创 建 一 个 G ra ph ic 对 象

使 用 V is u a l J + + 编 程 - 图3919使 用 V is u a l J + + 编 程 - 图3920使 用 V is u a l J + + 编 程 - 图3921使 用 V is u a l J + + 编 程 - 图3922在 G ra ph ic 对 象 中 如 果 只 需 要 本 机 不 支 持 的 图 形 能 力 可 以 使 用 对 象的 g e t H a nd le 的 方 法 来 检 索 W in 3 2 设 备 场 境 的 句 柄 并 且 可 以 对 适 当 的W in 3 2 方 法 透 明 传 送 句 柄

使 用 V is u a l J + + 编 程 - 图3923使 用 V is u a l J + + 编 程 - 图3924使 用 V is u a l J + + 编 程 - 图3925使 用 V is u a l J + + 编 程 - 图3926如 果 在 以 前 的 句 柄 上 创 建 一 个 G ra ph ic 对 象 则 此 对 象 假 定 不 具 有 句 柄的 所 有 权 使 用 了 此 对 象 后 要 负 责 使 用 适 当 的 W in 3 2 函 数 释 放 句 柄

使 用 V is u a l J + + 编 程 - 图3927使 用 V is u a l J + + 编 程 - 图3928使 用 V is u a l J + + 编 程 - 图3929如 果 使 用 G ra ph ic 对 象 的 g e t H a nd le 方 法 来 检 索 对 象 的 基 本 句 柄 对 象保 留 句 柄 的 所 有 权 就 不 应 该 释 放 它

使 用 V is u a l J + + 编 程 - 图3930使 用 V is u a l J + + 编 程 - 图3931使 用 V is u a l J + + 编 程 - 图3932使 用 V is u a l J + + 编 程 - 图3933关 于 W in 3 2 句 柄 和 G ra ph ic 对 象 的 更 多 信 息 请 参 看 下 一 章 的 执 行 基于 句 柄 的 操 作

隐 式 G raph ic 对 象 的 创 建

使 用 V is u a l J + + 编 程 - 图3934使 用 V is u a l J + + 编 程 - 图3935使 用 V is u a l J + + 编 程 - 图3936使 用 V is u a l J + + 编 程 - 图3937使 用 V is u a l J + + 编 程 - 图3938通 过 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 ( ) ;

使 用 V is u a l J + + 编 程 - 图3939使 用 V is u a l J + + 编 程 - 图3940使 用 V is u a l J + + 编 程 - 图3941使 用 V is u a l J + + 编 程 - 图3942使 用 V is u a l J + + 编 程 - 图3943使 用 V is u a l J + + 编 程 - 图3944最 初 可 以 通 过 对 象 调 用 g e t G ra ph ic s 此 对 象 创 建 一 个 新 的 G ra ph ic 对象 实 例 并 返 回 它 通 过 原 始 的 调 用 在 所 建 对 象 的 回 送 中 通 过 相 同 对象 结 果 建 立 g e t G ra ph ic s 的 后 续 调 用

使 用 V is u a l J + + 编 程 - 图3945使 用 V is u a l J + + 编 程 - 图3946使 用 V is u a l J + + 编 程 - 图3947使 用 V is u a l J + + 编 程 - 图3948使 用 V is u a l J + + 编 程 - 图3949使 用 V is u a l J + + 编 程 - 图3950使 用 V is u a l J + + 编 程 - 图3951使 用 V is u a l J + + 编 程 - 图3952使 用 V is u a l J + + 编 程 - 图3953另 外 当 通 过 采 用 对 象 的 g e t G ra ph ic s 方 法 创 建 的 G ra ph ic 对 象 调 用 绘 制方 法 时 此 方 法 应 用 于 通 过 它 们 创 建 的 对 象 例 如 对 dra w T e xt 在 调用 中 指 定 的 X Y 的 坐 标 0 0 使 用 V is u a l J + + 编 程 - 图3954 是 与 位 图 相 关 的 但 不 能 控 制 位 图 重现

检 索 G ra ph ic 对 象

使 用 V is u a l J + + 编 程 - 图3955使 用 V is u a l J + + 编 程 - 图3956使 用 V is u a l J + + 编 程 - 图3957使 用 V is u a l J + + 编 程 - 图3958使 用 V is u a l J + + 编 程 - 图3959使 用 V is u a l J + + 编 程 - 图3960在 窗 体 或 控 件 的 绘 制 事 件 中 可 以 检 索 和 使 用 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 ) );

}

使 用 V is u a l J + + 编 程 - 图3961使 用 V is u a l J + + 编 程 - 图3962使 用 V is u a l J + + 编 程 - 图3963使 用 V is u a l J + + 编 程 - 图3964使 用 V is u a l J + + 编 程 - 图3965使 用 V is u a l J + + 编 程 - 图3966关 于 如 何 创 建 绘 制 事 件 外 的 G ra ph ic 对 象 请 参 考 以 前 的 章 节 显 式 图形 的 创 建 和 隐 式 图 形 的 创 建

G ra p h ic 对 象 作 用 域

使 用 V is u a l J + + 编 程 - 图3967使 用 V is u a l J + + 编 程 - 图3968使 用 V is u a l J + + 编 程 - 图3969使 用 V is u a l J + + 编 程 - 图3970使 用 V is u a l J + + 编 程 - 图3971使 用 V is u a l J + + 编 程 - 图3972G ra ph ic 对 象 有 方 法 作 用 域 这 意 味 着 当 使 用 G ra ph ic 对 象 返 回 某 种 方法 时 自 动 调 用 此 对 象 的 清 理 方 法 释 放 所 有 已 分 配 给 对 象 的 资 源 调用 了 清 理 之 后 可 尝 试 使 用 异 常 运 行 期 间 的 对 象 结 果

使 用 V is u a l J + + 编 程 - 图3973如 果 在 类 级 声 明 一 个 G ra ph ic 对 象 的 实 例 应 使 用 Fo rm 对 象 的

使 用 V is u a l J + + 编 程 - 图3974crea 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 …

}

}

使 用 V is u a l J + + 编 程 - 图3975使 用 V is u a l J + + 编 程 - 图3976使 用 V is u a l J + + 编 程 - 图3977使 用 V is u a l J + + 编 程 - 图3978使 用 V is u a l J + + 编 程 - 图3979使 用 V is u a l J + + 编 程 - 图3980尽 管 清 理 方 法 的 调 用 是 自 动 的 但 在 例 程 的 最 后 最 好 是 使 用 G ra ph ic 对 象 显 式 调 用 它 在 W ind ow s 95 平 台 上 这 是 非 常 重 要 的 因 为 系 统分 配 的 设 备 上 下 文 数 量 是 有 限 的

维 护 边 框 矩 形

使 用 V is u a l J + + 编 程 - 图3981使 用 V is u a l J + + 编 程 - 图3982可 以 画 图 的 窗 口 区 是 窗 口 的 客 户 区 在 这 个 矩 形 区 域 边 框 矩 形 定 义 了

使 用 V is u a l J + + 编 程 - 图3983使 用 V is u a l J + + 编 程 - 图3984使 用 V is u a l J + + 编 程 - 图3985使 用 V is u a l J + + 编 程 - 图3986使 用 V is u a l J + + 编 程 - 图3987在 画 G ra ph ic 对 象 中 可 视 的 矩 形 区 域 并 且 可 以 包 括 窗 口 的 整 个 客 户 区当 一 个 窗 口 丢 失 了 然 后 又 恢 复 焦 点 时 则 边 框 矩 形 部 分 被 以 前 重 现 它的 其 他 不 自 动 重 新 显 示 的 对 象 所 覆 盖

使 用 V is u a l J + + 编 程 - 图3988使 用 V is u a l J + + 编 程 - 图3989使 用 V is u a l J + + 编 程 - 图3990使 用 V is u a l J + + 编 程 - 图3991为 确 保 正 确 的 显 示 必 须 管 理 窗 体 或 控 件 的 重 新 绘 制 绘 制 事 件 处 理 程

序 是 放 于 进 行 管 理 的 Fo rm 类 代 码 中

在 处 理 程 序 中

可 以 恢 复 边 框 矩

形 到 正 确 的 状 态

下 面 的 例 子 将 创 建 类 级 B itm a p

对 象

然 后 使 用 绘 制 事

件 处 理 程 序 来 重

使 用 V is u a l J + + 编 程 - 图3992使 用 V is u a l J + + 编 程 - 图3993使 用 V is u a l J + + 编 程 - 图3994使 用 V is u a l J + + 编 程 - 图3995使 用 V is u a l J + + 编 程 - 图3996使 用 V is u a l J + + 编 程 - 图3997使 用 V is u a l J + + 编 程 - 图3998画 位 图 窗 体 的 客 户 区 每 次 变 成 无 效 时 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));

}

使 用 V is u a l J + + 编 程 - 图3999使 用 V is u a l J + + 编 程 - 图4000使 用 V is u a l J + + 编 程 - 图4001使 用 V is u a l J + + 编 程 - 图4002使 用 V is u a l J + + 编 程 - 图4003使 用 V is u a l J + + 编 程 - 图4004使 用 V is u a l J + + 编 程 - 图4005使 用 V is u a l J + + 编 程 - 图4006使 用 V is u a l J + + 编 程 - 图4007使 用 V is u a l J + + 编 程 - 图4008使 用 V is u a l J + + 编 程 - 图4009使 用 V is u a l J + + 编 程 - 图4010当 第 一 次 显 示 窗 体 时 每 次 都 重 新 获 得 焦 点 自 动 调 用 绘 制 事 件 处 理 程序 然 而 如 果 窗 体 支 持 重 设 尺 寸 则 窗 体 维 数 的 改 变 不 会 自 动 触 发 重新 绘 制 相 反 必 须 添 加 对 Fo rm 派 生 类 的 重 设 尺 寸 处 理 程 序 然 后从 处 理 程 序 中 调 用 使 对 象 无 效 的 方 法 下 面 是 在 窗 体 绘 制 事 件 处 理 程序 中 调 用 使 无 效 的 方 法

pro tect ed vo id o n R es ize( E ven t e){ t h is .inva lidate();

}

执 行 基 于 句 柄 的 操 作

使 用 V is u a l J + + 编 程 - 图4011使 用 V is u a l J + + 编 程 - 图4012使 用 V is u a l J + + 编 程 - 图4013使 用 V is u a l J + + 编 程 - 图4014使 用 V is u a l J + + 编 程 - 图4015使 用 V is u a l J + + 编 程 - 图4016使 用 V is u a l J + + 编 程 - 图4017句 柄 是 操 作 系 统 中 一 些 元 素 的 唯 一 编 号 例 如 桌 面 上 的 每 个 窗 口 都 有一 个 唯 一 的 句 柄 以 使 计 算 机 能 够 把 它 与 其 他 窗 口 区 别 开 每 个 设 备 上下 文 刷 子 笔 和 字 体 也 都 有 一 个 唯 一 的 句 柄

使 用 V is u a l J + + 编 程 - 图4018使 用 V is u a l J + + 编 程 - 图4019使 用 V is u a l J + + 编 程 - 图4020使 用 V is u a l J + + 编 程 - 图4021使 用 V is u a l J + + 编 程 - 图4022使 用 V is u a l J + + 编 程 - 图4023使 用 V is u a l J + + 编 程 - 图4024使 用 V is u a l J + + 编 程 - 图4025使 用 V is u a l J + + 编 程 - 图4026使 用 V is u a l J + + 编 程 - 图4027为 了 与 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 笔 的 特 征 创 建 这 个 对 象

使 用 V is u a l J + + 编 程 - 图4028使 用 V is u a l J + + 编 程 - 图4029使 用 V is u a l J + + 编 程 - 图4030使 用 V is u a l J + + 编 程 - 图4031使 用 V is u a l J + + 编 程 - 图4032使 用 V is u a l J + + 编 程 - 图4033即 使 没 有 以 句 柄 为 基 础 创 建 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 函 数

使 用 V is u a l J + + 编 程 - 图4034使 用 V is u a l J + + 编 程 - 图4035当 使 用 G ra ph ic 对 象 执 行 基 于 句 柄 的 操 作 时 应 记 住 以 下 几 条 重 要 规 则

  • 使 用 V is u a l J + + 编 程 - 图4036使 用 V is u a l J + + 编 程 - 图4037使 用 V is u a l J + + 编 程 - 图4038使 用 V is u a l J + + 编 程 - 图4039使 用 V is u a l J + + 编 程 - 图4040使 用 V is u a l J + + 编 程 - 图4041使 用 V is u a l J + + 编 程 - 图4042使 用 V is u a l J + + 编 程 - 图4043使 用 V is u a l J + + 编 程 - 图4044使 用 V is u a l J + + 编 程 - 图4045使 用 V is u a l J + + 编 程 - 图4046使 用 V is u a l J + + 编 程 - 图4047使 用 V is u a l J + + 编 程 - 图4048使 用 V is u a l J + + 编 程 - 图4049使 用 V is u a l J + + 编 程 - 图4050使 用 V is u a l J + + 编 程 - 图4051

    果 使 用 W in 3 2 方 法 创 建 基 于 以 前 分 配 过 句 柄 的 对 象 对 象 不 会 假定 具 有 句 柄 的 所 有 权 例 如 如 果 使 用 W in3 2 G e t D C 方 法 来 检 索 窗体 的 设 备 上 下 文 句 柄 HD C 使 用 V is u a l J + + 编 程 - 图4052 然 后 创 建 基 于 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 例 程 通 过

使 用 V is u a l J + + 编 程 - 图4053Ge 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 ) ;

使 用 V is u a l J + + 编 程 - 图4054使 用 V is u a l J + + 编 程 - 图4055使 用 V is u a l J + + 编 程 - 图4056使 用 V is u a l J + + 编 程 - 图4057使 用 V is u a l J + + 编 程 - 图4058注 意 本 例 中 使 用 设 备 上 下 文 的 句 柄 这 里 说 明 的 原 则 可 用 于 笔 刷子 字 体 和 位 图

  • 使 用 V is u a l J + + 编 程 - 图4059使 用 V is u a l J + + 编 程 - 图4060使 用 V is u a l J + + 编 程 - 图4061使 用 V is u a l J + + 编 程 - 图4062使 用 V is u a l J + + 编 程 - 图4063

    数 G ra ph ic 对 象 支 持 c o p y H a nd le 方 法 通 过 这 种 方 法 可 以 复 制 对象 的 句 柄 如 果 使 用 c o p y H a nd le 方 法 复 制 一 个 对 象 的 句 柄 则 要 负责 释 放 句 柄

  • 使 用 V is u a l J + + 编 程 - 图4064使 用 V is u a l J + + 编 程 - 图4065使 用 V is u a l J + + 编 程 - 图4066使 用 V is u a l J + + 编 程 - 图4067

    数 图 形 对 象 也 支 持 g e t H a nd le 方 法 这 种 方 法 返 回 对 象 的 句 柄 与句 柄 的 副 本 相 反 使 用 V is u a l J + + 编 程 - 图4068 这 种 方 法 支 持 G ra ph ic 对 象 方 法 和 W in 3 2 图 形 例程 之 间 的 兼 容 性

使 用 V is u a l J + + 编 程 - 图4069使 用 V is u a l J + + 编 程 - 图4070使 用 V is u a l J + + 编 程 - 图4071使 用 V is u a l J + + 编 程 - 图4072通 过 g e t H a nd le 方 法 检 索 的 句 柄 不 能 是 对 象 基 本 句 柄 的 副 本 因 此不 应 该 通 过 g e t H a nd le 释 放 检 索 的 句 柄 当 清 理 对 象 时 可 释 放 这 些 句柄

G ra p h ic 对 象 坐 标 系 统

使 用 V is u a l J + + 编 程 - 图4073使 用 V is u a l J + + 编 程 - 图4074使 用 V is u a l J + + 编 程 - 图4075使 用 V is u a l J + + 编 程 - 图4076使 用 V is u a l J + + 编 程 - 图4077使 用 V is u a l J + + 编 程 - 图4078使 用 V is u a l J + + 编 程 - 图4079使 用 V is u a l J + + 编 程 - 图4080G ra ph ic 对 象 支 持 的 许 多 方 法 都 依 赖 于 数 字 坐 标 此 坐 标 可 在 G ra ph ic 对 象 中 指 定 在 G ra ph ic 对 象 中 指 定 操 作 发 生 的 区 域 或 者 在 Po in t 对 象 中 指 定 操 作 发 生 的 X 水 平 使 用 V is u a l J + + 编 程 - 图4081 和 Y 垂 直 使 用 V is u a l J + + 编 程 - 图4082 坐 标

使 用 V is u a l J + + 编 程 - 图4083使 用 V is u a l J + + 编 程 - 图4084使 用 V is u a l J + + 编 程 - 图4085使 用 V is u a l J + + 编 程 - 图4086坐 标 系 统 指 明 了 这 样 的 对 象 指 定 的 坐 标 如 何 映 射 到 显 示 器 或 其 他 设 备中 例 如 假 定 调 用 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 ) ) ;"

使 用 V is u a l J + + 编 程 - 图4087使 用 V is u a l J + + 编 程 - 图4088使 用 V is u a l J + + 编 程 - 图4089使 用 V is u a l J + + 编 程 - 图4090本 例 中 Po in t 对 象 指 定 了 画 一 字 符 串 的 X 和 Y 坐 标 然 而 这 次 操 作的 实 际 结 果 取 决 于 G ra ph ic 对 象 关 联 的 坐 标 系 统

使 用 V is u a l J + + 编 程 - 图4091使 用 V is u a l J + + 编 程 - 图4092使 用 V is u a l J + + 编 程 - 图4093使 用 V is u a l J + + 编 程 - 图4094使 用 V is u a l J + + 编 程 - 图4095使 用 V is u a l J + + 编 程 - 图4096关 联 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 值 增 加 时 文 本 或 位 图 或 控 件 使 用 V is u a l J + + 编 程 - 图4097 将 水 平 向 右 或 垂 直 向 下移 动

使 用 V is u a l J + + 编 程 - 图4098使 用 V is u a l J + + 编 程 - 图4099为 了 同 带 有 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 ) ;

使 用 V is u a l J + + 编 程 - 图4100使 用 V is u a l J + + 编 程 - 图4101下 表 列 出 了 与 G ra ph ic 对 象 关 联 的 坐 标 系 统 并 描 述 了 在 绘 制 过 程 中

使 用 V is u a l J + + 编 程 - 图4102Po 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

用户 定 义

用户 定 义

设 置 坐 标 原 点

使 用 V is u a l J + + 编 程 - 图4103坐 标 原 点 定 义 了 测 量 坐 标 的 起 始 位 置

使 用 V is u a l J + + 编 程 - 图4104使 用 V is u a l J + + 编 程 - 图4105使 用 V is u a l J + + 编 程 - 图4106使 用 V is u a l J + + 编 程 - 图4107使 用 V is u a l J + + 编 程 - 图4108例 如 如 果 通 过 应 用 程 序 的 主 窗 体 创 建 一 个 G ra ph ic 对 象 则 G ra ph ic 对 象 的 坐 标 系 统 是 C oord ina te S ys te m . T E X T 且 图 形 坐 标 是 从 窗 体 的 左 上角 0 0 使 用 V is u a l J + + 编 程 - 图4109 开 始 的

使 用 V is u a l J + + 编 程 - 图4110使 用 V is u a l J + + 编 程 - 图4111使 用 V is u a l J + + 编 程 - 图4112使 用 V is u a l J + + 编 程 - 图4113使 用 V is u a l J + + 编 程 - 图4114使 用 V is u a l J + + 编 程 - 图4115然 而 如 果 使 用 用 户 定 义 的 坐 标 系 统 诸 如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 方 法 定 义 坐 标 开 始 测 量 的点 使 用 V is u a l J + + 编 程 - 图4116 对 页 面 或 设 备 使 用 V is u a l J + + 编 程 - 图4117 例 如 假 设 在 应 用 程 序 的 绘 制 事 件 中 包 括 如 下 代

使 用 V is u a l J + + 编 程 - 图4118

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));

}

使 用 V is u a l J + + 编 程 - 图4119使 用 V is u a l J + + 编 程 - 图4120使 用 V is u a l J + + 编 程 - 图4121使 用 V is u a l J + + 编 程 - 图4122使 用 V is u a l J + + 编 程 - 图4123使 用 V is u a l J + + 编 程 - 图4124使 用 V is u a l J + + 编 程 - 图4125使 用 V is u a l J + + 编 程 - 图4126代 码 设 置 坐 标 系 统 为 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 使 用 V is u a l J + + 编 程 - 图4127 开 始 到 100

使 用 V is u a l J + + 编 程 - 图4128100 结 束

映 射 逻 辑 坐 标 到 设 备 坐 标

使 用 V is u a l J + + 编 程 - 图4129使 用 V is u a l J + + 编 程 - 图4130W ind ow s 对 设 备 的 映 射 页 面 坐 标 提 供 内 置 式 支 持 诸 如 打 印 机 或 显 示器

使 用 V is u a l J + + 编 程 - 图4131使 用 V is u a l J + + 编 程 - 图4132使 用 V is u a l J + + 编 程 - 图4133使 用 V is u a l J + + 编 程 - 图4134使 用 V is u a l J + + 编 程 - 图4135对 于 大 多 数 通 过 W ind ow s 定 义 的 坐 标 系 统 由 系 统 本 身 执 行 这 种 转 换例 如 如 果 使 用 C oord ina te S ys te m . H IM E T R IC 坐 标 系 统 关 联 G ra ph ic 对象 则 对 象 上 的 每 个 逻 辑 单 位 在 设 备 上 转 换 为 . 001 英 寸

使 用 V is u a l J + + 编 程 - 图4136使 用 V is u a l J + + 编 程 - 图4137使 用 V is u a l J + + 编 程 - 图4138使 用 V is u a l J + + 编 程 - 图4139然 而 使 用 用 户 定 义 的 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));

使 用 V is u a l J + + 编 程 - 图4140使 用 V is u a l J + + 编 程 - 图4141在 本 例 中 对 se t C oord ina te S c a le 的 调 用 指 示 系 统 把 一 个 逻 辑 水 平 或 垂直 单 位 转 换 为 两 个 水 平 和 垂 直 的 设 备 单 位

绘 制 文 本

使 用 V is u a l J + + 编 程 - 图4142使 用 V is u a l J + + 编 程 - 图4143使 用 V is u a l J + + 编 程 - 图4144G 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 ) ) ;

使 用 V is u a l J + + 编 程 - 图4145使 用 V is u a l J + + 编 程 - 图4146使 用 V is u a l J + + 编 程 - 图4147使 用 V is u a l J + + 编 程 - 图4148这 次 调 用 的 可 视 结 果 依 赖 于 诸 多 因 素 包 括 G ra ph ic 对 象 目 前 的 文 本 颜色 背 景 色 字 体 位 置 和 坐 标 系 统

使 用 V is u a l J + + 编 程 - 图4149使 用 V is u a l J + + 编 程 - 图4150使 用 V is u a l J + + 编 程 - 图4151使 用 V is u a l J + + 编 程 - 图4152使 用 V is u a l J + + 编 程 - 图4153使 用 V is u a l J + + 编 程 - 图4154使 用 V is u a l J + + 编 程 - 图4155使 用 V is u a l J + + 编 程 - 图4156使 用 V is u a l J + + 编 程 - 图4157使 用 V is u a l J + + 编 程 - 图4158使 用 V is u a l J + + 编 程 - 图4159使 用 V is u a l J + + 编 程 - 图4160关 于 如 何 设 置 文 本 颜 色 的 信 息 参 看 下 一 节 设 置 文 本 颜 色 G ra ph ic 对 象 与 字 体 关 联 的 信 息 参 看 本 章 后 面 的 使 用 字 体 对 象 关 于 坐 标系 统 的 信 息 参 看 本 章 后 面 的 G ra ph ic 对 象 坐 标 系 统

设 置 文 本 颜 色

使 用 V is u a l J + + 编 程 - 图4161为 设 置 文 本 中 文 本 和 背 景 的 颜 色 可 在 调 用 dra w S tr ing 之 前 调 用 G ra ph ic

使 用 V is u a l J + + 编 程 - 图4162对 象 的 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…

使 用 V is u a l J + + 编 程 - 图4163使 用 V is u a l J + + 编 程 - 图4164使 用 V is u a l J + + 编 程 - 图4165使 用 V is u a l J + + 编 程 - 图4166se t B a c kC o lor 方 法 只 影 响 文 本 的 背 景 色 为 了 设 置 背 景 或 为 其 他 对 象 填充 颜 色 如 多 边 形 或 线 分 别 使 用 se t B ru sh 和 se t P e n 方 法

使 用 Fo n t对 象

使 用 V is u a l J + + 编 程 - 图4167使 用 V is u a l J + + 编 程 - 图4168使 用 V is u a l J + + 编 程 - 图4169字 体 是 共 享 共 同 设 计 的 字 符 和 符 号 的 集 合 字 体 的 主 要 元 素 包 括 字 样效 果 和 尺 寸

使 用 V is u a l J + + 编 程 - 图4170使 用 V is u a l J + + 编 程 - 图4171使 用 V is u a l J + + 编 程 - 图4172使 用 V is u a l J + + 编 程 - 图4173使 用 V is u a l J + + 编 程 - 图4174使 用 V is u a l J + + 编 程 - 图4175在 W F C 中 在 字 体 对 象 中 W ind ow s 字 体 是 封 装 的 可 以 将 对 象 与 其他 字 体 相 关 的 对 象 组 合 使 用 为 了 在 G ra ph ic 对 象 上 显 示 字 体 定 义 一个 可 无 限 变 化 的 字 体

使 用 V is u a l J + + 编 程 - 图4176下 表 列 出 了 W F C 支 持 的 相 关 字 体 类 别

类 说 明

F o nt D e sc rip to r 提供 有 关 Fo n t 对象 的信 息

使 用 V is u a l J + + 编 程 - 图4177Fo 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 定义 字 体 的 间 距

使 用 V is u a l J + + 编 程 - 图4178Fo n t S iz e 定义 一 组 常 量 在能 被 指 定 的 字体 大小 单 元 中 表 示

使 用 V is u a l J + + 编 程 - 图4179Fo n tT y pe 定义 一 组 常 量 这些 常 量 表 示 将重 现字 体 的 设 备

使 用 V is u a l J + + 编 程 - 图4180Fo n tW e igh t 定 义 常 量 这 个 常 量 表 示 与 字 体 关 联 的 不 同 权 重

使 用 V is u a l J + + 编 程 - 图4181w e ig h t 使 用 V is u a l J + + 编 程 - 图4182

创 建 F on t对 象

使 用 V is u a l J + + 编 程 - 图4183使 用 V is u a l J + + 编 程 - 图4184使 用 V is u a l J + + 编 程 - 图4185使 用 V is u a l J + + 编 程 - 图4186创 建 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 ) ;

使 用 V is u a l J + + 编 程 - 图4187使 用 V is u a l J + + 编 程 - 图4188使 用 V is u a l J + + 编 程 - 图4189使 用 V is u a l J + + 编 程 - 图4190使 用 V is u a l J + + 编 程 - 图4191使 用 V is u a l J + + 编 程 - 图4192使 用 V is u a l J + + 编 程 - 图4193使 用 V is u a l J + + 编 程 - 图4194使 用 V is u a l J + + 编 程 - 图4195使 用 V is u a l J + + 编 程 - 图4196使 用 V is u a l J + + 编 程 - 图4197使 用 V is u a l J + + 编 程 - 图4198使 用 V is u a l J + + 编 程 - 图4199这 个 例 子 使 用 了 F ont 对 象 构 造 器 这 只 需 要 知 道 两 项 信 息 字 体 名 和字 体 尺 寸 当 创 建 F ont 对 象 时 也 可 以 指 定 字 体 系 列 类 型 权 重方 向 和 是 否 加 粗 是 否 斜 体 是 否 有 下 划 线 或 是 否 有 删 除 线 然 而 一旦 创 建 了 一 个 F ont 对 象 就 不 能 再 修 改 这 个 对 象 的 属 性

在 G raph ic 对 象 上 设 置 字 体

使 用 V is u a l J + + 编 程 - 图4200使 用 V is u a l J + + 编 程 - 图4201使 用 V is u a l J + + 编 程 - 图4202使 用 V is u a l J + + 编 程 - 图4203G ra ph ic 对 象 支 持 se t F ont 方 法 此 方 法 与 带 有 对 象 的 字 体 相 关 联 当 Fo n t 对 象 与 G ra ph ic 对 象 相 关 联 后 在 G ra ph ic 对 象 矩 形 框 内 的 所 有 文 本 都使 用 此 字 体

使 用 V is u a l J + + 编 程 - 图4204使 用 V is u a l J + + 编 程 - 图4205使 用 V is u a l J + + 编 程 - 图4206使 用 V is u a l J + + 编 程 - 图4207下 面 的 代 码 说 明 了 把 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 ) ;

枚 举 字 体

使 用 V is u a l J + + 编 程 - 图4208使 用 V is u a l J + + 编 程 - 图4209使 用 V is u a l J + + 编 程 - 图4210在 许 多 实 例 中 必 须 能 枚 举 且 检 索 可 用 字 体 的 详 细 信 息 并 为 某 一 特 殊操 作 选 择 最 合 适 的 字 体

使 用 V is u a l J + + 编 程 - 图4211使 用 V is u a l J + + 编 程 - 图4212使 用 V is u a l J + + 编 程 - 图4213使 用 V is u a l J + + 编 程 - 图4214使 用 V is u a l J + + 编 程 - 图4215使 用 V is u a l J + + 编 程 - 图4216使 用 V is u a l J + + 编 程 - 图4217W 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 对 象 的 一 个 数组 数 组 中 的 每 个 元 素 描 述 一 种 字 体

使 用 V is u a l J + + 编 程 - 图4218使 用 V is u a l J + + 编 程 - 图4219使 用 V is u a l J + + 编 程 - 图4220使 用 V is u a l J + + 编 程 - 图4221下 面 举 例 说 明 了 如 何 使 用 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);

}

}

使 用 笔

使 用 V is u a l J + + 编 程 - 图4222使 用 V is u a l J + + 编 程 - 图4223使 用 V is u a l J + + 编 程 - 图4224使 用 V is u a l J + + 编 程 - 图4225使 用 V is u a l J + + 编 程 - 图4226使 用 V is u a l J + + 编 程 - 图4227使 用 V is u a l J + + 编 程 - 图4228使 用 V is u a l J + + 编 程 - 图4229使 用 V is u a l J + + 编 程 - 图4230使 用 V is u a l J + + 编 程 - 图4231使 用 V is u a l J + + 编 程 - 图4232使 用 V is u a l J + + 编 程 - 图4233笔 是 一 种 图 形 工 具 在 M ic rosoft W indow s 中 用 于 绘 制 直 线 和 曲 线 笔 可 用 于 画 徒 手 线 计 算 机 辅 助 设 计 CA D 使 用 V is u a l J + + 编 程 - 图4234 应 用 程 序 使 用 笔 绘 制 可见 线 隐 含 线 剖 面 线 中 心 线 等 等 字 处 理 和 桌 面 出 版 应 用 程 序 使 用笔 绘 制 边 框 和 标 尺 电 子 数 据 表 应 用 程 序 使 用 笔 可 在 图 中 指 明 趋 势 并且 绘 制 条 形 图 和 饼 图

使 用 V is u a l J + + 编 程 - 图4235使 用 V is u a l J + + 编 程 - 图4236使 用 V is u a l J + + 编 程 - 图4237使 用 V is u a l J + + 编 程 - 图4238使 用 V is u a l J + + 编 程 - 图4239每 个 笔 由 三 个 属 性 构 成 效 果 宽 度 和 颜 色 如 果 对 笔 的 宽 度 和 颜 色 没有 特 殊 限 制 则 操 作 系 统 必 须 支 持 笔 的 效 果

W F C P e n 对 象

使 用 V is u a l J + + 编 程 - 图4240使 用 V is u a l J + + 编 程 - 图4241使 用 V is u a l J + + 编 程 - 图4242在 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 ) ;

使 用 V is u a l J + + 编 程 - 图4243使 用 V is u a l J + + 编 程 - 图4244使 用 V is u a l J + + 编 程 - 图4245使 用 V is u a l J + + 编 程 - 图4246使 用 V is u a l J + + 编 程 - 图4247笔 效 果 是 传 递 到 构 造 器 的 常 量 在 W ind ow s 中 支 持 七 个 内 部 笔 效 果每 一 个 都 可 以 通 过 在 Pe n S tyle 类 中 定 义 一 个 常 量 来 表 示 Pe n S tyle 类 是枚 举 类 这 意 味 着 它 定 义 了 一 种 方 法 使 用 V is u a l J + + 编 程 - 图4248 有 效 使 用 V is u a l J + + 编 程 - 图4249 用 来 决 定 指 定 值 是 否 为Pe n S tyle 类 的 有 效 成 员

使 用 V is u a l J + + 编 程 - 图4250下 表 列 出 了 Pe n S tyle 常 量

常量 说明

Pe n S tyle .D A S H 表 示 画破 折 号 的笔

Pe n S T Y L E .D O T 表示 划 点 的 笔

使 用 V is u a l J + + 编 程 - 图4251使 用 V is u a l J + + 编 程 - 图4252P 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 使 用 V is u a l J + + 编 程 - 图4253

使 用 V is u a l J + + 编 程 - 图4254P e n S tyle .NUL L 表示 一 个 空 笔

Pe n S tyle .S O L ID 表示 一 个 实 心 笔

使 用 V is u a l J + + 编 程 - 图4255使 用 V is u a l J + + 编 程 - 图4256使 用 V is u a l J + + 编 程 - 图4257另 外 Pe n 对 象 包 括 了 一 组 用 于 指 定 要 创 建 的 笔 种 类 的 公 共 成 员 这 些成 员 中 的 任 何 一 个 都 是 Pe n 对 象 用 于 模 拟 W ind ow s 用 户 界 面 的 各 种

使 用 V is u a l J + + 编 程 - 图4258本 机 特 征

使 用 V is u a l J + + 编 程 - 图4259使 用 V is u a l J + + 编 程 - 图4260使 用 V is u a l J + + 编 程 - 图4261使 用 V is u a l J + + 编 程 - 图4262例 如 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;

使 用 V is u a l J + + 编 程 - 图4263下 表 列 出 了 定 义 为 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 表 示 菜单 文 本 颜色 的笔

使 用 V is u a l J + + 编 程 - 图4264P 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 表 示 活动 窗 口 文本 颜色 的 笔

使 用 V is u a l J + + 编 程 - 图4265使 用 V is u a l J + + 编 程 - 图4266使 用 V is u a l J + + 编 程 - 图4267使 用 V is u a l J + + 编 程 - 图4268注 意 当 根 据 系 统 常 量 使 用 笔 时 例 如 活 动 窗 口 文 本 的 颜 色 Pe n 对 应的 系 统 设 置 的 改 变 将 导 致 笔 的 变 化

在 G raph ic 对 象 上 设 置 笔

使 用 V is u a l J + + 编 程 - 图4269使 用 V is u a l J + + 编 程 - 图4270使 用 V is u a l J + + 编 程 - 图4271使 用 V is u a l J + + 编 程 - 图4272Pe 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 ) ) ;

使 用 V is u a l J + + 编 程 - 图4273使 用 V is u a l J + + 编 程 - 图4274使 用 V is u a l J + + 编 程 - 图4275使 用 V is u a l J + + 编 程 - 图4276使 用 G ra ph ic 对 象 关 联 了 Pe n 后 在 G ra ph ic 对 象 矩 形 框 内 的 所 有 线 的绘 制 都 使 用 这 支 笔 另 外 可 以 在 相 同 的 G ra ph ic 对 象 上 多 次 调 用 se t P e n 方 法

使 用 V is u a l J + + 编 程 - 图4277使 用 V is u a l J + + 编 程 - 图4278使 用 V is u a l J + + 编 程 - 图4279使 用 V is u a l J + + 编 程 - 图4280使 用 V is u a l J + + 编 程 - 图4281使 用 V is u a l J + + 编 程 - 图4282下 例 演 示 了 具 有 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…

使 用 刷 子

使 用 V is u a l J + + 编 程 - 图4283使 用 V is u a l J + + 编 程 - 图4284使 用 V is u a l J + + 编 程 - 图4285使 用 V is u a l J + + 编 程 - 图4286使 用 V is u a l J + + 编 程 - 图4287使 用 V is u a l J + + 编 程 - 图4288使 用 V is u a l J + + 编 程 - 图4289使 用 V is u a l J + + 编 程 - 图4290刷 子 是 一 种 图 形 工 具 基 于 W in 3 2 的 应 用 程 序 使 用 它 可 以 绘 制 多 边 形椭 圆 轨 迹 的 内 部 画 图 应 用 程 序 使 用 刷 子 可 以 绘 制 形 状 字 处 理 应 用程 序 使 用 刷 子 绘 制 标 尺 计 算 机 辅 助 设 计 CA D 使 用 V is u a l J + + 编 程 - 图4291 应 用 程 序 使 用 刷 子绘 制 横 断 面 视 图 的 内 部 电 子 数 据 表 应 用 程 序 使 用 刷 子 绘 制 饼 图 和 条 形

使 用 V is u a l J + + 编 程 - 图4292图 的 断 面

使 用 V is u a l J + + 编 程 - 图4293使 用 V is u a l J + + 编 程 - 图4294使 用 V is u a l J + + 编 程 - 图4295使 用 V is u a l J + + 编 程 - 图4296使 用 V is u a l J + + 编 程 - 图4297使 用 V is u a l J + + 编 程 - 图4298刷 子 有 两 种 类 型 逻 辑 型 和 物 理 型 逻 辑 型 刷 子 是 在 代 码 中 定 义 的 是应 用 程 序 绘 制 形 状 使 用 的 颜 色 和 样 式 的 理 想 组 合 物 理 型 刷 子 以 逻 辑 型刷 子 为 基 础 由 设 备 驱 动 程 序 创 建

刷 子 的 原 点

使 用 V is u a l J + + 编 程 - 图4299使 用 V is u a l J + + 编 程 - 图4300使 用 V is u a l J + + 编 程 - 图4301使 用 V is u a l J + + 编 程 - 图4302使 用 V is u a l J + + 编 程 - 图4303当 某 一 应 用 程 序 调 用 绘 制 函 数 绘 制 形 状 时 W ind ow s 在 绘 制 操 作 的 开 始定 位 一 个 刷 子 并 在 刷 子 的 位 图 中 对 客 户 区 的 窗 口 原 点 映 射 一 个 像 素 窗口 原 点 位 于 客 户 区 窗 口 的 左 上 角 使 用 V is u a l J + + 编 程 - 图4304 W ind ow s 映 射 的 像 素 点 坐 标 称 为 刷子 的 原 点

使 用 V is u a l J + + 编 程 - 图4305使 用 V is u a l J + + 编 程 - 图4306使 用 V is u a l J + + 编 程 - 图4307使 用 V is u a l J + + 编 程 - 图4308使 用 V is u a l J + + 编 程 - 图4309使 用 V is u a l J + + 编 程 - 图4310使 用 V is u a l J + + 编 程 - 图4311使 用 V is u a l J + + 编 程 - 图4312使 用 V is u a l J + + 编 程 - 图4313使 用 V is u a l J + + 编 程 - 图4314使 用 V is u a l J + + 编 程 - 图4315刷 子 原 点 的 默 认 值 是 刷 子 位 图 的 左 上 角 0 0 使 用 V is u a l J + + 编 程 - 图4316 坐 标 W ind ow s 随 后 拷贝 经 过 客 户 区 的 刷 子 形 成 与 位 图 同 样 高 的 样 式 拷 贝 操 作 不 断 逐 行 进行 直 到 填 满 整 个 客 户 区 然 而 刷 子 样 式 只 有 在 指 定 形 状 的 边 界 才 是可 视 的 这 里 术 语 位 图 多 用 于 字 面 意 义 — — 如 同 安 排 位 一 样 而 不专 指 存 储 在 图 像 文 件 中 的 位 使 用 V is u a l J + + 编 程 - 图4317

使 用 V is u a l J + + 编 程 - 图4318使 用 V is u a l J + + 编 程 - 图4319使 用 V is u a l J + + 编 程 - 图4320使 用 V is u a l J + + 编 程 - 图4321使 用 V is u a l J + + 编 程 - 图4322使 用 V is u a l J + + 编 程 - 图4323在 不 使 用 默 认 刷 子 原 点 时 有 许 多 实 例 例 如 对 于 一 个 应 用 程 序 来 说可 以 有 必 要 使 用 相 同 的 刷 子 绘 制 父 窗 口 和 子 窗 口 的 背 景 并 把 子 窗 口 的背 景 与 父 窗 口 的 背 景 相 混 合

逻 辑 型 刷 子 类 型

使 用 V is u a l J + + 编 程 - 图4324使 用 V is u a l J + + 编 程 - 图4325使 用 V is u a l J + + 编 程 - 图4326使 用 V is u a l J + + 编 程 - 图4327逻 辑 型 刷 子 的 类 型 有 三 种 实 心 影 线 样 式

使 用 V is u a l J + + 编 程 - 图4328使 用 V is u a l J + + 编 程 - 图4329使 用 V is u a l J + + 编 程 - 图4330使 用 V is u a l J + + 编 程 - 图4331实 心 so lid 使 用 V is u a l J + + 编 程 - 图4332 刷 子 由 W ind ow s 用 户 界 面 的 一 些 元 素 定 义 的 颜 色 或 样 式组 成 例 如 可 以 通 过 W ind ow s 显 示 禁 用 按 钮 使 用 的 常 规 颜 色 和 样 式来 绘 制 一 种 形 状 使 用 V is u a l J + + 编 程 - 图4333

使 用 V is u a l J + + 编 程 - 图4334使 用 V is u a l J + + 编 程 - 图4335使 用 V is u a l J + + 编 程 - 图4336使 用 V is u a l J + + 编 程 - 图4337使 用 V is u a l J + + 编 程 - 图4338使 用 V is u a l J + + 编 程 - 图4339使 用 V is u a l J + + 编 程 - 图4340使 用 V is u a l J + + 编 程 - 图4341影 线 ha tc he d 使 用 V is u a l J + + 编 程 - 图4342 刷 子 由 颜 色 的 组 合 和 W in 3 2 定 义 的 六 种 样 式 之 一 组 成样 式 pa t te rn 使 用 V is u a l J + + 编 程 - 图4343 刷 子 由 位 图 组 成 这 个 位 图 作 为 填 充 形 状 的 样 式 的 基 础它 填 充 的 区 域 比 位 图 要 大 在 显 示 中 以 水 平 和 垂 直 方 向 平 铺 位 图 样 式刷 子 能 够 创 建 由 自 定 义 样 式 组 成 的 自 定 义 刷 子

W F C B ru s h 对 象

使 用 V is u a l J + + 编 程 - 图4344使 用 V is u a l J + + 编 程 - 图4345使 用 V is u a l J + + 编 程 - 图4346W in 3 2 刷 子 的 功 能 封 装 在 W F C B ru sh 对 象 和 B ru sh S ty le 对 象 中 可 以 协调 使 用 这 些 对 象 来 创 建 实 心 样 式 和 影 线 型 刷 子

使 用 V is u a l J + + 编 程 - 图4347使 用 V is u a l J + + 编 程 - 图4348使 用 V is u a l J + + 编 程 - 图4349使 用 V is u a l J + + 编 程 - 图4350B ru sh 对 象 定 义 了 一 组 公 用 的 最 终 成 员 每 个 成 员 都 是 一 个 代 表 实 心 刷子 的 对 象 B ru shS tyle 类 代 表 了 作 为 一 组 整 型 常 量 的 影 线 刷 子 每 个 常量 代 表 刷 子 的 不 同 类 型

使 用 V is u a l J + + 编 程 - 图4351下 表 列 出 了 代 表 实 心 刷 子 的 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 对象

使 用 V is u a l J + + 编 程 - 图4352B 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 对象

使 用 V is u a l J + + 编 程 - 图4353B ru sh .W INDO W 表 示 窗口 背 景 色的 B ru s h 对象下 表 列出 了 代 表影 线刷 子 的 B ru s h S ty le 常量

常量 说明

使 用 V is u a l J + + 编 程 - 图4354B 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 表 示 一个 交 叉 影线 的刷 子

使 用 V is u a l J + + 编 程 - 图4355B ru sh S ty le .F OR W A R DD IA GON A 表 示 一 个 正 斜 线 刷 子 从 刷 子 原 点 右 下 角 到

L 左上 角 的 平 行 线

使 用 V is u a l J + + 编 程 - 图4356B 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 对 象

使 用 V is u a l J + + 编 程 - 图4357使 用 V is u a l J + + 编 程 - 图4358使 用 V is u a l J + + 编 程 - 图4359如 何 创 建 B ru sh 对 象 取 决 于 所 需 刷 子 的 类 型 因 为 实 心 刷 子 是 B ru s h 对象 可 以 如 下 创 建 实 心 刷 子

B ru s h b r = B r u s h .BLAC K ;

使 用 V is u a l J + + 编 程 - 图4360使 用 V is u a l J + + 编 程 - 图4361样 式 刷 子 可 由 作 为 整 型 常 量 的 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 ) ;

使 用 V is u a l J + + 编 程 - 图4362下 面 的 代 码 段 演 示 了 基 于 位 图 创 建 刷 子 的 一 种 方 法

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 " ) ) ;

使 用 V is u a l J + + 编 程 - 图4363使 用 V is u a l J + + 编 程 - 图4364使 用 V is u a l J + + 编 程 - 图4365使 用 V is u a l J + + 编 程 - 图4366使 用 V is u a l J + + 编 程 - 图4367本 例 中 假 定 刷 子 样 式 所 依 赖 的 位 图 存 储 在 磁 盘 上 的 文 件 中 然 而 也 可以 使 用 B itm a p 对 象 的 C rea teB i tm a p 方 法 在 运 行 期 间 定 义 一 个 位 图并 使 用 定 义 的 位 图 作 为 刷 子 样 式 的 基 础

在 G raph ic 对 象 上 设 置 刷 子

使 用 V is u a l J + + 编 程 - 图4368使 用 V is u a l J + + 编 程 - 图4369使 用 V is u a l J + + 编 程 - 图4370使 用 V is u a l J + + 编 程 - 图4371使 用 V is u a l J + + 编 程 - 图4372如 同 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);

}

使 用 V is u a l J + + 编 程 - 图4373使 用 V is u a l J + + 编 程 - 图4374使 用 V is u a l J + + 编 程 - 图4375使 用 V is u a l J + + 编 程 - 图4376当 B ru sh 对 象 与 G ra ph ic 对 象 建 立 关 联 后 使 用 G ra ph ic 对 象 实 例 绘 制的 所 有 多 边 形 都 由 关 联 的 刷 子 填 充 如 果 想 用 G ra ph ic 对 象 关 联 一 个 新刷 子 可 以 多 次 调 用 se t B ru sh

B ru s h 对 象 举 例

使 用 V is u a l J + + 编 程 - 图4377使 用 V is u a l J + + 编 程 - 图4378自 定 义 刷 子 基 于 从 文 件 加 载 或 在 内 存 创 建 的 位 图 C u s tom B rush 样 本 应用 程 序 演 示 了 如 何 创 建 和 使 用 自 定 义 刷 子

使 用 V is u a l J + + 编 程 - 图4379C u s tom B rus h 的 应 用 程 序 由 两 个 面 板 和 两 个 按 钮 组 成 第 一 块 面 板

使 用 V is u a l J + + 编 程 - 图4380使 用 V is u a l J + + 编 程 - 图4381使 用 V is u a l J + + 编 程 - 图4382使 用 V is u a l J + + 编 程 - 图4383使 用 V is u a l J + + 编 程 - 图4384使 用 V is u a l J + + 编 程 - 图4385使 用 V is u a l J + + 编 程 - 图4386pa ne l G r id 使 用 V is u a l J + + 编 程 - 图4387 由 64 个 正 方 形 组 成 当 用 户 单 击 这 些 正 方 形 中 的 某 一 个时 应 用 程 序 寄 存 器 注 册 已 单 击 的 正 方 形 将 正 方 形 绘 制 为 黑 色 并 逐位 对 短 整 数 数 组 的 元 素 执 行 操 作 整 数 的 修 改 取 决 于 单 击 的 正 方 形

使 用 V is u a l J + + 编 程 - 图4388使 用 V is u a l J + + 编 程 - 图4389使 用 V is u a l J + + 编 程 - 图4390使 用 V is u a l J + + 编 程 - 图4391使 用 V is u a l J + + 编 程 - 图4392当 用 户 单 击 Te s t 按 钮 时 C u s tom B rush 应 用 程 序 根 据 短 整 型 的 数 组 创 建位 图 根 据 这 个 位 图 创 建 一 个 刷 子 然 后 使 用 刷 子 为 Te s t 按 钮 上 显 示的 面 板 pa ne l R e c t 使 用 V is u a l J + + 编 程 - 图4393 绘 制

使 用 V is u a l J + + 编 程 - 图4394使 用 V is u a l J + + 编 程 - 图4395在 应 用 程 序 的 启 动 上 C u s tom B rush 应 用 程 序 执 行 如 下 任 务

  • 使 用 V is u a l J + + 编 程 - 图4396使 用 V is u a l J + + 编 程 - 图4397使 用 V is u a l J + + 编 程 - 图4398调 用 用 户 定 义 的 g e t R ects 方 法 来 创 建 一 个 6 4 R ec tan g le 对 象 的 数 组并 为 应 用 程 序 的 网 格 面 板 绘 制 这 些 矩 形 pa n e l G r id 使 用 V is u a l J + + 编 程 - 图4399

  • 使 用 V is u a l J + + 编 程 - 图4400使 用 V is u a l J + + 编 程 - 图4401使 用 V is u a l J + + 编 程 - 图4402使 用 V is u a l J + + 编 程 - 图4403使 用 V is u a l J + + 编 程 - 图4404使 用 V is u a l J + + 编 程 - 图4405使 用 V is u a l J + + 编 程 - 图4406声 明 一 个 短 整 型 数 组 bB ru sh B i ts 存 于 数 组 中 的 整 数 值 将 最 后 形成 创 建 位 图 的 基 础 当 用 户 单 击 Te s t 按 钮 时 使 用 位 图 来 创 建 一 个刷 子 这 个 刷 子 绘 制 Te s t 按 钮 上 显 示 的 面 板

  • 使 用 V is u a l J + + 编 程 - 图4407使 用 V is u a l J + + 编 程 - 图4408使 用 V is u a l J + + 编 程 - 图4409使 用 V is u a l J + + 编 程 - 图4410

    明 并 初 始 化 一 个 布 尔 型 变 量 数 组 为 假 此 数 组 用 于 跟 踪 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 ;

}

使 用 V is u a l J + + 编 程 - 图4411使 用 V is u a l J + + 编 程 - 图4412使 用 V is u a l J + + 编 程 - 图4413使 用 V is u a l J + + 编 程 - 图4414使 用 V is u a l J + + 编 程 - 图4415使 用 V is u a l J + + 编 程 - 图4416使 用 V is u a l J + + 编 程 - 图4417使 用 V is u a l J + + 编 程 - 图4418当 调 用 网 格 控 制 面 板 的 绘 制 事 件 处 理 程 序 时 使 用 存 储 于 应 用 程 序 矩 形数 组 rg R ec ts 使 用 V is u a l J + + 编 程 - 图4419 中 的 维 数 和 存 储 于 类 类 布 尔 型 数 组 rg S ta te s 使 用 V is u a l J + + 编 程 - 图4420 中 的 状态 来 绘 制 网 格 否 则 使 用 一 个 空 刷 子 绘 制 这 使 用 户 可 以 决 定 刷 子 的外 观 此 刷 子 是 在 网 格 面 板 上 根 据 矩 形 样 式 最 终 创 建 的

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]);

}

}

使 用 V is u a l J + + 编 程 - 图4421使 用 V is u a l J + + 编 程 - 图4422使 用 V is u a l J + + 编 程 - 图4423使 用 V is u a l J + + 编 程 - 图4424使 用 V is u a l J + + 编 程 - 图4425使 用 V is u a l J + + 编 程 - 图4426使 用 V is u a l J + + 编 程 - 图4427使 用 V is u a l J + + 编 程 - 图4428每 次 用 户 单 击 网 格 面 板 中 的 一 个 矩 形 时 都 会 激 活 面 板 单 击 事 件 在 网格 面 板 的 单 击 事 例 处 理 程 序 中 应 用 程 序 确 定 单 击 了 哪 一 个 矩 形 并 设置 相 应 的 布 尔 状 态 为 真 然 后 调 用 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();

}

使 用 V is u a l J + + 编 程 - 图4429使 用 V is u a l J + + 编 程 - 图4430使 用 V is u a l J + + 编 程 - 图4431最 后 当 用 户 单 击 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();

}

使 用 V is u a l J + + 编 程 - 图4432在 pa ne l R e c t 绘 制 处 理 程 序 中 应 用 程 序 根 据 短 整 型 数 组 创 建 一 个 位 图

使 用 V is u a l J + + 编 程 - 图4433使 用 V is u a l J + + 编 程 - 图4434使 用 V is u a l J + + 编 程 - 图4435使 用 V is u a l J + + 编 程 - 图4436使 用 V is u a l J + + 编 程 - 图4437bB ru sh B i ts 使 用 V is u a l J + + 编 程 - 图4438 根 据 位 图 创 建 一 个 刷 子 然 后 绘 制 Te s t 按 钮 上 显 示 的面 板 pa ne l R e c t 使 用 V is u a l J + + 编 程 - 图4439

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 ( ) ) ;

}

绘 制 位 图

使 用 V is u a l J + + 编 程 - 图4440使 用 V is u a l J + + 编 程 - 图4441使 用 V is u a l J + + 编 程 - 图4442位 图 是 一 个 可 绘 制 的 表 面 此 表 面 可 用 于 显 示 笔 刷 子 或 图 像 包 括

使 用 V is u a l J + + 编 程 - 图4443使 用 V is u a l J + + 编 程 - 图4444使 用 V is u a l J + + 编 程 - 图4445W ind ow s 位 图 元 文 件 .g if 和 .jp g 图 像

使 用 V is u a l J + + 编 程 - 图4446使 用 V is u a l J + + 编 程 - 图4447使 用 V is u a l J + + 编 程 - 图4448使 用 V is u a l J + + 编 程 - 图4449使 用 V is u a l J + + 编 程 - 图4450使 用 V is u a l J + + 编 程 - 图4451使 用 V is u a l J + + 编 程 - 图4452B itm a p 对 象 支 持 对 位 图 的 创 建 和 加 载 可 以 使 用 此 对 象 加 载 一 个 来 自文 件 流 或 资 源 的 位 图 图 像 或 在 内 存 创 建 位 图 另 外 B itm a p 对象 支 持 在 位 图 中 定 义 透 明 色

使 用 V is u a l J + + 编 程 - 图4453使 用 V is u a l J + + 编 程 - 图4454使 用 V is u a l J + + 编 程 - 图4455创 建 B itm a p 对 象 后 使 用 G ra ph ic 对 象 的 dra w Im a g e 方 法 在 显 示 器中 重 现 B itm a p 对 象

使 用 V is u a l J + + 编 程 - 图4456下 面 的 代 码 创 建 了 一 个 新 的 B itm a p 对 象 然 后 使 用 Fo rm 类 的

使 用 V is u a l J + + 编 程 - 图4457crea 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));

缩 小 和 放 大 位 图

使 用 V is u a l J + + 编 程 - 图4458使 用 V is u a l J + + 编 程 - 图4459使 用 V is u a l J + + 编 程 - 图4460使 用 V is u a l J + + 编 程 - 图4461使 用 V is u a l J + + 编 程 - 图4462使 用 V is u a l J + + 编 程 - 图4463使 用 V is u a l J + + 编 程 - 图4464使 用 V is u a l J + + 编 程 - 图4465W F C 支 持 的 所 有 图 像 M e ta f ile Ic o n B itm a p 和 Cu rso r 使 用 V is u a l J + + 编 程 - 图4466 都 支 持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 方 法

使 用 V is u a l J + + 编 程 - 图4467使 用 V is u a l J + + 编 程 - 图4468使 用 V is u a l J + + 编 程 - 图4469D ra w S t re tc h T o 方 法 放 大 或 缩 小 图 像 以 适 应 特 定 的 矩 形 区 域 dra w T o 方法 放 大 图 像 以 适 合 特 定 的 区 域 但 如 果 对 目 标 区 域 来 讲 图 像 太 长

使 用 V is u a l J + + 编 程 - 图4470使 用 V is u a l J + + 编 程 - 图4471dra w T o 方 法 会 剪 切 图 像 另 外 两 种 方 法 都 支 持 绘 制 图 像 部 分 到 G ra ph ic

使 用 V is u a l J + + 编 程 - 图4472边 框 矩 形 的 指 定 部 分

使 用 V is u a l J + + 编 程 - 图4473使 用 V is u a l J + + 编 程 - 图4474使 用 V is u a l J + + 编 程 - 图4475使 用 V is u a l J + + 编 程 - 图4476使 用 V is u a l J + + 编 程 - 图4477使 用 V is u a l J + + 编 程 - 图4478不 能 直 接 调 用 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)

使 用 V is u a l J + + 编 程 - 图4479使 用 V is u a l J + + 编 程 - 图4480使 用 V is u a l J + + 编 程 - 图4481使 用 V is u a l J + + 编 程 - 图4482如 果 scale 参 数 是 真 则 放 大 或 缩 小 图 像 以 适 合 剪 切 矩 形 域 否 则 则剪 切 图 像

透 明 重 现 映 射

使 用 V is u a l J + + 编 程 - 图4483使 用 V is u a l J + + 编 程 - 图4484在 一 个 图 像 中 B itm a p 对 象 支 持 一 种 或 多 种 颜 色 的 透 明 重 现

使 用 V is u a l J + + 编 程 - 图4485如 果 需 要 以 透 明 的 方 式 重 现 单 一 的 颜 色 可 使 用 se t T ra ns pa re n t C o lo r 和

使 用 V is u a l J + + 编 程 - 图4486使 用 V is u a l J + + 编 程 - 图4487使 用 V is u a l J + + 编 程 - 图4488使 用 V is u a l J + + 编 程 - 图4489使 用 V is u a l J + + 编 程 - 图4490se 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 方 法 需 带 一 个 布尔 值 以 指 定 是 否 重 现 设 定 的 透 明 颜 色

使 用 V is u a l J + + 编 程 - 图4491使 用 V is u a l J + + 编 程 - 图4492例 如 以 下 代 码 段 指 定 黑 色 作 为 透 明 色 当 调 用 G ra ph ic 对 象 的

使 用 V is u a l J + + 编 程 - 图4493使 用 V is u a l J + + 编 程 - 图4494d 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));

}

使 用 V is u a l J + + 编 程 - 图4495使 用 V is u a l J + + 编 程 - 图4496使 用 V is u a l J + + 编 程 - 图4497使 用 V is u a l J + + 编 程 - 图4498使 用 V is u a l J + + 编 程 - 图4499使 用 V is u a l J + + 编 程 - 图4500使 用 V is u a l J + + 编 程 - 图4501使 用 V is u a l J + + 编 程 - 图4502也 可 以 根 据 位 屏 蔽 创 建 B itm a p 对 象 来 获 得 透 明 性 在 两 个 位 屏 蔽 中一 个 是 彩 色 另 一 个 是 单 色 在 彩 色 屏 蔽 中 透 明 绘 制 位 图 的 每 一 部 分都 应 为 黑 色 在 单 色 屏 蔽 中 透 明 绘 制 位 图 的 每 一 部 分 都 应 为 白 色

光 栅 操 作

使 用 V is u a l J + + 编 程 - 图4503使 用 V is u a l J + + 编 程 - 图4504使 用 V is u a l J + + 编 程 - 图4505使 用 V is u a l J + + 编 程 - 图4506使 用 V is u a l J + + 编 程 - 图4507使 用 V is u a l J + + 编 程 - 图4508使 用 V is u a l J + + 编 程 - 图4509光 栅 操 作 是 对 GD I 图 元 显 示 的 一 种 逻 辑 操 作 例 如 刷 子 笔 图 像 或形 状 以 获 得 可 视 效 果 能 够 使 用 G ra ph ic 对 象 执 行 的 光 栅 操 作 是 在R a s te r O p 对 象 中 定 义 的 当 检 查 G ra ph ic 对 象 支 持 的 这 种 方 法 时 会 发

使 用 V is u a l J + + 编 程 - 图4510使 用 V is u a l J + + 编 程 - 图4511现 每 一 个 基 础 操 作 如 画 线 或 图 像 显 示 等 这 些 方 法 都 带 有 一 个 R a s te r O p

使 用 V is u a l J + + 编 程 - 图4512作 为 参 数

使 用 V is u a l J + + 编 程 - 图4513使 用 V is u a l J + + 编 程 - 图4514使 用 V is u a l J + + 编 程 - 图4515使 用 V is u a l J + + 编 程 - 图4516使 用 V is u a l J + + 编 程 - 图4517在 最 简 单 的 情 形 中 G ra ph ic 对 象 的 绘 制 方 法 只 对 一 些 显 示 区 支 持 白 色或 拷 贝 的 像 素 重 写 最 近 显 示 的 内 容 添 加 光 栅 操 作 后 重 写 就 变 得 非常 复 杂

使 用 V is u a l J + + 编 程 - 图4518使 用 V is u a l J + + 编 程 - 图4519使 用 V is u a l J + + 编 程 - 图4520使 用 V is u a l J + + 编 程 - 图4521使 用 V is u a l J + + 编 程 - 图4522使 用 V is u a l J + + 编 程 - 图4523例 如 假 设 要 对 最 近 被 图 像 覆 盖 的 区 域 绘 制 一 个 黑 色 的 矩 形 框 但 想 逻辑 组 合 这 些 黑 色 像 素 使 之 与 目 标 图 像 中 的 像 素 对 应 并 对 结 果 进 行 显示 光 栅 操 作 可 以 实 现 这 些 组 合 操 作

使 用 V is u a l J + + 编 程 - 图4524使 用 V is u a l J + + 编 程 - 图4525使 用 V is u a l J + + 编 程 - 图4526使 用 V is u a l J + + 编 程 - 图4527使 用 V is u a l J + + 编 程 - 图4528使 用 V is u a l J + + 编 程 - 图4529在 逻 辑 上 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());

}

绘 制 形 状

使 用 V is u a l J + + 编 程 - 图4530使 用 V is u a l J + + 编 程 - 图4531使 用 V is u a l J + + 编 程 - 图4532使 用 V is u a l J + + 编 程 - 图4533使 用 V is u a l J + + 编 程 - 图4534G ra ph ic 对 象 支 持 绘 制 线 矩 形 弦 弧 线 弧 线 角 和 贝 塞 尔 Be z ie r 使 用 V is u a l J + + 编 程 - 图4535

使 用 V is u a l J + + 编 程 - 图4536样 条

直 线

使 用 V is u a l J + + 编 程 - 图4537使 用 V is u a l J + + 编 程 - 图4538使 用 V is u a l J + + 编 程 - 图4539使 用 V is u a l J + + 编 程 - 图4540使 用 V is u a l J + + 编 程 - 图4541使 用 V is u a l J + + 编 程 - 图4542使 用 V is u a l J + + 编 程 - 图4543使 用 V is u a l J + + 编 程 - 图4544使 用 V is u a l J + + 编 程 - 图4545使 用 V is u a l J + + 编 程 - 图4546使 用 V is u a l J + + 编 程 - 图4547使 用 V is u a l J + + 编 程 - 图4548直 线 是 显 示 器 上 一 组 高 亮 显 示 像 素 可 以 用 两 点 来 确 定 起 点 和 终 点在 W ind ow s 中 位 于 起 点 的 像 素 总 是 包 括 在 线 中 而 位 于 终 点 的 像 素总 是 排 除 在 外 的 这 些 线 有 时 被 称 为 包 括 - 排 除 in c lu s iv e -ex c lu s iv e 使 用 V is u a l J + + 编 程 - 图4549 使 用 V is u a l J + + 编 程 - 图4550 通 过 调 用 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 编 写 的 应 用 程 序 使 用 矩 形 指 定 屏 幕 上 或 窗 口 中 的

使 用 V is u a l J + + 编 程 - 图4551使 用 V is u a l J + + 编 程 - 图4552使 用 V is u a l J + + 编 程 - 图4553使 用 V is u a l J + + 编 程 - 图4554使 用 V is u a l J + + 编 程 - 图4555使 用 V is u a l J + + 编 程 - 图4556矩 形 区 域 使 用 矩 形 描 述 窗 口 的 客 户 区 屏 幕 的 重 绘 制 区 或 格 式 文 本 的显 示 区 也 可 以 使 用 矩 形 来 进 行 填 充 画 边 框 或 转 换 带 给 定 刷 子 的 部 分客 户 区 并 检 索 窗 口 坐 标 或 窗 口 客 户 区

使 用 V is u a l J + + 编 程 - 图4557使 用 V is u a l J + + 编 程 - 图4558使 用 V is u a l J + + 编 程 - 图4559使 用 V is u a l J + + 编 程 - 图4560使 用 V is u a l J + + 编 程 - 图4561使 用 V is u a l J + + 编 程 - 图4562矩 形 区 的 维 数 在 W F C R ec tan g le 对 象 中 描 述 这 个 对 象 由 描 述 矩 形 的 屏幕 位 置 和 维 数 的 X Y 高 度 和 宽 度 整 数 组 成 另 外 使 用 对 象 的 ge t R ig h t 和 g e t B o tto m 方 法 可 以 检 索 右 边 和 底 边 的 屏 幕 位 置

使 用 V is u a l J + + 编 程 - 图4563使 用 V is u a l J + + 编 程 - 图4564使 用 V is u a l J + + 编 程 - 图4565使 用 V is u a l J + + 编 程 - 图4566使 用 V is u a l J + + 编 程 - 图4567更 多 信 息 请 参 看 下 节 矩 形 操 作 和 矩 形 举 例

矩 形 操 作

使 用 V is u a l J + + 编 程 - 图4568使 用 V is u a l J + + 编 程 - 图4569使 用 V is u a l J + + 编 程 - 图4570R ec tan g le 对 象 提 供 了 许 多 使 用 矩 形 的 方 法 这 个 对 象 的 等 价 方 法 确 定是 否 有 两 个 R e gta n gle 对 象 是 一 样 的 — — 也 就 是 说 它 们 是 否 具 有 相 同的 坐 标

使 用 V is u a l J + + 编 程 - 图4571使 用 V is u a l J + + 编 程 - 图4572使 用 V is u a l J + + 编 程 - 图4573In f la teR ect 方 法 增 加 或 减 少 矩 形 的 宽 度 或 高 度 或 两 者 它 可 以 从 矩 形 的两 个 端 点 增 加 或 减 少 宽 度 也 可 以 从 矩 形 的 两 个 顶 部 和 底 部 增 加 或 减 少高 度

使 用 V is u a l J + + 编 程 - 图4574使 用 V is u a l J + + 编 程 - 图4575过 载 的 包 含 方 法 可 以 确 定 一 个 矩 形 描 述 的 区 域 是 否 存 在 于 另 一 个 矩 形 描述 的 区 域 中 或 确 定 矩 形 中 是 否 存 在 一 个 给 定 的 点

使 用 V is u a l J + + 编 程 - 图4576In te rs e c ts 和 in te rs e c ts W i th 方 法 确 定 了 两 个 R ec tan g le 对 象 的 相 交 结 果

矩 形 举 例

使 用 V is u a l J + + 编 程 - 图4577本 节 的 例 子 说 明 如 何 把 应 用 程 序 的 客 户 区 分 成 几 个 子 矩 形 以 及 在 这 些 区内 如 何 工 作

使 用 V is u a l J + + 编 程 - 图4578使 用 V is u a l J + + 编 程 - 图4579使 用 V is u a l J + + 编 程 - 图4580使 用 V is u a l J + + 编 程 - 图4581使 用 V is u a l J + + 编 程 - 图4582使 用 V is u a l J + + 编 程 - 图4583使 用 V is u a l J + + 编 程 - 图4584使 用 V is u a l J + + 编 程 - 图4585使 用 V is u a l J + + 编 程 - 图4586启 动 应 用 程 序 时 把 主 窗 体 的 客 户 区 分 成 16 16 的 子 区 并 在 这 些 矩形 区 中 以 指 定 的 颜 色 显 示 每 个 阴 影 为 修 改 显 示 的 矩 形 数 量 可 以 使用 D im e nsions 菜 单 项 来 显 示 一 个 对 话 框 在 对 话 框 中 可 以 指 定 显 示矩 形 的 新 数 量

使 用 V is u a l J + + 编 程 - 图4587使 用 V is u a l J + + 编 程 - 图4588使 用 V is u a l J + + 编 程 - 图4589使 用 V is u a l J + + 编 程 - 图4590使 用 V is u a l J + + 编 程 - 图4591使 用 V is u a l J + + 编 程 - 图4592下 例 中 给 出 了 把 屏 幕 划 分 成 几 个 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 ;

}

使 用 V is u a l J + + 编 程 - 图4593使 用 V is u a l J + + 编 程 - 图4594启 动 应 用 程 序 时 Fo rm 类 构 造 器 初 始 化 两 个 类 级 整 数 nA c ross

使 用 V is u a l J + + 编 程 - 图4595使 用 V is u a l J + + 编 程 - 图4596nD 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);

}

使 用 V is u a l J + + 编 程 - 图4597使 用 V is u a l J + + 编 程 - 图4598类 构 造 器 返 回 后 自 动 调 用 类 绘 制 事 件 处 理 程 序

使 用 V is u a l J + + 编 程 - 图4599事 件 处 理 程 序 通 过 类 级 rg R ec ts 数 组 循 环 执 行 使 用 G ra ph ic 对 象 的

使 用 V is u a l J + + 编 程 - 图4600使 用 V is u a l J + + 编 程 - 图4601se 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]);

}

}

使 用 V is u a l J + + 编 程 - 图4602使 用 V is u a l J + + 编 程 - 图4603使 用 V is u a l J + + 编 程 - 图4604最 后 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();

}

使 用 V is u a l J + + 编 程 - 图4605使 用 V is u a l J + + 编 程 - 图4606使 用 V is u a l J + + 编 程 - 图4607使 用 V is u a l J + + 编 程 - 图4608弦 是 椭 圆 和 直 线 段 使 用 V is u a l J + + 编 程 - 图4609 称 为 割 线 使 用 V is u a l J + + 编 程 - 图4610 的 交 点 界 限 内 的 区 域 我 们 可 以 使 用 当前 的 笔 来 画 弦 的 轮 廓 使 用 当 前 的 刷 子 来 填 充 在 割 线 的 一 边 剪 辑 部 分椭 圆

使 用 V is u a l J + + 编 程 - 图4611使 用 V is u a l J + + 编 程 - 图4612使 用 V is u a l J + + 编 程 - 图4613要 画 一 条 弦 可 以 使 用 G ra ph ic s 对 象 的 dra w C hord 方 法 语 法 如 下

使 用 V is u a l J + + 编 程 - 图4614使 用 V is u a l J + + 编 程 - 图4615使 用 V is u a l J + + 编 程 - 图4616dra w C h o rd R e c tan gle p1 po in t p2 po in t p3 使 用 V is u a l J + + 编 程 - 图4617

使 用 V is u a l J + + 编 程 - 图4618dra w C hord 方 法 的 R ec tan g le 参 数 指 定 了 绘 制 椭 圆 的 区 域 其 他 两 个 Po in t

使 用 V is u a l J + + 编 程 - 图4619参 数 指 定 了 割 线 与 椭 圆 的 两 个 交 点

使 用 V is u a l J + + 编 程 - 图4620下 例 是 对 dra w C hord 的 两 次 调 用 第 一 次 调 用 在 显 示 器 的 左 下 角 画 了 一

使 用 V is u a l J + + 编 程 - 图4621使 用 V is u a l J + + 编 程 - 图4622使 用 V is u a l J + + 编 程 - 图4623使 用 V is u a l J + + 编 程 - 图4624使 用 V is u a l J + + 编 程 - 图4625个 弦 第 二 次 调 用 在 右 上 角 画 了 一 个 弦 每 次 调 用 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));

}

使 用 V is u a l J + + 编 程 - 图4626使 用 V is u a l J + + 编 程 - 图4627使 用 V is u a l J + + 编 程 - 图4628使 用 V is u a l J + + 编 程 - 图4629使 用 V is u a l J + + 编 程 - 图4630通 过 调 用 dra w A rc 方 法 应 用 程 序 可 以 画 一 个 椭 圆 或 椭 圆 的 一 部 分 这种 方 法 可 以 在 不 可 视 矩 形 的 周 边 画 一 条 曲 线 称 之 为 边 框 矩 形 椭 圆 的尺 寸 可 以 通 过 从 矩 形 中 心 到 矩 形 两 边 放 大 的 两 个 可 视 半 径 来 指 定

使 用 V is u a l J + + 编 程 - 图4631使 用 V is u a l J + + 编 程 - 图4632调 用 dra w A rc 方 法 时 应 用 程 序 要 指 定 带 边 框 矩 形 的 坐 标 和 半 径

使 用 V is u a l J + + 编 程 - 图4633使 用 V is u a l J + + 编 程 - 图4634使 用 V is u a l J + + 编 程 - 图4635使 用 V is u a l J + + 编 程 - 图4636下 例 画 了 一 条 弧 填 充 了 窗 体 的 客 户 区 并 使 用 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 ));

}

弧 线 角

使 用 V is u a l J + + 编 程 - 图4637使 用 V is u a l J + + 编 程 - 图4638弧 线 角 类 似 于 弧 线 两 者 之 间 最 基 本 的 实 用 性 区 别 是 当 应 用 程 序 使 用

使 用 V is u a l J + + 编 程 - 图4639使 用 V is u a l J + + 编 程 - 图4640dra w A rc 画 一 个 弧 时 须 指 明 弧 线 径 向 的 X 和 Y 位 置

使 用 V is u a l J + + 编 程 - 图4641使 用 V is u a l J + + 编 程 - 图4642使 用 V is u a l J + + 编 程 - 图4643使 用 V is u a l J + + 编 程 - 图4644对 照 来 说 应 用 程 序 使 用 dra w A rc A n g le 方 法 画 一 个 弧 线 角 需 指 明 角的 度 数 方 法 本 身 需 要 照 管 画 线 始 点 和 终 点 的 坐 标 及 定 位

使 用 V is u a l J + + 编 程 - 图4645dra 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 )

使 用 V is u a l J + + 编 程 - 图4646使 用 V is u a l J + + 编 程 - 图4647使 用 V is u a l J + + 编 程 - 图4648使 用 V is u a l J + + 编 程 - 图4649Po in t 参 数 定 义 了 屏 幕 上 的 径 向 位 置 此 位 置 是 在 ra d ius 参 数 中 指 出 的S ta rtA n g le 指 明 了 起 始 的 度 数 e ndA n g le 参 数 指 出 了 从 S ta rtA n g le 开 始画 多 少 度 角

使 用 V is u a l J + + 编 程 - 图4650使 用 V is u a l J + + 编 程 - 图4651使 用 V is u a l J + + 编 程 - 图4652下 例 说 明 了 此 种 方 法 的 使 用 方 式 在 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);

}

使 用 V is u a l J + + 编 程 - 图4653贝 塞 尔 Be z ie r 使 用 V is u a l J + + 编 程 - 图4654 样 条

使 用 V is u a l J + + 编 程 - 图4655使 用 V is u a l J + + 编 程 - 图4656使 用 V is u a l J + + 编 程 - 图4657使 用 V is u a l J + + 编 程 - 图4658使 用 V is u a l J + + 编 程 - 图4659用 四 点 可 确 定 一 个 Be z ie r 样 条 包 括 两 个 端 点 和 两 个 控 制 点 这 些 点组 合 在 一 起 定 义 一 个 曲 线 两 个 端 点 定 义 曲 线 的 开 始 和 结 束 控 制 点 把曲 线 拉 离 由 始 点 和 终 点 形 成 的 线 段

使 用 V is u a l J + + 编 程 - 图4660使 用 V is u a l J + + 编 程 - 图4661使 用 V is u a l J + + 编 程 - 图4662使 用 V is u a l J + + 编 程 - 图4663使 用 V is u a l J + + 编 程 - 图4664为 绘 制 Be z ie r 样 条 需 使 用 d raw B e z ier 曲 线 方 法 这 种 方 法 需 要 一 个 Po in t 对 象 数 组 作 为 参 数 数 组 中 的 四 个 元 素 定 义 了 样 条 的 始 点 两 个 控 制 点和 终 点

使 用 V is u a l J + + 编 程 - 图4665使 用 V is u a l J + + 编 程 - 图4666使 用 V is u a l J + + 编 程 - 图4667使 用 V is u a l J + + 编 程 - 图4668使 用 V is u a l J + + 编 程 - 图4669要 绘 制 多 个 样 条 每 个 样 条 在 第 一 个 元 素 之 后 包 括 三 个 数 组 元 素 第一 个 样 条 的 终 点 作 为 下 一 个 的 始 点 三 个 数 组 元 素 定 义 了 控 制 点 和 终点

使 用 V is u a l J + + 编 程 - 图4670使 用 V is u a l J + + 编 程 - 图4671下 面 的 代 码 使 用 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 控 件

使 用 V is u a l J + + 编 程 - 图4672使 用 V is u a l J + + 编 程 - 图4673使 用 V is u a l J + + 编 程 - 图4674使 用 V is u a l J + + 编 程 - 图4675使 用 V is u a l J + + 编 程 - 图4676使 用 V is u a l J + + 编 程 - 图4677使 用 V is u a l J + + 编 程 - 图4678使 用 V is u a l J + + 编 程 - 图4679使 用 V is u a l J + + 编 程 - 图4680使 用 V is u a l J + + 编 程 - 图4681使 用 V is u a l J + + 编 程 - 图4682使 用 V is u a l J + + 编 程 - 图4683使 用 V is u a l J + + 编 程 - 图4684使 用 V is u a l J + + 编 程 - 图4685使 用 V is u a l J + + 编 程 - 图4686Ac t iv e X 技 术 的 基 础 是 组 件 对 象 模 型 CO M 使 用 V is u a l J + + 编 程 - 图4687 另 外 为 创 建 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 + + 编 程 - 图4688 可 以 使 用 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 应 用 程 序

使 用 V is u a l J + + 编 程 - 图4689使 用 V is u a l J + + 编 程 - 图4690在 本 章 中 将 学 到

  • 使 用 V is u a l J + + 编 程 - 图4691如 何 从 现 有 W F C 组 件 建 立 Ac t iv e X 控 件

  • 使 用 V is u a l J + + 编 程 - 图4692如 何 把 Ac t iv e X 控 件 导 入 W F C 应 用 程 序

建 立 A c tiv e X 控 件

使 用 V is u a l J + + 编 程 - 图4693使 用 V is u a l J + + 编 程 - 图4694使 用 V is u a l J + + 编 程 - 图4695使 用 V is u a l J + + 编 程 - 图4696使 用 V is u a l J + + 编 程 - 图4697使 用 V is u a l J + + 编 程 - 图4698使 用 V is u a l J + + 编 程 - 图4699使 用 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

使 用 V is u a l J + + 编 程 - 图4700使 用 V is u a l J + + 编 程 - 图4701使 用 V is u a l J + + 编 程 - 图4702并 在 注 册 表 中 注 册 它 为 Ac t iv e X 控 件 一 旦 注 册 了 控 件 为 A c t iv e X 控 件就 可 以 从 Ac t iv e X 客 户 访 问 它

使 用 V is u a l J + + 编 程 - 图4703使 用 V is u a l J + + 编 程 - 图4704使 用 V is u a l J + + 编 程 - 图4705使 用 V is u a l J + + 编 程 - 图4706使 用 V is u a l J + + 编 程 - 图4707使 用 V is u a l J + + 编 程 - 图4708使 用 V is u a l J + + 编 程 - 图4709使 用 V is u a l J + + 编 程 - 图4710在 本 方 案 中 可 以 使 用 第 1 章 创 建 控 件 中 说 明 的 控 件 如 果 没 有 创建 它 则 建 立 本 节 中 说 明 的 控 件 然 后 继 续 这 个 过 程 你 将 学 到

  • 使 用 V is u a l J + + 编 程 - 图4711如 何 公 布 W F C 控 件 作 为 CO M 对 象

  • 使 用 V is u a l J + + 编 程 - 图4712如 何 通 过 其 他 应 用 程 序 打 包 控 件 到 CO M D L L

  • 使 用 V is u a l J + + 编 程 - 图4713如 何 注 册 CO M D L L 作 为 Ac t iv e X 控 件

  • 使 用 V is u a l J + + 编 程 - 图4714如 何 导 入 基 于 W F C 的 Ac t iv e X 控 件 到 V isu a l B a s ic

使 用 V is u a l J + + 编 程 - 图4715使 用 V is u a l J + + 编 程 - 图4716注 意 下 面 的 过 程 假 设 在 Visual J++ 中 已 存 在 一 个 打 开 的 WFC 组件 项 目

定 义 W F C 控 件 作 为 CO M 对 象

使 用 V is u a l J + + 编 程 - 图4717使 用 V is u a l J + + 编 程 - 图4718使 用 V is u a l J + + 编 程 - 图4719使 用 V is u a l J + + 编 程 - 图4720使 用 V is u a l J + + 编 程 - 图4721为 了 从 其 他 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 注 释 的 方 法

使 用 V is u a l J + + 编 程 - 图4722使 用 V is u a l J + + 编 程 - 图4723使 用 V is u a l J + + 编 程 - 图4724使 用 V is u a l J + + 编 程 - 图4725使 用 V is u a l J + + 编 程 - 图4726注 意 如 果 已 使 用 Control 模 板 创 建 了 控 件 的 项 目 则 控 件 已 经 包含 了 一 个 注 释 标 记 来 注 册 它 作 为 C O M 对 象 删 除 前 斜 杠 使 用 V is u a l J + + 编 程 - 图4727 // 使 用 V is u a l J + + 编 程 - 图4728 来启 用 注 释 标 记

定 义 W F C 组 件 作 为 CO M 对 象

  1. 使 用 V is u a l J + + 编 程 - 图4729使 用 V is u a l J + + 编 程 - 图4730在 P ro ject 菜 单 上 单 击 < P ro je c t> P rope rtie s 这 里 的 < P ro je c t> 是 控 件

使 用 V is u a l J + + 编 程 - 图4731项 目 名 使 用 V is u a l J + + 编 程 - 图4732

  1. 使 用 V is u a l J + + 编 程 - 图4733使 用 V is u a l J + + 编 程 - 图4734在 < P ro je c t> P rope rtie s 对 话 框 中 单 击 CO M C la ss 标 记

  2. 使 用 V is u a l J + + 编 程 - 图4735使 用 V is u a l J + + 编 程 - 图4736在 类 列 表 中 选 择 控 件 的 类

  3. 使 用 V is u a l J + + 编 程 - 图4737单 击 O p t ions 按 钮

  4. 使 用 V is u a l J + + 编 程 - 图4738使 用 V is u a l J + + 编 程 - 图4739使 用 V is u a l J + + 编 程 - 图4740使 用 V is u a l J + + 编 程 - 图4741使 用 V is u a l J + + 编 程 - 图4742使 用 V is u a l J + + 编 程 - 图4743使 用 V is u a l J + + 编 程 - 图4744可 选 在 T ype L ibra r y O p t ions 对 话 框 中 改 变 创 建 的 类 型 库 文 件 的 名字 来 定 义 与 控 件 库 名 控 件 名 的 接 口 作 为 开 发 环 境 和 帮 助 文 件的 信 息 来 显 示 然 后 单 击 O K

  5. 使 用 V is u a l J + + 编 程 - 图4745使 用 V is u a l J + + 编 程 - 图4746在 < P ro je c t> P rope rtie s 对 话 框 中 单 击 OK

使 用 V is u a l J + + 编 程 - 图4747V isu a l J + + 在 控 件 类 定 义 的 上 端 添 加 了 一 个 注 释 标 记 来 注 册 此 类 为

使 用 V is u a l J + + 编 程 - 图4748CO M 对 象

使 用 V is u a l J + + 编 程 - 图4749使 用 V is u a l J + + 编 程 - 图4750使 用 V is u a l J + + 编 程 - 图4751使 用 V is u a l J + + 编 程 - 图4752使 用 V is u a l J + + 编 程 - 图4753使 用 V is u a l J + + 编 程 - 图4754使 用 V is u a l J + + 编 程 - 图4755使 用 V is u a l J + + 编 程 - 图4756使 用 V is u a l J + + 编 程 - 图4757注 意 如 果 不 需 要 定 义 多 个 类 作 为 C O M 类 可 以 在 Class Properties 对 话 框 中 定 义 一 个 C O M 类 为 显 示 Class Prop erties 对 话 框 在Class Outline 中 右 击 类 名 然 后 单 击 Class Properties 在 Class Properties 对 话 框 中 选 择 COM Class 复 选 框

在 CO M D L L 中 打 包 控 件

使 用 V is u a l J + + 编 程 - 图4758使 用 V is u a l J + + 编 程 - 图4759使 用 V is u a l J + + 编 程 - 图4760使 用 V is u a l J + + 编 程 - 图4761使 用 V is u a l J + + 编 程 - 图4762使 用 V is u a l J + + 编 程 - 图4763定 义 了 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 客 户 使 用 的 接 口 来 访 问 控 件 及 其 成员

使 用 V is u a l J + + 编 程 - 图4764使 用 V is u a l J + + 编 程 - 图4765使 用 V is u a l J + + 编 程 - 图4766使 用 V is u a l J + + 编 程 - 图4767注 意 为 了 在 Internet 上 发 布 ActiveX 控 件 可 以 在 C A B 文 件 中打 包 控 件 而 不 是 在 COM DLL 中

建 立 控 件 作 为 CO M D L L

  1. 使 用 V is u a l J + + 编 程 - 图4768使 用 V is u a l J + + 编 程 - 图4769使 用 V is u a l J + + 编 程 - 图4770在 P ro ject 菜 单 上 单 击 < P ro je c t> P rope rtie s 这 里 < P ro je c t> 是 指 控 件项 目 名 使 用 V is u a l J + + 编 程 - 图4771

  2. 使 用 V is u a l J + + 编 程 - 图4772在 < P ro je c t> P rope rtie s 对 话 框 中 单 击 O u tput F o rm a t 选 项 卡

  3. 使 用 V is u a l J + + 编 程 - 图4773选 择 E n ab le P a c k ag in g 复 选 框

  4. 使 用 V is u a l J + + 编 程 - 图4774选 项 卡 上 的 其 他 控 件 都 是 启 用 的

  5. 使 用 V is u a l J + + 编 程 - 图4775使 用 V is u a l J + + 编 程 - 图4776在 P ack ag in g ty p e 下 拉 列 表 中 选 择 CO M D L L

  6. 使 用 V is u a l J + + 编 程 - 图4777使 用 V is u a l J + + 编 程 - 图4778使 用 V is u a l J + + 编 程 - 图4779在 F ile n a m e 框 中 键 入 CO M D L L 的 名 字 默 认 名 是 使 用 项 目 名 创建 的 使 用 V is u a l J + + 编 程 - 图4780

  7. 使 用 V is u a l J + + 编 程 - 图4781在 关 联 的 下 拉 列 表 中 选 择 ou tpu ts of type 和 J a v a C lass e s & R eso u rces

使 用 V is u a l J + + 编 程 - 图4782选 项

  1. 使 用 V is u a l J + + 编 程 - 图4783单 击 O K

建 立 项 目

使 用 V is u a l J + + 编 程 - 图4784使 用 V is u a l J + + 编 程 - 图4785使 用 V is u a l J + + 编 程 - 图4786使 用 V is u a l J + + 编 程 - 图4787使 用 V is u a l J + + 编 程 - 图4788使 用 V is u a l J + + 编 程 - 图4789使 用 V is u a l J + + 编 程 - 图4790使 用 V is u a l J + + 编 程 - 图4791使 用 V is u a l J + + 编 程 - 图4792为 项 目 配 置 了 打 包 选 项 后 需 要 建 立 项 目 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 中

建 立 项 目

  • 使 用 V is u a l J + + 编 程 - 图4793使 用 V is u a l J + + 编 程 - 图4794在 Bu i ld 菜 单 上 单 击 Bu i ld

注 册 CO M D L L

  • 使 用 V is u a l J + + 编 程 - 图4795使 用 V is u a l J + + 编 程 - 图4796使 用 V is u a l J + + 编 程 - 图4797使 用 V is u a l J + + 编 程 - 图4798使 用 V is u a l J + + 编 程 - 图4799使 用 V is u a l J + + 编 程 - 图4800使 用 V is u a l J + + 编 程 - 图4801使 用 V is u a l J + + 编 程 - 图4802旦 注 册 了 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

控 件

使 用 V is u a l J + + 编 程 - 图4803

注 册 CO M D L L

  1. 使 用 V is u a l J + + 编 程 - 图4804使 用 V is u a l J + + 编 程 - 图4805单 击 S ta r t 按 钮 然 后 单 击 Ru n

  2. 使 用 V is u a l J + + 编 程 - 图4806在 O p e n 框 中 键 入

R e gsvr 3 2 . e x e < D L L 路 径 和 文 件 名 >

使 用 V is u a l J + + 编 程 - 图4807使 用 V is u a l J + + 编 程 - 图4808使 用 V is u a l J + + 编 程 - 图4809这 里 的 <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

  1. 使 用 V is u a l J + + 编 程 - 图4810单 击 O K

使 用 V is u a l J + + 编 程 - 图4811使 用 V is u a l J + + 编 程 - 图4812使 用 V is u a l J + + 编 程 - 图4813如 果 收 到 注 册 失 败 的 信 息 请 确 认 控 件 的 D L L 的 路 径 是 否 正 确 文件 是 否 存 在

测 试 M ic ros o f t V is ual B a s ic 中 的 控 件

使 用 V is u a l J + + 编 程 - 图4814使 用 V is u a l J + + 编 程 - 图4815使 用 V is u a l J + + 编 程 - 图4816使 用 V is u a l J + + 编 程 - 图4817使 用 V is u a l J + + 编 程 - 图4818为 了 测 试 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 控 件

  1. 使 用 V is u a l J + + 编 程 - 图4819运 行 V isu a l B a s ic

  2. 使 用 V is u a l J + + 编 程 - 图4820使 用 V is u a l J + + 编 程 - 图4821在 V isu a l B a s ic 中 的 F ile 菜 单 上 单 击 N e w P ro je c t

  3. 使 用 V is u a l J + + 编 程 - 图4822使 用 V is u a l J + + 编 程 - 图4823使 用 V is u a l J + + 编 程 - 图4824在 N e w P ro je c t 对 话 框 中 单 击 S ta n d a rd EX E 图 标 然 后 单 击 OK

  4. 使 用 V is u a l J + + 编 程 - 图4825使 用 V is u a l J + + 编 程 - 图4826右 击 工 具 箱 然 后 单 击 C o m pone n ts

  5. 使 用 V is u a l J + + 编 程 - 图4827使 用 V is u a l J + + 编 程 - 图4828使 用 V is u a l J + + 编 程 - 图4829在 C o m pone n ts 对 话 框 中 选 择 控 件 然 后 单 击 OK

使 用 V is u a l J + + 编 程 - 图4830使 用 V is u a l J + + 编 程 - 图4831对 本 方 案 选 择 P ro je c t 1 控 件

  1. 使 用 V is u a l J + + 编 程 - 图4832使 用 V is u a l J + + 编 程 - 图4833使 用 V is u a l J + + 编 程 - 图4834使 用 V is u a l J + + 编 程 - 图4835

    工 具 箱 中 双 击 控 件 以 在 窗 体 中 添 加 它控 件 添 加 到 窗 体 中 心

  2. 使 用 V is u a l J + + 编 程 - 图4836使 用 V is u a l J + + 编 程 - 图4837按 F5 运 行 项 目

使 用 V is u a l J + + 编 程 - 图4838则 显 示 了 带 控 件 的 窗 体

使 用 V is u a l J + + 编 程 - 图4839使 用 V is u a l J + + 编 程 - 图4840使 用 V is u a l J + + 编 程 - 图4841使 用 V is u a l J + + 编 程 - 图4842使 用 V is u a l J + + 编 程 - 图4843如 果 使 用 在 第 1 章 创 建 控 件 一 节 说 明 的 控 件 则 可 以 滚 动 水 平 滚 动条 控 件 中 的 文 本 随 着 滚 动 条 的 变 化 而 变 化

使 用 V is u a l J + + 编 程 - 图4844使 用 V is u a l J + + 编 程 - 图4845使 用 V is u a l J + + 编 程 - 图4846使 用 V is u a l J + + 编 程 - 图4847关 于 在 W F C 应 用 程 序 中 导 入 Ac t iv e X 控 件 的 信 息 请 参 看 下 一 节 导入 Ac t iv e X 控 件

导 入 A c tiv e X 控 件

使 用 V is u a l J + + 编 程 - 图4848使 用 V is u a l J + + 编 程 - 图4849使 用 V is u a l J + + 编 程 - 图4850使 用 V is u a l J + + 编 程 - 图4851使 用 V is u a l J + + 编 程 - 图4852使 用 V is u a l J + + 编 程 - 图4853使 用 V is u a l J + + 编 程 - 图4854使 用 V is u a l J + + 编 程 - 图4855Ac t iv e X 控 件 可 以 对 W F C 应 用 程 序 提 供 许 多 增 强 功 能 许 多 第 三 方Ac t iv e X 控 件 可 用 于 添 加 功 能 诸 如 定 制 按 钮 的 形 状 电 话 学 技 术 图标 绘 制 图 形 和 电 子 表 格 可 以 使 用 V isu a l J + + 中 导 入 Ac t iv e X 控 件其 过 程 与 导 入 CO M 对 象 类 似

使 用 V is u a l J + + 编 程 - 图4856使 用 V is u a l J + + 编 程 - 图4857使 用 V is u a l J + + 编 程 - 图4858在 本 方 案 中 将 导 入 用 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 控 件 将 学 到

  • 使 用 V is u a l J + + 编 程 - 图4859如 何 在 系 统 注 册 表 中 注 册 Ac t iv e X 控 件

  • 使 用 V is u a l J + + 编 程 - 图4860使 用 V is u a l J + + 编 程 - 图4861导 入 Ac t iv e X 控 件 时 如 何 创 建 项 目

  • 使 用 V is u a l J + + 编 程 - 图4862如 何 把 Ac t iv e X 控 件 导 入 到 项 目 中

  • 使 用 V is u a l J + + 编 程 - 图4863如 何 为 窗 体 添 加 Ac t iv e X 控 件 并 设 置 其 属 性

  • 使 用 V is u a l J + + 编 程 - 图4864如 何 建 立 和 运 行 项 目 来 测 试 Ac t iv e X 控 件

注 册 控 件

使 用 V is u a l J + + 编 程 - 图4865使 用 V is u a l J + + 编 程 - 图4866为 了 使 Ac t iv e X 控 件 对 V isu a l J + + 可 用 必 须 在 系 统 注 册 表 中 注 册 此 控件

使 用 V is u a l J + + 编 程 - 图4867使 用 V is u a l J + + 编 程 - 图4868使 用 V is u a l J + + 编 程 - 图4869使 用 V is u a l J + + 编 程 - 图4870注 意 本 方 案 中 由 于 在 安 装 Internet Explorer 时 已 注 册 了ActiveMovi e 控 件 所 以 不 需 要 再 注 册

注 册 A c tiv e X 控 件

  1. 使 用 V is u a l J + + 编 程 - 图4871使 用 V is u a l J + + 编 程 - 图4872单 击 S ta r t 按 钮 然 后 单 击 Ru n

  2. 使 用 V is u a l J + + 编 程 - 图4873使 用 V is u a l J + + 编 程 - 图4874在 O p e n 框 中 键 入

R egsvr 3 2 . ex e< C o ntro l 路径 和文 件名 >

使 用 V is u a l J + + 编 程 - 图4875使 用 V is u a l J + + 编 程 - 图4876使 用 V is u a l J + + 编 程 - 图4877这 里 的 < C on tro l 路 径 和 文 件 名 > 是 指 控 件 的 路 径 和 文 件 名 本 方 案中 键 入

使 用 V is u a l J + + 编 程 - 图4878R egsvr 3 2 c : \W in do w s \s ys te m \ A M O V IE .O C X

  1. 使 用 V is u a l J + + 编 程 - 图4879单 击 O K

使 用 V is u a l J + + 编 程 - 图4880使 用 V is u a l J + + 编 程 - 图4881使 用 V is u a l J + + 编 程 - 图4882如 果 收 到 注 册 失 败 的 信 息 请 确 认 控 件 的 路 径 是 否 正 确 文 件 是 否 存在

创 建 W F C 项 目

使 用 V is u a l J + + 编 程 - 图4883使 用 V is u a l J + + 编 程 - 图4884使 用 V is u a l J + + 编 程 - 图4885使 用 V is u a l J + + 编 程 - 图4886使 用 V is u a l J + + 编 程 - 图4887使 用 V is u a l J + + 编 程 - 图4888当 导 入 Ac t iv e X 控 件 时 V isu a l J + + 在 项 目 中 创 建 软 件 包 目 录 并 在 这些 软 件 包 目 录 中 添 加 类 封 装 器 w ra ppe r 使 用 V is u a l J + + 编 程 - 图4889 来 访 问 Ac t iv e X 控 件 因 此必 须 有 有 效 的 项 目 来 导 入 Ac t iv e X 控 件

创 建 W F C 控 件

  1. 使 用 V is u a l J + + 编 程 - 图4890使 用 V is u a l J + + 编 程 - 图4891在 F ile 菜 单 上 单 击 N e w P ro je c t

  2. 使 用 V is u a l J + + 编 程 - 图4892使 用 V is u a l J + + 编 程 - 图4893使 用 V is u a l J + + 编 程 - 图4894在 N e w 选 项 卡 上 展 开 V isu a l J + + P ro je c t 文 件 夹 单 击 A pp lic a tions

使 用 V is u a l J + + 编 程 - 图4895然 后 单 击 W ind ow s A pp lic a t ions 图 标

  1. 使 用 V is u a l J + + 编 程 - 图4896使 用 V is u a l J + + 编 程 - 图4897在 N a m e 框 中 键 入 项 目 名

  2. 使 用 V is u a l J + + 编 程 - 图4898使 用 V is u a l J + + 编 程 - 图4899使 用 V is u a l J + + 编 程 - 图4900在 L o c a tio n 框 中 键 入 要 保 存 项 目 的 路 径 或 单 击 B ro w s e 来 导 入 文件 夹

  3. 使 用 V is u a l J + + 编 程 - 图4901单 击 O p e n

使 用 V is u a l J + + 编 程 - 图4902使 用 V is u a l J + + 编 程 - 图4903使 用 V is u a l J + + 编 程 - 图4904使 用 V is u a l J + + 编 程 - 图4905使 用 V is u a l J + + 编 程 - 图4906则 在 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

  1. 使 用 V is u a l J + + 编 程 - 图4907使 用 V is u a l J + + 编 程 - 图4908.在 P ro ject E x p lo rer 中 展 开 项 目 节 点

使 用 V is u a l J + + 编 程 - 图4909添 加 到 项 目 中 的 文 件 具 有 默 认 名 Fo rm 1 . J a v a

  1. 使 用 V is u a l J + + 编 程 - 图4910使 用 V is u a l J + + 编 程 - 图4911使 用 V is u a l J + + 编 程 - 图4912

    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 控 件

使 用 V is u a l J + + 编 程 - 图4913使 用 V is u a l J + + 编 程 - 图4914使 用 V is u a l J + + 编 程 - 图4915使 用 V is u a l J + + 编 程 - 图4916创 建 了 项 目 之 后 就 可 以 在 项 目 中 导 入 Ac t iv e X 控 件 使 用 Cu s to m iz e T oo lbox 对 话 框 从 系 统 中 安 装 的 Ac t iv e X 控 件 表 中 选 择 A c tiv e X 控 件

使 用 V is u a l J + + 编 程 - 图4917使 用 V is u a l J + + 编 程 - 图4918使 用 V is u a l J + + 编 程 - 图4919使 用 V is u a l J + + 编 程 - 图4920使 用 V is u a l J + + 编 程 - 图4921注 意 一 旦 对 某 个 工 具 箱 添 加 了 ActiveX 控 件 则 控 件 会 一 直 保 留在 工 具 箱 中 其 他 所 有 项 目 都 可 以 使 用 直 到 删 除 它 为 止

导 入 A c tiv e X 控 件

  1. 使 用 V is u a l J + + 编 程 - 图4922使 用 V is u a l J + + 编 程 - 图4923在 工 具 箱 中 单 击 Ge n e ra l 选 项 卡使 用 V is u a l J + + 编 程 - 图4924 如 果 工 具 箱 没 有 出 现 则 单 击 V ie w

使 用 V is u a l J + + 编 程 - 图4925菜 单 上 的 T oo lbox 使 用 V is u a l J + + 编 程 - 图4926

  1. 使 用 V is u a l J + + 编 程 - 图4927使 用 V is u a l J + + 编 程 - 图4928右 击 工 具 箱 然 后 单 击 C u s tom iz e T o o lbox

  2. 使 用 V is u a l J + + 编 程 - 图4929使 用 V is u a l J + + 编 程 - 图4930在 C u s tom iz e T o o lbox 对 话 框 中 单 击 A c tiv e X C o n t ro ls 选 项 卡

  3. 使 用 V is u a l J + + 编 程 - 图4931使 用 V is u a l J + + 编 程 - 图4932使 用 V is u a l J + + 编 程 - 图4933使 用 V is u a l J + + 编 程 - 图4934使 用 V is u a l J + + 编 程 - 图4935

    Ac t iv e X 控 件 列 表 中 选 择 要 导 入 的 控 件 也 可 以 选 择 多 个 控 件对 本 方 案 选 择 A c t iv e M o v ie C on tro l O b je c t

  4. 使 用 V is u a l J + + 编 程 - 图4936单 击 O K

使 用 V is u a l J + + 编 程 - 图4937把 选 择 的 控 件 添 加 到 工 具 箱

为 窗 体 添 加 控 件

使 用 V is u a l J + + 编 程 - 图4938使 用 V is u a l J + + 编 程 - 图4939使 用 V is u a l J + + 编 程 - 图4940使 用 V is u a l J + + 编 程 - 图4941使 用 V is u a l J + + 编 程 - 图4942使 用 V is u a l J + + 编 程 - 图4943使 用 V is u a l J + + 编 程 - 图4944使 用 V is u a l J + + 编 程 - 图4945使 用 V is u a l J + + 编 程 - 图4946当 对 窗 体 添 加 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 + + 将 对 文 件中 的 所 有 控 件 提 供 类 封 装 器 但 只 把 指 定 的 控 件 添 加 到 工 具 箱

为 窗 体 添 加 控 件

  • 使 用 V is u a l J + + 编 程 - 图4947使 用 V is u a l J + + 编 程 - 图4948在 Fo rm D e s ig n e r 中 显 示 使 用 的 窗 体 双 击 要 添 加 的 控 件

使 用 V is u a l J + + 编 程 - 图4949使 用 V is u a l J + + 编 程 - 图4950使 用 V is u a l J + + 编 程 - 图4951在 本 方 案 中 双 击 A c t ive X M o vie 控 件 此 控 件 添 加 到 窗 体 的 中 央

设 置 控 件 的 属 性

使 用 V is u a l J + + 编 程 - 图4952使 用 V is u a l J + + 编 程 - 图4953使 用 V is u a l J + + 编 程 - 图4954为 窗 体 添 加 了 Ac t iv e X 控 件 后 就 可 以 使 用 P ro p e rtie s 窗 口 来 设 置 属 性创 建 事 件 处 理 程 序

为 A c tiv e X M o v ie 控 件 设 置 属 性

  1. 使 用 V is u a l J + + 编 程 - 图4955使 用 V is u a l J + + 编 程 - 图4956在 Fo rm D e s ig n e r 中 选 择 A c tiv e X M o v ie 控 件

  2. 使 用 V is u a l J + + 编 程 - 图4957使 用 V is u a l J + + 编 程 - 图4958在 P rope r t ie s 窗 口 中 选 择 file n a m e 属 性

  3. 使 用 V is u a l J + + 编 程 - 图4959使 用 V is u a l J + + 编 程 - 图4960

    入 .a v i 文 件 的 路 径 和 文 件 名 以 在 控 件 中 显 示或

使 用 V is u a l J + + 编 程 - 图4961使 用 V is u a l J + + 编 程 - 图4962使 用 V is u a l J + + 编 程 - 图4963单 击 file n a m e 属 性 值 部 分 的 省 略 号 按 钮 显 示 对 话 框 浏 览 计 算 机 中的 文 件

建 立 项 目

使 用 V is u a l J + + 编 程 - 图4964使 用 V is u a l J + + 编 程 - 图4965使 用 V is u a l J + + 编 程 - 图4966使 用 V is u a l J + + 编 程 - 图4967对 窗 体 添 加 了 Ac t iv e X 控 件 并 设 置 了 其 属 性 之 后 就 可 以 建 立 并 运 行此 项 目 来 测 试 控 件 的 函 数 性

创 建 并 运 行 窗 体

  1. 使 用 V is u a l J + + 编 程 - 图4968使 用 V is u a l J + + 编 程 - 图4969在 Bu i ld 菜 单 上 单 击 Bu i ld

使 用 V is u a l J + + 编 程 - 图4970使 用 V is u a l J + + 编 程 - 图4971如 果 收 到 编 译 错 误 的 信 息 请 改 正 错 误 后 重 新 建 立 项 目

  1. 使 用 V is u a l J + + 编 程 - 图4972使 用 V is u a l J + + 编 程 - 图4973使 用 V is u a l J + + 编 程 - 图4974为 运 行 窗 体 在 D e bug 菜 单 上 单 击 S ta r t

  2. 使 用 V is u a l J + + 编 程 - 图4975使 用 V is u a l J + + 编 程 - 图4976使 用 V is u a l J + + 编 程 - 图4977

    示 窗 体 时 单 击 控 件 上 的 播 放 按 钮 这 就 显 示 了 file n a m e 属 性 中 指 定 的 影 片

第 17 章 建 立 和 导 入 C O M 对 象

使 用 V is u a l J + + 编 程 - 图4978使 用 V is u a l J + + 编 程 - 图4979使 用 V is u a l J + + 编 程 - 图4980使 用 V is u a l J + + 编 程 - 图4981使 用 V is u a l J + + 编 程 - 图4982使 用 V is u a l J + + 编 程 - 图4983使 用 V is u a l J + + 编 程 - 图4984使 用 V is u a l J + + 编 程 - 图4985使 用 V is u a l J + + 编 程 - 图4986使 用 V is u a l J + + 编 程 - 图4987组 件 对 象 模 型 CO M 使 用 V is u a l J + + 编 程 - 图4988 是 面 向 对 象 的 体 系 结 构 用 于 创 建 可 从 应 用 程序 之 间 重 用 的 对 象 也 可 以 使 用 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 is u a l J + + 编 程 - 图4989使 用 V is u a l J + + 编 程 - 图4990使 用 V is u a l J + + 编 程 - 图4991使 用 V is u a l J + + 编 程 - 图4992使 用 V is u a l J + + 编 程 - 图4993使 用 V is u a l J + + 编 程 - 图4994使 用 V is u a l J + + 编 程 - 图4995使 用 V is u a l J + + 编 程 - 图4996使 用 V is u a l J + + 编 程 - 图4997使 用 V is u a l J + + 编 程 - 图4998使 用 V is u a l J + + 编 程 - 图4999使 用 V is u a l J + + 编 程 - 图5000使 用 V is u a l J + + 编 程 - 图5001使 用 V is u a l J + + 编 程 - 图5002V 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 使 用 V is u a l J + + 编 程 - 图5003 应 用程 序 中 提 供 附 加 的 特 征 例 如 可 以 使 用 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 在 应 用 程 序 的 开 发 中 可 以提 供 可 重 用 的 代 码 在 本 章 中 将 学 到

  • 使 用 V is u a l J + + 编 程 - 图5004如 何 建 立 CO M 对 象

  • 使 用 V is u a l J + + 编 程 - 图5005如 何 导 入 现 有 CO M 对 象 到 W F C 应 用 程 序 中

建 立 CO M 对 象

使 用 V is u a l J + + 编 程 - 图5006使 用 V is u a l J + + 编 程 - 图5007使 用 V is u a l J + + 编 程 - 图5008使 用 V is u a l J + + 编 程 - 图5009使 用 V is u a l J + + 编 程 - 图5010使 用 V is u a l J + + 编 程 - 图5011使 用 V is u a l J + + 编 程 - 图5012使 用 V is u a l J + + 编 程 - 图5013使 用 V is u a l J + + 编 程 - 图5014使 用 V is u a l J + + 编 程 - 图5015使 用 V is u a l J + + 编 程 - 图5016使 用 V is u a l J + + 编 程 - 图5017V 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 的 程 序 中 访 问 它 们

使 用 V is u a l J + + 编 程 - 图5018使 用 V is u a l J + + 编 程 - 图5019使 用 V is u a l J + + 编 程 - 图5020使 用 V is u a l J + + 编 程 - 图5021使 用 V is u a l J + + 编 程 - 图5022使 用 V is u a l J + + 编 程 - 图5023在 本 方 案 中 要 建 立 CO M 对 象 在 CO M D L L 中 打 包 给 出 相 关 的 活动 统 计 函 数 性 在 此 将 学 到

  • 使 用 V is u a l J + + 编 程 - 图5024创 建 具 有 作 为 CO M 对 象 给 出 的 类 的 项 目

  • 使 用 V is u a l J + + 编 程 - 图5025使 用 V is u a l J + + 编 程 - 图5026在 P ro je c t P rope r tie s 对 话 框 中 使 用 CO M C la s se s 选 项 卡 来 选 择 在 项目 给 出 的 作 为 CO M 对 象 的 类

  • 使 用 V is u a l J + + 编 程 - 图5027使 用 V is u a l J + + 编 程 - 图5028为 使 用 其 他 编 程 语 言 和 应 用 程 序 打 包 CO M 类 到 CO M D L L

  • 使 用 V is u a l J + + 编 程 - 图5029建 立 项 目

创 建 项 目

使 用 V is u a l J + + 编 程 - 图5030使 用 V is u a l J + + 编 程 - 图5031使 用 V is u a l J + + 编 程 - 图5032使 用 V is u a l J + + 编 程 - 图5033使 用 V is u a l J + + 编 程 - 图5034使 用 V is u a l J + + 编 程 - 图5035使 用 V is u a l J + + 编 程 - 图5036V 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

使 用 V is u a l J + + 编 程 - 图5037使 用 V is u a l J + + 编 程 - 图5038尽 管 CO M D L L 模 板 可 用 但 本 方 案 并 不 使 用 它 因 为 对 于 理 解 如 何 在

使 用 V is u a l J + + 编 程 - 图5039使 用 V is u a l J + + 编 程 - 图5040使 用 V is u a l J + + 编 程 - 图5041使 用 V is u a l J + + 编 程 - 图5042多 个 项 目 中 选 择 类 作 为 CO M 类 是 非 常 重 要 的 在 本 方 案 中 要 创 建 空项 目 并 为 项 目 加 上 Ja va 类 作 为 CO M 对 象

使 用 V is u a l J + + 编 程 - 图5043使 用 V is u a l J + + 编 程 - 图5044使 用 V is u a l J + + 编 程 - 图5045使 用 V is u a l J + + 编 程 - 图5046注 意 启 动 下 列 过 程 之 前 关 闭 所 有 打 开 的 项 目 使 用 V is u a l J + + 编 程 - 图5047 在 File 菜 单单 击 Close All 使 用 V is u a l J + + 编 程 - 图5048

创 建 空 项 目

  1. 使 用 V is u a l J + + 编 程 - 图5049使 用 V is u a l J + + 编 程 - 图5050在 F ile 菜 单 上 单 击 N e w P ro je c t

  2. 使 用 V is u a l J + + 编 程 - 图5051使 用 V is u a l J + + 编 程 - 图5052使 用 V is u a l J + + 编 程 - 图5053在 N e w 选 项 卡 中 选 择 V isu a l J + + P ro je c ts 文 件 夹 然 后 单 击 Em p ty P ro ject 图 标

  3. 使 用 V is u a l J + + 编 程 - 图5054使 用 V is u a l J + + 编 程 - 图5055使 用 V is u a l J + + 编 程 - 图5056使 用 V is u a l J + + 编 程 - 图5057

    N a m e 框 中 键 入 项 目 名对 于 本 方 案 键 入 S ta ts

  4. 使 用 V is u a l J + + 编 程 - 图5058使 用 V is u a l J + + 编 程 - 图5059使 用 V is u a l J + + 编 程 - 图5060在 Loc a t ion 框 中 键 入 项 目 的 保 存 路 径 或 单 击 B ro w s e 来 定 位 目 录

  5. 使 用 V is u a l J + + 编 程 - 图5061单 击 O p e n

使 用 V is u a l J + + 编 程 - 图5062使 用 V is u a l J + + 编 程 - 图5063在 P ro ject E x p lo rer 中 显 示 项 目 但 不 包 含 文 件为 项 目 加 入 类

  1. 使 用 V is u a l J + + 编 程 - 图5064使 用 V is u a l J + + 编 程 - 图5065在 P ro ject E x p lo rer 中 右 击 项 目 名

  2. 使 用 V is u a l J + + 编 程 - 图5066使 用 V is u a l J + + 编 程 - 图5067使 用 V is u a l J + + 编 程 - 图5068在 快 捷 菜 单 中 指 向 Ad d 然 后 单 击 A dd C la ss

  3. 使 用 V is u a l J + + 编 程 - 图5069使 用 V is u a l J + + 编 程 - 图5070要 添 加 空 的 Ja va 类 选 择 C la ss 图 标

  4. 使 用 V is u a l J + + 编 程 - 图5071使 用 V is u a l J + + 编 程 - 图5072使 用 V is u a l J + + 编 程 - 图5073使 用 V is u a l J + + 编 程 - 图5074

    N a m e 框 中 键 入 Ja v a 类 名在 本 方 案 中 类 名 为 S ta ts .J a v a

  5. 使 用 V is u a l J + + 编 程 - 图5075单 击 O p e n

对 类 添 加 代 码

使 用 V is u a l J + + 编 程 - 图5076使 用 V is u a l J + + 编 程 - 图5077使 用 V is u a l J + + 编 程 - 图5078使 用 V is u a l J + + 编 程 - 图5079使 用 V is u a l J + + 编 程 - 图5080使 用 V is u a l J + + 编 程 - 图5081使 用 V is u a l J + + 编 程 - 图5082使 用 V is u a l J + + 编 程 - 图5083对 于 CO M D L L 客 户 要 操 纵 CO M 对 象 必 须 在 CO M 类 中 提 供 公 共方 法 V isu a l J + + 通 过 CO M 对 象 的 接 口 给 出 了 Ja v a 类 的 所 有 公 共 方 法包 括 那 些 从 超 类 继 承 的 方 法 在 本 方 案 中 为 类 添 加 代 码 有 两 种 方 法 这 些 方 法 对 CO M 对 象 的 用 户 提 供 了 与 获 得 相 关 的 统 计 函 数

使 用 V is u a l J + + 编 程 - 图5084使 用 V is u a l J + + 编 程 - 图5085S 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 方 法

  • 使 用 V is u a l J + + 编 程 - 图5086使 用 V is u a l J + + 编 程 - 图5087对 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 ;

}

使 用 V is u a l J + + 编 程 - 图5088使 用 V is u a l J + + 编 程 - 图5089使 用 V is u a l J + + 编 程 - 图5090使 用 V is u a l J + + 编 程 - 图5091使 用 V is u a l J + + 编 程 - 图5092使 用 V is u a l J + + 编 程 - 图5093使 用 V is u a l J + + 编 程 - 图5094使 用 V is u a l J + + 编 程 - 图5095本 代 码 采 用 模 运 算 符 来 获 得 余 数 此 数 是 本 队 所 赢 比 赛 数 与 比 赛 总 数相 除 得 到 的 然 后 将 此 数 乘 上 . 100f 转 换 成 此 队 的 显 示 值 此 值 确 定后 代 码 检 查 它 是 否 为 0 如 是 则 说 明 没 有 余 数 此 队 赢 了 所 有 的

使 用 V is u a l J + + 编 程 - 图5096使 用 V is u a l J + + 编 程 - 图5097使 用 V is u a l J + + 编 程 - 图5098使 用 V is u a l J + + 编 程 - 图5099" 赛 返 回 1 否 则 代 码 返 回 实 际 数 值

使 用 V is u a l J + + 编 程 - 图5100使 用 V is u a l J + + 编 程 - 图5101使 用 V is u a l J + + 编 程 - 图5102使 用 V is u a l J + + 编 程 - 图5103S 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 方 法

  • 使 用 V is u a l J + + 编 程 - 图5104对 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;

}

使 用 V is u a l J + + 编 程 - 图5105使 用 V is u a l J + + 编 程 - 图5106本 代 码 用 射 门 次 数 除 以 比 赛 次 数 并 将 结 果 转 换 为 浮 点 数

定 义 类 作 为 CO M 类

使 用 V is u a l J + + 编 程 - 图5107使 用 V is u a l J + + 编 程 - 图5108使 用 V is u a l J + + 编 程 - 图5109使 用 V is u a l J + + 编 程 - 图5110当 创 建 了 类 并 定 义 了 通 过 CO M 公 布 的 公 共 方 法 之 后 就 定 义 了 类 作 为CO M 类 在 P ro je c t P rope r t ie s 对 话 框 中 使 用 CO M C la s se s 选 项 卡 来从 项 目 中 选 择 类 作 为 CO M 类

使 用 V is u a l J + + 编 程 - 图5111使 用 V is u a l J + + 编 程 - 图5112使 用 V is u a l J + + 编 程 - 图5113使 用 V is u a l J + + 编 程 - 图5114使 用 V is u a l J + + 编 程 - 图5115使 用 V is u a l J + + 编 程 - 图5116使 用 V is u a l J + + 编 程 - 图5117使 用 V is u a l J + + 编 程 - 图5118使 用 V is u a l J + + 编 程 - 图5119注 意 如 果 不 需 要 定 义 多 个 类 作 为 C O M 类 可 以 在 Class Properties 对 话 框 中 定 义 C O M 类 为 显 示 Class Properties 对 话 框 在 Class Outline 中 右 击 类 名 然 后 单 击 Class Properties 在 Class Properties 对 话 框 中 选 择 COM Class 复 选 框

定 义 类 作 为 CO M C la ss

  1. 使 用 V is u a l J + + 编 程 - 图5120使 用 V is u a l J + + 编 程 - 图5121使 用 V is u a l J + + 编 程 - 图5122在 P ro ject 菜 单 中 单 击 <P ro je c t > P ro p e rtie s <P ro je c t > 是 指 控 件 项目 的 名 字 使 用 V is u a l J + + 编 程 - 图5123

  2. 使 用 V is u a l J + + 编 程 - 图5124单 击 CO M C la ss 选 项 卡

  3. 使 用 V is u a l J + + 编 程 - 图5125使 用 V is u a l J + + 编 程 - 图5126在 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 选项

  4. 使 用 V is u a l J + + 编 程 - 图5127使 用 V is u a l J + + 编 程 - 图5128使 用 V is u a l J + + 编 程 - 图5129使 用 V is u a l J + + 编 程 - 图5130

    类 列 表 中 选 择 想 公 布 为 CO M 对 象 的 类对 这 种 方 案 选 择 sta ts 类

  5. 使 用 V is u a l J + + 编 程 - 图5131单 击 O K

使 用 V is u a l J + + 编 程 - 图5132使 用 V is u a l J + + 编 程 - 图5133使 用 V is u a l J + + 编 程 - 图5134使 用 V is u a l J + + 编 程 - 图5135V isu a l J + + 在 类 定 义 的 上 边 添 加 了 @ c o m . re g iste r 注 释 标 记 当 编 译 项目 时 编 译 器 使 用 注 释 标 记 中 的 信 息 在 注 册 表 中 注 册 作 为 CO M 类的 类

打 包 项 目 作 为 CO M D L L

使 用 V is u a l J + + 编 程 - 图5136使 用 V is u a l J + + 编 程 - 图5137为 了 使 其 他 应 用 程 序 可 以 使 用 CO M 对 象 可 在 CO M D L L 中 打 包 它

使 用 V is u a l J + + 编 程 - 图5138使 用 V is u a l J + + 编 程 - 图5139使 用 V is u a l J + + 编 程 - 图5140注 意 如 果 想 在 Internet 上 分 布 COM 对 象 可 以 在 C A B 文 件 中 打包 控 件 来 代 替 COM DLL

在 CO M D L L 中 打 包 CO M 对 象

  1. 使 用 V is u a l J + + 编 程 - 图5141使 用 V is u a l J + + 编 程 - 图5142使 用 V is u a l J + + 编 程 - 图5143在 P ro ject 菜 单 中 单 击 < P ro je c t > P ro p e rtie s <P ro je c t > 是 指 控 件 项目 的 名 字 使 用 V is u a l J + + 编 程 - 图5144

  2. 使 用 V is u a l J + + 编 程 - 图5145单 击

    O u tput F o rm a t 选 项 卡

  3. 使 用 V is u a l J + + 编 程 - 图5146选 择

    E n ab le P a c k ag in g 复 选 框

  4. 使 用 V is u a l J + + 编 程 - 图5147使 用 V is u a l J + + 编 程 - 图5148

    P ack ag in g ty p e 下 拉 菜 单 中 选 择 CO M D L L

  5. 使 用 V is u a l J + + 编 程 - 图5149使 用 V is u a l J + + 编 程 - 图5150使 用 V is u a l J + + 编 程 - 图5151在 F ile N a m e 框 中 键 入 CO M D L L 名 字 默 认 名 是 使 用 项 目 名 创 建的 使 用 V is u a l J + + 编 程 - 图5152

  6. 使 用 V is u a l J + + 编 程 - 图5153选 择

    O u tpu ts of type 和 J a v a C la sse s & R e so u rc e s 选 项

  7. 使 用 V is u a l J + + 编 程 - 图5154

    击 O K

建 立 项 目

使 用 V is u a l J + + 编 程 - 图5155使 用 V is u a l J + + 编 程 - 图5156使 用 V is u a l J + + 编 程 - 图5157使 用 V is u a l J + + 编 程 - 图5158使 用 V is u a l J + + 编 程 - 图5159使 用 V is u a l J + + 编 程 - 图5160使 用 V is u a l J + + 编 程 - 图5161使 用 V is u a l J + + 编 程 - 图5162使 用 V is u a l J + + 编 程 - 图5163在 建 立 过 程 中 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 对 象

建 立 项 目

  • 使 用 V is u a l J + + 编 程 - 图5164使 用 V is u a l J + + 编 程 - 图5165使 用 V is u a l J + + 编 程 - 图5166使 用 V is u a l J + + 编 程 - 图5167使 用 V is u a l J + + 编 程 - 图5168

    Bu i ld 菜 单 上 单 击 Bu i ld 如 果 收 到 一 些 编 译 错 误 信 息 更 正 错误 然 后 重 新 建 立 项 目 使 用 V is u a l J + + 编 程 - 图5169

使 用 V is u a l J + + 编 程 - 图5170使 用 V is u a l J + + 编 程 - 图5171使 用 V is u a l J + + 编 程 - 图5172使 用 V is u a l J + + 编 程 - 图5173使 用 V is u a l J + + 编 程 - 图5174使 用 V is u a l J + + 编 程 - 图5175使 用 V is u a l J + + 编 程 - 图5176使 用 V is u a l J + + 编 程 - 图5177使 用 V is u a l J + + 编 程 - 图5178注 意 注 册 了 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 对 象

使 用 V is u a l J + + 编 程 - 图5179使 用 V is u a l J + + 编 程 - 图5180使 用 V is u a l J + + 编 程 - 图5181使 用 V is u a l J + + 编 程 - 图5182使 用 V is u a l J + + 编 程 - 图5183使 用 V is u a l J + + 编 程 - 图5184使 用 V is u a l J + + 编 程 - 图5185使 用 V is u a l J + + 编 程 - 图5186使 用 V is u a l J + + 编 程 - 图5187使 用 V is u a l J + + 编 程 - 图5188使 用 V is u a l J + + 编 程 - 图5189使 用 V is u a l J + + 编 程 - 图5190CO M 对 象 提 供 多 种 方 法 来 封 装 功 能 并 在 多 个 应 用 程 序 中 可 重 用 它可 以 使 用 CO M 对 象 在 应 用 程 序 中 公 布 具 体 的 功 能 以 便 在 其 他 应 用 程序 中 使 用 或 者 创 建 一 组 要 在 多 个 应 用 程 序 中 使 用 的 例 程 因 为 CO M 不 是 针 对 具 体 的 语 言 所 以 CO M 对 象 可 以 集 成 到 在 各 种 编 程 语 言 中开 发 的 应 用 程 序 中 可 以 使 用 V isu a l J + + 来 查 看 和 导 入 在 系 统 中 注 册 的CO M 对 象 在 导 入 过 程 中 V isu a l J + + 创 建 类 封 装 器 以 使 CO M 对 象的 访 问 与 其 他 Ja va 对 象 一 样

使 用 V is u a l J + + 编 程 - 图5191使 用 V is u a l J + + 编 程 - 图5192使 用 V is u a l J + + 编 程 - 图5193在 本 方 案 中 可 以 导 入 在 本 章 前 面 的 建 立 CO M 对 象 一 节 中 建 立 的

使 用 V is u a l J + + 编 程 - 图5194使 用 V is u a l J + + 编 程 - 图5195CO M 对 象 在 此 将 学 到

  • 使 用 V is u a l J + + 编 程 - 图5196使 用 V is u a l J + + 编 程 - 图5197使 用 V is u a l J + + 编 程 - 图5198如 何 为 Ja va W F C 项 目 导 入 CO M 对 象

  • 使 用 V is u a l J + + 编 程 - 图5199CO M 对 象 的 访 问 方 法

  • 使 用 V is u a l J + + 编 程 - 图5200建 立 并 运 行 项 目 来 测 试 CO M 对 象 的 功 能

使 用 V is u a l J + + 编 程 - 图5201使 用 V is u a l J + + 编 程 - 图5202使 用 V is u a l J + + 编 程 - 图5203使 用 V is u a l J + + 编 程 - 图5204使 用 V is u a l J + + 编 程 - 图5205注 意 本 节 假 设 已 在 本 章 前 面 的 建 立 C O M 对 象 中 创 建 了 C O M 对象 然 后 已 关 闭 了 所 有 打 开 的 项 目

创 建 项 目

使 用 V is u a l J + + 编 程 - 图5206使 用 V is u a l J + + 编 程 - 图5207使 用 V is u a l J + + 编 程 - 图5208使 用 V is u a l J + + 编 程 - 图5209使 用 V is u a l J + + 编 程 - 图5210当 导 入 CO M 对 象 时 V isu a l J + + 在 项 目 中 创 建 目 录 并 在 这 些 目 录 中加 上 类 封 装 器 以 访 问 CO M 对 象 为 导 入 CO M 对 象 必 须 有 有 效 的 Ja va 项 目

使 用 V is u a l J + + 编 程 - 图5211使 用 V is u a l J + + 编 程 - 图5212创 建 项 目

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

文 件 夹 然 后 单 击

使 用 V is u a l J + + 编 程 - 图5213使 用 V is u a l J + + 编 程 - 图5214使 用 V is u a l J + + 编 程 - 图5215使 用 V is u a l J + + 编 程 - 图5216A p p lic a tio n s 然 后 选 择 W ind ow s A pp lic a t ions 图 标

  1. 使 用 V is u a l J + + 编 程 - 图5217使 用 V is u a l J + + 编 程 - 图5218在 N a m e 框 中 键 入 项 目 名

  2. 使 用 V is u a l J + + 编 程 - 图5219使 用 V is u a l J + + 编 程 - 图5220使 用 V is u a l J + + 编 程 - 图5221在 Loc a t ion 框 中 键 入 项 目 的 保 存 路 径 或 单 击 B ro w s e 来 定 位 文 件夹

  3. 使 用 V is u a l J + + 编 程 - 图5222单 击 O p e n

使 用 V is u a l J + + 编 程 - 图5223在 P ro ject E x p lo rer 中 显 示 项 目 的 封 装 视 图

  1. 使 用 V is u a l J + + 编 程 - 图5224使 用 V is u a l J + + 编 程 - 图5225在 P ro ject E x p lo rer 中 展 开 项 目 的 节 点

使 用 V is u a l J + + 编 程 - 图5226则 在 项 目 中 添 加 了 以 Fo rm 1 . J a v a 为 默 认 名 的 文 件

导 入 CO M 对 象

使 用 V is u a l J + + 编 程 - 图5227使 用 V is u a l J + + 编 程 - 图5228使 用 V is u a l J + + 编 程 - 图5229使 用 V is u a l J + + 编 程 - 图5230使 用 V is u a l J + + 编 程 - 图5231使 用 V is u a l J + + 编 程 - 图5232使 用 V is u a l J + + 编 程 - 图5233使 用 V is u a l J + + 编 程 - 图5234创 建 了 项 目 后 就 可 以 为 此 项 目 导 入 CO M 对 象 导 入 的 CO M 对 象 在每 个 项 目 中 必 须 是 可 访 问 的 当 为 项 目 导 入 了 CO M 对 象 后 V isu a l J + + 创 建 类 封 装 器 来 为 访 问 CO M 对 象 提 供 接 口 这 些 类 封 装 器 添 加 到 项 目目 录 下 的 软 件 包 中 这 取 决 于 CO M D L L 中 存 储 的 对 象 数 量 V is u a l J + + 可 以 创 建 多 个 软 件 包 使 用 V is u a l J + + 编 程 - 图5235

使 用 V is u a l J + + 编 程 - 图5236使 用 V is u a l J + + 编 程 - 图5237使 用 V is u a l J + + 编 程 - 图5238使 用 V is u a l J + + 编 程 - 图5239注 意 为 了 从 另 一 个 项 目 中 访 问 特 定 的 C O M 对 象 可 以 通 过 在Classpath 中 放 置 COM 封 装 器 类 防 止 为 每 个 项 目 封 装 对 象

导 入 CO M 对 象

  1. 使 用 V is u a l J + + 编 程 - 图5240使 用 V is u a l J + + 编 程 - 图5241在 P ro ject 菜 单 上 单 击 A dd C O M W ra ppe r

使 用 V is u a l J + + 编 程 - 图5242出 现 C O M W ra ppe rs 对 话 框

  1. 使 用 V is u a l J + + 编 程 - 图5243使 用 V is u a l J + + 编 程 - 图5244在 包 含 CO M D L L s 的 表 中 键 入 计 算 机 上 注 册 的 库 选 择 想 导 入 的

使 用 V is u a l J + + 编 程 - 图5245CO M 对 象 的 名 字

使 用 V is u a l J + + 编 程 - 图5246使 用 V is u a l J + + 编 程 - 图5247在 本 方 案 中 选 择 S ta ts C O M 对 象

  1. 使 用 V is u a l J + + 编 程 - 图5248单 击 O K

使 用 V is u a l J + + 编 程 - 图5249V isu a l J + + 为 所 选 CO M D L L 中 包 含 的 每 个 CO M 对 象 添 加 软 件 包 目 录和 类 封 装 器

为 访 问 CO M 对 象 添 加 代 码

使 用 V is u a l J + + 编 程 - 图5250V isu a l J + + 创 建 了 类 封 装 器 后 就 可 以 为 CO M 对 象 的 访 问 方 法 编 写 代

使 用 V is u a l J + + 编 程 - 图5251使 用 V is u a l J + + 编 程 - 图5252使 用 V is u a l J + + 编 程 - 图5253使 用 V is u a l J + + 编 程 - 图5254使 用 V is u a l J + + 编 程 - 图5255使 用 V is u a l J + + 编 程 - 图5256使 用 V is u a l J + + 编 程 - 图5257码 在 本 方 案 中 可 以 对 项 目 窗 体 构 造 器 添 加 代 码 此 代 码 创 建 了 CO M 对 象 的 实 例 并 生 成 对 CO M 对 象 两 种 方 法 的 调 用 使 用 硬 编 码 的 值 调用 方 法 然 后 在 O u tput 窗 口 显 示 结 果

为 窗 体 构 造 器 添 加 代 码

  1. 使 用 V is u a l J + + 编 程 - 图5258使 用 V is u a l J + + 编 程 - 图5259使 用 V is u a l J + + 编 程 - 图5260在 P ro ject E x p lo rer 中 右 击 Fo rm 1 然 后 单 击 V ie w C ode

使 用 V is u a l J + + 编 程 - 图5261在 文 本 编 辑 器 中 显 示 Fo rm 1 的 源 代 码

  1. 使 用 V is u a l J + + 编 程 - 图5262使 用 V is u a l J + + 编 程 - 图5263使 用 V is u a l J + + 编 程 - 图5264在 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 ) ) ;

使 用 V is u a l J + + 编 程 - 图5265使 用 V is u a l J + + 编 程 - 图5266使 用 V is u a l J + + 编 程 - 图5267使 用 V is u a l J + + 编 程 - 图5268使 用 V is u a l J + + 编 程 - 图5269使 用 V is u a l J + + 编 程 - 图5270这 些 代 码 创 建 了 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 窗 口

建 立 和 运 行 项 目

使 用 V is u a l J + + 编 程 - 图5271使 用 V is u a l J + + 编 程 - 图5272当 合 并 了 调 用 CO M 对 象 的 方 法 之 后 就 可 以 建 立 并 运 行 此 项 目

建 立 和 运 行 项 目

  1. 使 用 V is u a l J + + 编 程 - 图5273使 用 V is u a l J + + 编 程 - 图5274使 用 V is u a l J + + 编 程 - 图5275使 用 V is u a l J + + 编 程 - 图5276在 Bu i ld 菜 单 上 单 击 Bu i ld 如 果 收 到 一 些 编 译 错 误 或 信 息 更 正 错误 后 重 新 建 立 项 目 使 用 V is u a l J + + 编 程 - 图5277

  2. 使 用 V is u a l J + + 编 程 - 图5278使 用 V is u a l J + + 编 程 - 图5279要 运 行 窗 体 单 击 D e bug 菜 单 上 的 S ta r t

使 用 V is u a l J + + 编 程 - 图5280使 用 V is u a l J + + 编 程 - 图5281使 用 V is u a l J + + 编 程 - 图5282使 用 V is u a l J + + 编 程 - 图5283使 用 V is u a l J + + 编 程 - 图5284使 用 V is u a l J + + 编 程 - 图5285使 用 V is u a l J + + 编 程 - 图5286启 动 项 目 之 后 就 可 以 在 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 中 的 数 据 绑 定

使 用 V is u a l J + + 编 程 - 图5287使 用 V is u a l J + + 编 程 - 图5288使 用 V is u a l J + + 编 程 - 图5289使 用 V is u a l J + + 编 程 - 图5290为 了 从 Ja va 项 目 中 访 问 数 据 通 常 可 以 使 用 A c tiv e X D a ta O b je c ts AD O 使 用 V is u a l J + + 编 程 - 图5291 组 件 此 组 件 定 义 了 W F C 应 用 程 序 的 数 据 编 程 模 型 AD O

使 用 V is u a l J + + 编 程 - 图5292使 用 V is u a l J + + 编 程 - 图5293对 象 的 核 心 包 括 C onne c t ion, C o m m a nd 和 Re c o rd se t 对 象

使 用 V is u a l J + + 编 程 - 图5294使 用 V is u a l J + + 编 程 - 图5295使 用 V is u a l J + + 编 程 - 图5296使 用 V is u a l J + + 编 程 - 图5297使 用 V is u a l J + + 编 程 - 图5298使 用 V is u a l J + + 编 程 - 图5299利 用 C onne c t io n 对 象 可 连 接 到 数 据 库 一 旦 建 立 了 连 接 就 可 以 查 询数 据 库 检 索 记 录 集 R eco rd se t 对 象 表 示 查 询 返 回 的 记 录 可 以 使 用 SQ L 字 符 串 或 C o m m a n d 对 象 来 指 定 查 询

使 用 V is u a l J + + 编 程 - 图5300使 用 V is u a l J + + 编 程 - 图5301AD 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

使 用 V is u a l J + + 编 程 - 图5302使 用 V is u a l J + + 编 程 - 图5303对 象 的 功 能 关 于 使 用 AD O 对 象 编 程 的 信 息 请 参 看 M ic rosoft A c t iv e X

使 用 V is u a l J + + 编 程 - 图5304使 用 V is u a l J + + 编 程 - 图5305使 用 V is u a l J + + 编 程 - 图5306使 用 V is u a l J + + 编 程 - 图5307D a ta Ob je c ts 在 线 文 档 中 的 AD O Tu to r ia V J + + 使 用 V is u a l J + + 编 程 - 图5308 在 c o m .m s. w fc .d a ta

使 用 V is u a l J + + 编 程 - 图5309和 c o m .m s. w fc .d a ta .u i 软 件 包 中 定 义 AD O 类

使 用 V is u a l J + + 编 程 - 图5310使 用 V is u a l J + + 编 程 - 图5311使 用 V is u a l J + + 编 程 - 图5312使 用 V is u a l J + + 编 程 - 图5313注 意 Form Desig ner 中 的 Toolbox 只 提 供 DataSource 控 件 在代 码 中 只 可 使 用 Connection Command 和 Recordset 对 象

  • 使 用 V is u a l J + + 编 程 - 图5314旦 通

    过 R eco rd se t 对 象 或 D a ta S ourc e 组 件 检 索 了 记 录 集 就 可 以 对 W F C

使 用 V is u a l J + + 编 程 - 图5315使 用 V is u a l J + + 编 程 - 图5316使 用 V is u a l J + + 编 程 - 图5317组 件 绑 定 记 录 集 W F C 支 持 简 单 的 或 复 杂 的 数 据 绑 定 说 明 如 下

绑定 类 型 说明

使 用 V is u a l J + + 编 程 - 图5318简 单 的 指 记 录 集 中 的 字 段 与 W F C 组 件 属 性 之 间 的 关 系 称 之 为 简 单绑 定 是因 为 组 件不 需要 知 道 数据 协议 或数 据 提供者

复杂 的 指 记 录 集和 W F C 组件 之间 的 直 接关 系

使 用 V is u a l J + + 编 程 - 图5319使 用 V is u a l J + + 编 程 - 图5320使 用 V is u a l J + + 编 程 - 图5321注 意 记 录 集 的 光 标 和 锁 定 类 型 决 定 了 记 录 集 中 的 数 据 是 否 动 态 反 映 了数 据 库 中 的 数 据 以 及 记 录 集 中 的 数 据 是 否 可 以 改 变

使 用 V is u a l J + + 编 程 - 图5322使 用 V is u a l J + + 编 程 - 图5323使 用 V is u a l J + + 编 程 - 图5324使 用 V is u a l J + + 编 程 - 图5325关 于 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

简 单 数 据 绑 定

使 用 V is u a l J + + 编 程 - 图5326使 用 V is u a l J + + 编 程 - 图5327使 用 V is u a l J + + 编 程 - 图5328简 单 数 据 绑 定 指 的 是 在 记 录 集 中 的 字 段 与 W F C 组 件 属 性 之 间 的 关 系绑 定 了 属 性 之 后 就 可 以 自 动 在 字 段 与 属 性 之 间 传 递 数 据

  1. 使 用 V is u a l J + + 编 程 - 图5329使 用 V is u a l J + + 编 程 - 图5330如 果 改 变 了 字 段 的 值 则 新 值 也 传 给 属 性

  2. 使 用 V is u a l J + + 编 程 - 图5331使 用 V is u a l J + + 编 程 - 图5332如 果 在 记 录 集 中 导 入 了 新 的 记 录 则 当 前 字 段 值 也 传 给 属 性

  3. 使 用 V is u a l J + + 编 程 - 图5333使 用 V is u a l J + + 编 程 - 图5334使 用 V is u a l J + + 编 程 - 图5335如 果 属 性 的 值 改 变 了 并 且 组 件 支 持 属 性 改 变 的 通 知 则 新 值 也 传 给记 录 集 中 的 字 段

使 用 V is u a l J + + 编 程 - 图5336使 用 V is u a l J + + 编 程 - 图5337使 用 V is u a l J + + 编 程 - 图5338使 用 V is u a l J + + 编 程 - 图5339使 用 V is u a l J + + 编 程 - 图5340使 用 V is u a l J + + 编 程 - 图5341使 用 V is u a l J + + 编 程 - 图5342使 用 V is u a l J + + 编 程 - 图5343注 意 如 果 想 尝 试 改 变 只 读 记 录 集 则 记 录 集 将 会 产 生 A D O 异 常可 以 捕 捉 这 个 异 常 然 后 把 绑 定 的 属 性 返 回 到 原 来 的 值 否 则属 性 的 值 和 字 段 的 值 将 是 不 一 致 的

可 绑 定 属 性

使 用 V is u a l J + + 编 程 - 图5344通 过 D a ta B inde r 组 件 可 执 行 W F C 中 的 简 单 数 据 绑 定 这 个 组 件 创 建 并

使 用 V is u a l J + + 编 程 - 图5345使 用 V is u a l J + + 编 程 - 图5346管 理 字 段 与 属 性 间 的 绑 定 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 >)

使 用 V is u a l J + + 编 程 - 图5347使 用 V is u a l J + + 编 程 - 图5348使 用 V is u a l J + + 编 程 - 图5349使 用 V is u a l J + + 编 程 - 图5350使 用 V is u a l J + + 编 程 - 图5351注 意 如 果 属 性 也 可 以 用 BindableAt tribute.YES 在 组 件 的ClassInfo 中 标 记 则 在 Properties 窗 口 和 在 DataBinder 组 件 的设 计 页 中 将 列 举 出 此 属 性 使 用 V is u a l J + + 编 程 - 图5352 依 旧 可 以 在 Properties 窗 口 或 设 计页 中 手 工 键 入 名 称 或 通 过 编 程 绑 定 属 性 来 绑 定 没 有 标 记 为 可 绑 定的 属 性 使 用 V is u a l J + + 编 程 - 图5353

属 性 改 变 通 知

使 用 V is u a l J + + 编 程 - 图5354使 用 V is u a l J + + 编 程 - 图5355使 用 V is u a l J + + 编 程 - 图5356使 用 V is u a l J + + 编 程 - 图5357使 用 V is u a l J + + 编 程 - 图5358使 用 V is u a l J + + 编 程 - 图5359绑 定 属 性 的 组 件 可 以 提 供 < 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 组 件 决 定 哪 些 绑 定 是 无 效 的 并 在 记 录 集 上 更 新 这 些 绑定

使 用 V is u a l J + + 编 程 - 图5360使 用 V is u a l J + + 编 程 - 图5361使 用 V is u a l J + + 编 程 - 图5362使 用 V is u a l J + + 编 程 - 图5363使 用 V is u a l J + + 编 程 - 图5364使 用 V is u a l J + + 编 程 - 图5365注 意 如 果 组 件 没 有 提 供 < PropertyNa me >Changed 事 件 来 通 过DataBinder 组 件 绑 定 属 性 则 绑 定 是 只 读 的 且 将 禁 用 组 件 为在 这 种 限 制 下 工 作 可 以 设 法 在 代 码 中 通 过 直 接 对 记 录 集 进 行 读 写来 管 理 绑 定

D a ta B in d e r组 件

使 用 V is u a l J + + 编 程 - 图5366使 用 V is u a l J + + 编 程 - 图5367使 用 V is u a l J + + 编 程 - 图5368使 用 V is u a l J + + 编 程 - 图5369使 用 V is u a l J + + 编 程 - 图5370使 用 V is u a l J + + 编 程 - 图5371AD O 定 义 了 D a ta B inde r 组 件 来 执 行 简 单 的 数 据 绑 定 这 个 组 件 在 记 录集 中 的 字 段 和 W F C 组 件 的 绑 定 属 性 间 建 立 和 管 理 记 录 关 于 属 性 是 否可 以 绑 定 的 信 息 请 参 看 前 面 的 绑 定 属 性 一 节

使 用 V is u a l J + + 编 程 - 图5372使 用 V is u a l J + + 编 程 - 图5373使 用 V is u a l J + + 编 程 - 图5374使 用 V is u a l J + + 编 程 - 图5375使 用 V is u a l J + + 编 程 - 图5376使 用 V is u a l J + + 编 程 - 图5377尽 管 单 一 的 D a ta B inde r 组 件 可 以 管 理 多 重 绑 定 但 它 只 与 单 一 的 记 录集 关 联 为 在 第 二 个 记 录 集 中 绑 定 字 段 必 须 使 用 另 一 个 D a ta B inde r 组 件 另 外 D a ta B inde r 组 件 只 可 用 于 绑 定 相 同 窗 体 上 存 在 的 组 件

使 用 V is u a l J + + 编 程 - 图5378使 用 V is u a l J + + 编 程 - 图5379如 果 绑 定 属 性 的 组 件 支 持 属 性 的 改 变 通 知 则 当 属 性 值 改 变 时

使 用 V is u a l J + + 编 程 - 图5380使 用 V is u a l J + + 编 程 - 图5381使 用 V is u a l J + + 编 程 - 图5382使 用 V is u a l J + + 编 程 - 图5383使 用 V is u a l J + + 编 程 - 图5384使 用 V is u a l J + + 编 程 - 图5385使 用 V is u a l J + + 编 程 - 图5386D 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 方 法 时 就 改 变 了 记 录 集 更 多 的 信 息 请参 看 前 面 的 一 节 属 性 改 变 标 记 信 息

示 例

使 用 V is u a l J + + 编 程 - 图5387使 用 V is u a l J + + 编 程 - 图5388下 例 表 明 了 如 何 编 程 带 有 D a ta B inde r 组 件 的 简 单 数 据 绑 定 注 意

使 用 V is u a l J + + 编 程 - 图5389D 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 " ) } );

}

使 用 V is u a l J + + 编 程 - 图5390使 用 V is u a l J + + 编 程 - 图5391关 于 D a ta B inde r 组 件 da ta S ourc e 属 性 的 更 多 信 息 请 参 看 第 4 章

复 杂 数 据 绑 定

使 用 V is u a l J + + 编 程 - 图5392使 用 V is u a l J + + 编 程 - 图5393使 用 V is u a l J + + 编 程 - 图5394使 用 V is u a l J + + 编 程 - 图5395使 用 V is u a l J + + 编 程 - 图5396复 杂 数 据 绑 定 是 指 记 录 集 之 间 直 接 相 互 作 用 的 组 件 复 杂 数 据 绑 定 组 件提 供 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属 性

使 用 V is u a l J + + 编 程 - 图5397使 用 V is u a l J + + 编 程 - 图5398使 用 V is u a l J + + 编 程 - 图5399使 用 V is u a l J + + 编 程 - 图5400da 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 " ) ;

使 用 V is u a l J + + 编 程 - 图5401使 用 V is u a l J + + 编 程 - 图5402使 用 V is u a l J + + 编 程 - 图5403使 用 V is u a l J + + 编 程 - 图5404如 果 不 能 设 置 da ta M e m b e r 属 性 则 绑 定 数 据 源 的 默 认 记 录 集 可 以 通过 设 置 da ta M e m b e r 属 性 为 空 来 明 确 指 定 默 认 记 录 集 使 用 V is u a l J + + 编 程 - 图5405

/* 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 . */

使 用 V is u a l J + + 编 程 - 图5406使 用 V is u a l J + + 编 程 - 图5407使 用 V is u a l J + + 编 程 - 图5408使 用 V is u a l J + + 编 程 - 图5409使 用 V is u a l J + + 编 程 - 图5410使 用 V is u a l J + + 编 程 - 图5411注 意 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 is u a l J + + 编 程 - 图5412V isu a l J + + 提 供 下 列 复 杂 数 据 绑 定 组 件

组件 说明

使 用 V is u a l J + + 编 程 - 图5413使 用 V is u a l J + + 编 程 - 图5414使 用 V is u a l J + + 编 程 - 图5415D 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 属性

使 用 V is u a l J + + 编 程 - 图5416D a ta G rid 绑 定 记录 集 的 多个 字段 并 以 网格 格式 显 示 此 数 据

使 用 V is u a l J + + 编 程 - 图5417使 用 V is u a l J + + 编 程 - 图5418D a ta N a v ig a to r 允 许 用 户 改 变 记 录 集 中 的 当 前 记 录 绑 定 相 同 记 录 集 合的 其 他组 件 可 随后 更新 以 反 应新 的当 前 行

使 用 V is u a l J + + 编 程 - 图5419使 用 V is u a l J + + 编 程 - 图5420关 于 在 Fo rm D e s ig n e r 中 使 用 这 些 组 件 的 信 息 请 参 看 第 4 章

第 19 章 使 用 J /D ire ct 编 写 W ind ow s 应 用 程 序

使 用 V is u a l J + + 编 程 - 图5421使 用 V is u a l J + + 编 程 - 图5422使 用 V is u a l J + + 编 程 - 图5423使 用 V is u a l J + + 编 程 - 图5424使 用 V is u a l J + + 编 程 - 图5425使 用 V is u a l J + + 编 程 - 图5426使 用 V is u a l J + + 编 程 - 图5427使 用 V is u a l J + + 编 程 - 图5428使 用 V is u a l J + + 编 程 - 图5429使 用 V is u a l J + + 编 程 - 图5430使 用 V is u a l J + + 编 程 - 图5431使 用 V is u a l J + + 编 程 - 图5432使 用 V is u a l J + + 编 程 - 图5433J /D i rect 是 M ic rosoft V is u a l J+ + 提 供 的 一 项 新 特 征 可 以 很 容 易 地 对M ic rosoft W indow s 的 动 态 链 接 库 D L L s 使 用 V is u a l J + + 编 程 - 图5434 进 行 访 问 使 用 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 使 用 V is u a l J + + 编 程 - 图5435 和第 三 方 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 使 用 V is u a l J + + 编 程 - 图5436 要 简 单 得 多 这 二 者 都 要 求 编 写专 门 的 封 装 器 D L L 然 后 自 己 执 行 所 有 数 据 类 型 转 换 使 用 J /D i rect 通 过 简 单 声 明 并 调 用 函 数 就 可 以 调 用 大 多 数 以 前 存 在 的 D L L 函 数

使 用 V is u a l J + + 编 程 - 图5437J /D i rect 使 用 @ d l l .im port 伪 指 令 此 伪 指 令 与 V isu a l B a sic 的 DE C L AR E

使 用 V is u a l J + + 编 程 - 图5438功 能 很 相 似

使 用 V is u a l J + + 编 程 - 图5439使 用 V is u a l J + + 编 程 - 图5440使 用 V is u a l J + + 编 程 - 图5441使 用 V is u a l J + + 编 程 - 图5442使 用 V is u a l J + + 编 程 - 图5443使 用 V is u a l J + + 编 程 - 图5444使 用 V is u a l J + + 编 程 - 图5445使 用 V is u a l J + + 编 程 - 图5446为 使 用 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 方 法 的 结 构

消 息 框 示 例

使 用 V is u a l J + + 编 程 - 图5447本 节 提 供 使 用 @ d l l . im port 伪 指 令 的 消 息 框 应 用 程 序

使 用 V is u a l J + + 编 程 - 图5448使 用 V is u a l J + + 编 程 - 图5449使 用 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);

}

使 用 V is u a l J + + 编 程 - 图5450使 用 V is u a l J + + 编 程 - 图5451@ 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 使 用 V is u a l J + + 编 程 - 图5452

协 议 另 外

Ja va 的 M ic rosoft V i r tua l M a c h in e

VM 使 用 V is u a l J + + 编 程 - 图5453

使 用 V is u a l J + + 编 程 - 图5454使 用 V is u a l J + + 编 程 - 图5455使 用 V is u a l J + + 编 程 - 图5456使 用 V is u a l J + + 编 程 - 图5457使 用 V is u a l J + + 编 程 - 图5458使 用 V is u a l J + + 编 程 - 图5459使 用 V is u a l J + + 编 程 - 图5460使 用 V is u a l J + + 编 程 - 图5461使 用 V is u a l J + + 编 程 - 图5462使 用 V is u a l J + + 编 程 - 图5463使 用 V is u a l J + + 编 程 - 图5464使 用 V is u a l J + + 编 程 - 图5465提 供 自 动 类 型 度 从 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 使 用 V is u a l J + + 编 程 - 图5466 函 数 或U n ic ode M e ss a g e B ox 函 数 M e ss a g e B o x W 使 用 V is u a l J + + 编 程 - 图5467 在 上 面 的 例 子 中 总 是调 用 AN S I 版 本 在 本 章 后 面 的 V M 如 何 在 AN S I 和 U n ic ode 之 间 进

使 用 V is u a l J + + 编 程 - 图5468使 用 V is u a l J + + 编 程 - 图5469使 用 V is u a l J + + 编 程 - 图5470使 用 V is u a l J + + 编 程 - 图5471行 选 择 一 节 解 释 了 如 何 使 用 au to 修 饰 符 来 调 用 函 数 的 最 优 版 本此 函 数 依 赖 于 支 持 应 用 程 序 的 M ic rosoft W indow s 版 本

J /D ire c t C a ll B u i ld e r

使 用 V is u a l J + + 编 程 - 图5472使 用 V is u a l J + + 编 程 - 图5473使 用 J /D i rect C a l l B u i ld e r 可 以 快 速 对 W in3 2 A P I 创 建 J /D i rect 调 用

使 用 V is u a l J + + 编 程 - 图5474使 用 V is u a l J + + 编 程 - 图5475J /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

  1. 使 用 V is u a l J + + 编 程 - 图5476使 用 V is u a l J + + 编 程 - 图5477使 用 V is u a l J + + 编 程 - 图5478打 开 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

  2. 使 用 V is u a l J + + 编 程 - 图5479使 用 V is u a l J + + 编 程 - 图5480使 用 V is u a l J + + 编 程 - 图5481使 用 V is u a l J + + 编 程 - 图5482使 用 V is u a l J + + 编 程 - 图5483使 用 V is u a l J + + 编 程 - 图5484使 用 V is u a l J + + 编 程 - 图5485使 用 V is u a l J + + 编 程 - 图5486使 用 V is u a l J + + 编 程 - 图5487默 认 情 况 下 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 文件 来 指 定 的 使 用 V is u a l J + + 编 程 - 图5488

  3. 使 用 V is u a l J + + 编 程 - 图5489使 用 V is u a l J + + 编 程 - 图5490Ta rg e t 框 标 识 了 包 含 J /D i rect 调 用 的 类 默 认 类 名 为 W in 3 2 它 将 添

使 用 V is u a l J + + 编 程 - 图5491使 用 V is u a l J + + 编 程 - 图5492使 用 V is u a l J + + 编 程 - 图5493使 用 V is u a l J + + 编 程 - 图5494加 到 项 目 中 并 包 含 这 些 调 用 如 果 解 决 方 案 中 包 含 了 多 个 Ja va 项目 W in 3 2 类 将 添 加 到 第 一 个 项 目 中

使 用 V is u a l J + + 编 程 - 图5495使 用 V is u a l J + + 编 程 - 图5496要 指 定 不 同 的 目 标 类 单 击 省 略 号 按 钮

  • 使 用 V is u a l J + + 编 程 - 图5497使 用 V is u a l J + + 编 程 - 图5498使 用 V is u a l J + + 编 程 - 图5499使 用 V is u a l J + + 编 程 - 图5500使 用 V is u a l J + + 编 程 - 图5501使 用 V is u a l J + + 编 程 - 图5502

    Se le c t C la ss 对 话 框 中 在 P ro ject V iew 或 C la ss V ie w 中 选 择想 要 查 看 的 类 项 目 视 图 显 示 了 解 决 方 案 中 .J a v a 文 件 的 分 层 列 类这 里 每 个 文 件 节 点 都 列 出 了 此 文 件 中 包 含 的 名 称 类 视 图 显 示 了

使 用 V is u a l J + + 编 程 - 图5503类 名 的 分 层 列 表

  • 使 用 V is u a l J + + 编 程 - 图5504使 用 V is u a l J + + 编 程 - 图5505

    旦 选 择 了 视 图 就 可 以 选 择 包 含 J /D i re c t 调 用 的 类 名 为 了 对

使 用 V is u a l J + + 编 程 - 图5506使 用 V is u a l J + + 编 程 - 图5507W ind ow s C l ipboa rd 而 不 是 对 类 进 行 复 制 调 用 选 择 C l ipboa rd 使 用 V is u a l J + + 编 程 - 图5508

  • 使 用 V is u a l J + + 编 程 - 图5509

    击 O K

  1. 使 用 V is u a l J + + 编 程 - 图5510使 用 V is u a l J + + 编 程 - 图5511使 用 V is u a l J + + 编 程 - 图5512为 了 过 滤 W in 3 2 方 法 结 构 和 常 量 的 显 示 选 择 或 清 除 M e thods S tru c ts

使 用 V is u a l J + + 编 程 - 图5513和 C ons ta n ts 选 项

  1. 使 用 V is u a l J + + 编 程 - 图5514使 用 V is u a l J + + 编 程 - 图5515使 用 V is u a l J + + 编 程 - 图5516现 在 选 择 要 插 入 的 方 法 结 构 和 常 量 可 以 使 用 SH IF T 和 CT R L

使 用 V is u a l J + + 编 程 - 图5517使 用 V is u a l J + + 编 程 - 图5518使 用 V is u a l J + + 编 程 - 图5519键 选 择 多 个 项 使 用 V is u a l J + + 编 程 - 图5520 注 意 W in 3 2 结 构 将 被 作 为 嵌 套 类 添 加 到 类 中

使 用 V is u a l J + + 编 程 - 图5521使 用 V is u a l J + + 编 程 - 图5522使 用 V is u a l J + + 编 程 - 图5523使 用 V is u a l J + + 编 程 - 图5524注 意 为 通 过 首 字 符 搜 索 项 在 Find 框 中 键 入 字 符 这 将 自 动 选择 匹 配 这 些 字 符 的 第 一 项

  1. 使 用 V is u a l J + + 编 程 - 图5525使 用 V is u a l J + + 编 程 - 图5526使 用 V is u a l J + + 编 程 - 图5527使 用 V is u a l J + + 编 程 - 图5528使 用 V is u a l J + + 编 程 - 图5529使 用 V is u a l J + + 编 程 - 图5530在 类 中 插 入 关 联 的 Ja va 定 义 单 击 Co p y T o T a rg e t 也 可 以 双 击 方法 结 构 或 常 量 把 它 插 入 到 类 中 使 用 V is u a l J + + 编 程 - 图5531

使 用 V is u a l J + + 编 程 - 图5532使 用 V is u a l J + + 编 程 - 图5533使 用 V is u a l J + + 编 程 - 图5534使 用 V is u a l J + + 编 程 - 图5535使 用 V is u a l J + + 编 程 - 图5536使 用 V is u a l J + + 编 程 - 图5537当 在 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

使 用 V is u a l J + + 编 程 - 图5538使 用 V is u a l J + + 编 程 - 图5539关 于 编 译 器 默 认 设 置 的 信 息 请 参 看 下 一 节 设 置 J /D i re c t C a ll B u i ld e r

使 用 V is u a l J + + 编 程 - 图5540使 用 V is u a l J + + 编 程 - 图5541选 项

设 置 J /D ire c t C a ll B u ilde r选 项

使 用 V is u a l J + + 编 程 - 图5542使 用 V is u a l J + + 编 程 - 图5543V 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 选 项

  1. 使 用 V is u a l J + + 编 程 - 图5544使 用 V is u a l J + + 编 程 - 图5545在 T oo ls 菜 单 上 单 击 J /D i re c t Ca l l Bu i ld e r 选 项

  2. 使 用 V is u a l J + + 编 程 - 图5546使 用 V is u a l J + + 编 程 - 图5547在 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

  1. 使 用 V is u a l J + + 编 程 - 图5548使 用 V is u a l J + + 编 程 - 图5549单 击 O K 保 存 设 置

默认 状态 为选 择 当在 类 中 插 入 J/ D ire c t 调 用时 编译 器会 自动 在 Te x t 编 辑 器 中 打 开 Ja v a 文件 使 用 V is u a l J + + 编 程 - 图5550 如 果 它没 有打 开 的 话 使 用 V is u a l J + + 编 程 - 图5551

使 用 V is u a l J + + 编 程 - 图5552使 用 V is u a l J + + 编 程 - 图5553使 用 V is u a l J + + 编 程 - 图5554使 用 V is u a l J + + 编 程 - 图5555使 用 V is u a l J + + 编 程 - 图5556使 用 V is u a l J + + 编 程 - 图5557使 用 V is u a l J + + 编 程 - 图5558使 用 V is u a l J + + 编 程 - 图5559默认 状 态 为 清 除 VM 将对 每个 J / D i re ct C h ec k 调 用 启动 堆栈 安全 检查 如 果 栈 上 的 任 何 调 用程 序 不是 完全 信任 的话 则 发 出 安 全 异 常 然后就 不 再 调 用 J/ D ire c t 调用 这主 要影 响 W e b 页上 的 Ja v a 代码

使 用 V is u a l J + + 编 程 - 图5560使 用 V is u a l J + + 编 程 - 图5561当 选 择这 个选 项来 关闭 安全 检 查 时 @ se c u r i ty c h e c k D L L C a lls = o ff 使 用 V is u a l J + + 编 程 - 图5562 标 记 自动 添加 到 下 次 插

使 用 V is u a l J + + 编 程 - 图5563使 用 V is u a l J + + 编 程 - 图5564使 用 V is u a l J + + 编 程 - 图5565入 J/ D i re c t 调用 的类 中 如 果 清除 了这 个 选 项则任 何 现 有 @ s e c u rity 标 记 依然 在 文 件中 但将不 会 添加 新 的 实例 使 用 V is u a l J + + 编 程 - 图5566

快 速 语 法 参 考

使 用 V is u a l J + + 编 程 - 图5567使 用 V is u a l J + + 编 程 - 图5568使 用 V is u a l J + + 编 程 - 图5569使 用 V is u a l J + + 编 程 - 图5570下 面 介 绍 @ 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的 语 法

使 用 V is u a l J + + 编 程 - 图5571使 用 V is u a l J + + 编 程 - 图5572@ 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 … ;

使 用 V is u a l J + + 编 程 - 图5573使 用 V is u a l J + + 编 程 - 图5574使 用 V is u a l J + + 编 程 - 图5575使 用 V is u a l J + + 编 程 - 图5576使 用 V is u a l J + + 编 程 - 图5577使 用 V is u a l J + + 编 程 - 图5578使 用 V is u a l J + + 编 程 - 图5579使 用 V is u a l J + + 编 程 - 图5580L ibna m e 是 D L L 的 名 称 它 包 含 了 要 调 用 的 函 数 M od if ie r 是 可 选 项 其 值 可 根 据 需 要 确 定 在 方 法 声 明 中 可 以 使 用 D L L 使 用 的 函 数 名或 通 过 使 用 别 名 来 给 出 方 法 的 不 同 名 称 关 于 别 名 的 信 息 请 参 看 本 章

使 用 V is u a l J + + 编 程 - 图5581使 用 V is u a l J + + 编 程 - 图5582使 用 V is u a l J + + 编 程 - 图5583使 用 V is u a l J + + 编 程 - 图5584使 用 V is u a l J + + 编 程 - 图5585使 用 V is u a l J + + 编 程 - 图5586使 用 V is u a l J + + 编 程 - 图5587使 用 V is u a l J + + 编 程 - 图5588使 用 V is u a l J + + 编 程 - 图5589后 面 的 别 名 方 法 重 命 名 使 用 V is u a l J + + 编 程 - 图5590 一 节 为 参 数 和 方 法 返 回 值 选 择 的 Ja va 类 型 应 该 是 映 射 到 D L L 函 数 的 参 数 和 返 回 值 的 类 型 关 于 Ja va 数 据 类型 如 何 映 射 到 本 机 类 型 的 更 多 信 息 请 参 看 本 章 后 面 的 如 何 安 排 数 据类 型 一 节

使 用 V is u a l J + + 编 程 - 图5591下 表 给 出 了 本 节 说 明 的 几 种 形 式 的 @ 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 名称

使 用 V is u a l J + + 编 程 - 图5592使 用 V is u a l J + + 编 程 - 图5593o rd in a l 是 16 位整 数 以

使 用 V is u a l J + + 编 程 - 图559410 进 制 的 方 式 给 出 指出正 在 导 入 的 DL L 函数

使 用 V is u a l J + + 编 程 - 图5595使 用 V is u a l J + + 编 程 - 图5596@ 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 … ;

使 用 V is u a l J + + 编 程 - 图5597使 用 V is u a l J + + 编 程 - 图5598使 用 V is u a l J + + 编 程 - 图5599使 用 V is u a l J + + 编 程 - 图5600L 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

使 用 V is u a l J + + 编 程 - 图5601使 用 V is u a l J + + 编 程 - 图5602使 用 V is u a l J + + 编 程 - 图5603un ic ode 或 au to 如 果 没 有 指 定 L inkT yp e M od if ie r 将 使 用 默 认 的 AN S I

使 用 V is u a l J + + 编 程 - 图5604使 用 V is u a l J + + 编 程 - 图5605使 用 V is u a l J + + 编 程 - 图5606使 用 V is u a l J + + 编 程 - 图5607参 看 本 章 后 面 的 VM 如 何 在 AN S I 和 U n ic ode 之 间 选 择 一 节 可 以

帮 助 了 解 关 于 可 用 L inkT y p e M od if ie r

值 的 更 多 信 息

也 可 以 指 定 p ack = n 来 告 诉 编 译 器

设 置 结 构 的 紧 缩 尺 寸 为

1

2

4

使 用 V is u a l J + + 编 程 - 图5608使 用 V is u a l J + + 编 程 - 图5609使 用 V is u a l J + + 编 程 - 图5610使 用 V is u a l J + + 编 程 - 图5611使 用 V is u a l J + + 编 程 - 图5612使 用 V is u a l J + + 编 程 - 图56138 这 主 要 依 赖 于 指 定 的 n 值 如 果 省 略 了 p ack = n 则 紧 缩 尺 寸 默 认 为

使 用 V is u a l J + + 编 程 - 图5614使 用 V is u a l J + + 编 程 - 图5615使 用 V is u a l J + + 编 程 - 图5616使 用 V is u a l J + + 编 程 - 图5617使 用 V is u a l J + + 编 程 - 图56188 关 于 设 置 紧 缩 尺 寸 的 更 多 信 息 请 参 看 本 章 后 面 的 结 构 紧 缩 一节

使 用 V is u a l J + + 编 程 - 图5619使 用 V is u a l J + + 编 程 - 图5620在 类 声 明 中 需 要 提 供 字 段 此 字 段 的 Ja va 类 型 以 它 们 在 本 机 结 构 中

使 用 V is u a l J + + 编 程 - 图5621使 用 V is u a l J + + 编 程 - 图5622使 用 V is u a l J + + 编 程 - 图5623使 用 V is u a l J + + 编 程 - 图5624使 用 V is u a l J + + 编 程 - 图5625出 现 的 次 序 映 射 为 本 机 结 构 中 字 段 的 类 型 关 于 选 择 字 段 数 据 类 型 的 信息 请 参 看 本 章 后 面 的 结 构 中 类 型 之 间 的 一 致 性 一 节

使 用 V is u a l J + + 编 程 - 图5626下 表 给 出 了 可 能 使 用 的 @ 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 字段

使 用 V is u a l J + + 编 程 - 图5627设 置 结构 的 紧 缩尺 寸 /* *@ d ll.s tru c t( p a c k=

n )*/

表示 AN S I 字符

使 用 V is u a l J + + 编 程 - 图5628使 用 V is u a l J + + 编 程 - 图5629n 可以 是 1 2 4 或 8

声 明 具 有 字 段 或 类 型 字 符的结 构

使 用 V is u a l J + + 编 程 - 图5630使 用 字 段 或 类 型 字 符 串 声明 一 个 结 构 并 设 置 紧 缩尺寸

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 字符

使 用 V is u a l J + + 编 程 - 图5631使 用 V is u a l J + + 编 程 - 图5632使 用 V is u a l J + + 编 程 - 图5633使 用 V is u a l J + + 编 程 - 图5634S tr ing 字段 将以 U n ic ode 的格 式 而 且 紧 缩 尺 寸 根 据n 值 设 置 为 1 2 4 或 8

使 用 V is u a l J + + 编 程 - 图5635使 用 V is u a l J + + 编 程 - 图5636使 用 V is u a l J + + 编 程 - 图5637使 用 V is u a l J + + 编 程 - 图5638使 用 V is u a l J + + 编 程 - 图5639使 用 V is u a l J + + 编 程 - 图5640使 用 V is u a l J + + 编 程 - 图5641使 用 V is u a l J + + 编 程 - 图5642使 用 V is u a l J + + 编 程 - 图5643@ 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 的 更 多 信 息 请 参 看 本 章 后 面 的 两 节 在结 构 中 嵌 入 定 长 字 符 串 和 在 结 构 中 嵌 入 定 长 标 量 数 组

使 用 V is u a l J + + 编 程 - 图5644下 表 给 出 了 @ 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 是 十 进 制 整 数 它指 出 字 符 串 中 的 字 符数 包括 空 字 符终 止 的空格

使 用 V is u a l J + + 编 程 - 图5645使 用 V is u a l J + + 编 程 - 图5646使 用 V is u a l J + + 编 程 - 图5647n 是实 进制 整数 它 表示数 组 的 大 小

数 据 类 型 转 换

使 用 V is u a l J + + 编 程 - 图5648使 用 V is u a l J + + 编 程 - 图5649使 用 V is u a l J + + 编 程 - 图5650使 用 V is u a l J + + 编 程 - 图5651使 用 V is u a l J + + 编 程 - 图5652使 用 V is u a l J + + 编 程 - 图5653使 用 V is u a l J + + 编 程 - 图5654使 用 V is u a l J + + 编 程 - 图5655使 用 V is u a l J + + 编 程 - 图5656使 用 V is u a l J + + 编 程 - 图5657使 用 V is u a l J + + 编 程 - 图5658使 用 V is u a l J + + 编 程 - 图5659M ic rosoft V M 计 算 Ja va 参 数 然 后 把 它 们 转 换 成 本 机 C+ + 类 型 M ic rosoft VM 根 据 编 译 时 声 明 的 Ja va 参 数 类 型 推 断 每 个 参 数 和 返 回 值 的 本 机类 型 例 如 已 声 明 为 Ja va 整 数 的 参 数 是 作 为 32 位 整 数 传 送 的 已声 明 为 Ja va 字 符 S tr in g 对 象 的 参 数 是 作 为 空 字 符 结 尾 的 字 符 串 传 送的 等 等 这 没 有 不 可 见 的 属 性 来 提 供 本 机 类 型 的 信 息 在 Ja va 中

使 用 V is u a l J + + 编 程 - 图5660所 见 即 所 得

快 速 参 考

使 用 V is u a l J + + 编 程 - 图5661使 用 V is u a l J + + 编 程 - 图5662使 用 V is u a l J + + 编 程 - 图5663下 面 两 个 表 列 出 了 每 个 Ja va 类 型 对 应 的 本 机 类 型 第 一 张 表 描 述 了 参数 与 返 回 值 的 映 射 第 二 张 表 展 示 了 @ d ll. s t ru c t 伪 指 令 使 用 的 映 射

参 数 与 返 回 值 映 射

使 用 V is u a l J + + 编 程 - 图5664使 用 V is u a l J + + 编 程 - 图5665使 用 V is u a l J + + 编 程 - 图5666使 用 V is u a l J + + 编 程 - 图5667

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 []

使 用 V is u a l J + + 编 程 - 图5668Ob 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 *

使 用 V is u a l J + + 编 程 - 图5669使 用 V is u a l J + + 编 程 - 图5670使 用 V is u a l J + + 编 程 - 图5671@ 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

使 用 V is u a l J + + 编 程 - 图5672S 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 的数 组

基 本 标 量 类 型

使 用 V is u a l J + + 编 程 - 图5673下 表 给 出 了 映 射 的 基 本 标 量 类 型

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 位双 精度

使 用 V is u a l J + + 编 程 - 图5674使 用 V is u a l J + + 编 程 - 图5675使 用 V is u a l J + + 编 程 - 图5676使 用 V is u a l J + + 编 程 - 图5677使 用 V is u a l J + + 编 程 - 图5678使 用 V is u a l J + + 编 程 - 图5679使 用 V is u a l J + + 编 程 - 图5680使 用 V is u a l J + + 编 程 - 图5681使 用 V is u a l J + + 编 程 - 图5682注 意 Ja va 中 没 有 无 符 号 整 型 的 直 接 表 示 由 于 Ja va 没 有 无 符 号 类型 则 可 使 用 与 整 数 类 型 相 同 长 度 的 Ja va 类 型 例 如 对 于 常 见 的 DW ORD 类 型 无 符 号 32 位 使 用 V is u a l J + + 编 程 - 图5683 可 以 使 用 Ja va in t 类 型 如 果 在 表 示 数 据 中 没 有什 么 丢 失 的 话 使 用 V is u a l J + + 编 程 - 图5684

字 符 型

使 用 V is u a l J + + 编 程 - 图5685使 用 V is u a l J + + 编 程 - 图5686使 用 V is u a l J + + 编 程 - 图5687使 用 V is u a l J + + 编 程 - 图5688使 用 V is u a l J + + 编 程 - 图5689使 用 V is u a l J + + 编 程 - 图5690如 果 un ic od leole @ 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 字 符 使 用 V is u a l J + + 编 程 - 图5691

布 尔 值

使 用 V is u a l J + + 编 程 - 图5692使 用 V is u a l J + + 编 程 - 图5693使 用 V is u a l J + + 编 程 - 图5694J a v a B oo le a n 类 型 映 射 于 W in3 2 B O O L 类 型 是 32 位 类 型 作 为 参 数

使 用 V is u a l J + + 编 程 - 图5695使 用 V is u a l J + + 编 程 - 图5696使 用 V is u a l J + + 编 程 - 图5697使 用 V is u a l J + + 编 程 - 图5698Ja va 真 为 1 假 为 0 作 为 返 回 值 则 非 0 为 真

使 用 V is u a l J + + 编 程 - 图5699使 用 V is u a l J + + 编 程 - 图5700使 用 V is u a l J + + 编 程 - 图5701使 用 V is u a l J + + 编 程 - 图5702使 用 V is u a l J + + 编 程 - 图5703使 用 V is u a l J + + 编 程 - 图5704注 意 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 is u a l J + + 编 程 - 图5705 是 不 能 互 换 的 为 了 把 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

使 用 V is u a l J + + 编 程 - 图57060 代 表 V A R IA N T _ F A L S E

字 符 串

使 用 V is u a l J + + 编 程 - 图5707使 用 V is u a l J + + 编 程 - 图5708使 用 V is u a l J + + 编 程 - 图5709本 节 解 释 在 AN S I 和 U n ic ode 格 式 中 如 何 把 字 符 串 传 送 到 D L L 函 数本 节 还 讨 论 从 D L L 函 数 返 回 字 符 串 的 两 种 方 法

把 字 符 串 传 送 到 D L L 函 数

使 用 V is u a l J + + 编 程 - 图5710使 用 V is u a l J + + 编 程 - 图5711为 了 把 标 准 的 空 字 符 结 尾 的 字 符 串 传 送 到 D L L 函 数 只 传 送 Ja va S tr in g

使 用 V is u a l J + + 编 程 - 图5712使 用 V is u a l J + + 编 程 - 图5713使 用 V is u a l J + + 编 程 - 图5714例 如 为 了 改 变 当 前 目 录 可 以 如 下 访 问 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 ) ;

}

使 用 V is u a l J + + 编 程 - 图5715使 用 V is u a l J + + 编 程 - 图5716使 用 V is u a l J + + 编 程 - 图5717使 用 V is u a l J + + 编 程 - 图5718使 用 V is u a l J + + 编 程 - 图5719使 用 V is u a l J + + 编 程 - 图5720使 用 V is u a l J + + 编 程 - 图5721使 用 V is u a l J + + 编 程 - 图5722在 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 对 象

使 用 V is u a l J + + 编 程 - 图5723使 用 V is u a l J + + 编 程 - 图5724如 果 不 使 用 U n ic ode 或 o le 修 饰 符 在 这 种 情 况 下 字 符 串 以 打 算 以

使 用 V is u a l J + + 编 程 - 图5725使 用 V is u a l J + + 编 程 - 图5726U n ic ode 格 式 传 递 使 用 V is u a l J + + 编 程 - 图5727 则 字 符 串 将 转 换 为 AN S I

使 用 V is u a l J + + 编 程 - 图5728使 用 V is u a l J + + 编 程 - 图5729使 用 V is u a l J + + 编 程 - 图5730使 用 V is u a l J + + 编 程 - 图5731使 用 V is u a l J + + 编 程 - 图5732除 非 在 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 函 数 接 收 字 符 串

使 用 V is u a l J + + 编 程 - 图5733使 用 V is u a l J + + 编 程 - 图5734使 用 V is u a l J + + 编 程 - 图5735使 用 V is u a l J + + 编 程 - 图5736使 用 V is u a l J + + 编 程 - 图5737使 用 V is u a l J + + 编 程 - 图5738使 用 V is u a l J + + 编 程 - 图5739使 用 V is u a l J + + 编 程 - 图5740使 用 V is u a l J + + 编 程 - 图5741从 函 数 中 传 回 字 符 串 有 两 种 方 法 一 种 是 调 用 程 序 分 配 函 数 填 充 的 缓 冲区 另 一 种 是 函 数 分 配 字 符 串 然 后 把 它 返 回 给 调 用 程 序 大 多 数 W in 3 2函 数 使 用 第 一 种 方 法 但 O L E 函 数 使 用 第 二 种 方 法 参 看 本 章 后 面 的调 用 O L E A P I 函 数 可 以 了 解 J/ D i re ct 为 调 用 O L E 函 数 提 供 的 特

使 用 V is u a l J + + 编 程 - 图5742使 用 V is u a l J + + 编 程 - 图5743殊 支 持 使 用 V is u a l J + + 编 程 - 图5744 使 用 第 一 种 方 法 的 函 数 是 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);

使 用 V is u a l J + + 编 程 - 图5745使 用 V is u a l J + + 编 程 - 图5746使 用 V is u a l J + + 编 程 - 图5747使 用 V is u a l J + + 编 程 - 图5748使 用 V is u a l J + + 编 程 - 图5749使 用 V is u a l J + + 编 程 - 图5750此 函 数 只 返 回 系 统 暂 时 文 件 目 录 的 路 径 诸 如 c :\tm p \
使 用 V is u a l J + + 编 程 - 图5751 Bu f fe r 参数 指 向 一 个 调 用 程 序 分 配 的 缓 冲 区 在 这 个 缓 冲 区 中 将 接 收 路 径

使 用 V is u a l J + + 编 程 - 图5752使 用 V is u a l J + + 编 程 - 图5753使 用 V is u a l J + + 编 程 - 图5754使 用 V is u a l J + + 编 程 - 图5755使 用 V is u a l J + + 编 程 - 图5756使 用 V is u a l J + + 编 程 - 图5757使 用 V is u a l J + + 编 程 - 图5758使 用 V is u a l J + + 编 程 - 图5759s iz e o fb u ffe r 指 出 了 写 入 缓 冲 区 的 字 符 数 这 不 同 于 U n ic ode 版 本 中 的 字节 数 使 用 V is u a l J + + 编 程 - 图5760 在 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);

}

使 用 V is u a l J + + 编 程 - 图5761使 用 V is u a l J + + 编 程 - 图5762使 用 V is u a l J + + 编 程 - 图5763使 用 V is u a l J + + 编 程 - 图5764使 用 V is u a l J + + 编 程 - 图5765要 理 解 本 例 区 别 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 );

使 用 V is u a l J + + 编 程 - 图5766使 用 V is u a l J + + 编 程 - 图5767使 用 V is u a l J + + 编 程 - 图5768使 用 V is u a l J + + 编 程 - 图5769使 用 V is u a l J + + 编 程 - 图5770使 用 V is u a l J + + 编 程 - 图5771使 用 V is u a l J + + 编 程 - 图5772使 用 V is u a l J + + 编 程 - 图5773使 用 V is u a l J + + 编 程 - 图5774使 用 V is u a l J + + 编 程 - 图5775使 用 V is u a l J + + 编 程 - 图5776使 用 V is u a l J + + 编 程 - 图5777使 用 V is u a l J + + 编 程 - 图5778使 用 V is u a l J + + 编 程 - 图5779Sb . 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 ) ;

使 用 V is u a l J + + 编 程 - 图5780使 用 V is u a l J + + 编 程 - 图5781使 用 V is u a l J + + 编 程 - 图5782使 用 V is u a l J + + 编 程 - 图5783使 用 V is u a l J + + 编 程 - 图5784使 用 V is u a l J + + 编 程 - 图5785使 用 V is u a l J + + 编 程 - 图5786使 用 V is u a l J + + 编 程 - 图5787使 用 V is u a l J + + 编 程 - 图5788不 带 参 数 调 用 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

}

使 用 V is u a l J + + 编 程 - 图5789使 用 V is u a l J + + 编 程 - 图5790使 用 V is u a l J + + 编 程 - 图5791使 用 V is u a l J + + 编 程 - 图5792这 种 方 法 既 方 便 又 安 全 并 且 它 映 射 了 Ja va 异 常 下 函 数 的 错 误 返 回 值注 意 不 能 返 回 S trin g B u ffe r 对 象

数 组

使 用 V is u a l J + + 编 程 - 图5793使 用 V is u a l J + + 编 程 - 图5794J /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 *

如 果 有

使 用 V is u a l J + + 编 程 - 图5795使 用 V is u a l J + + 编 程 - 图5796使 用 V is u a l J + + 编 程 - 图5797使 用 V is u a l J + + 编 程 - 图5798使 用 V is u a l J + + 编 程 - 图5799使 用 V is u a l J + + 编 程 - 图5800使 用 V is u a l J + + 编 程 - 图5801使 用 V is u a l J + + 编 程 - 图5802使 用 V is u a l J + + 编 程 - 图5803使 用 V is u a l J + + 编 程 - 图5804通 过 调 用 程 序 可 以 修 改 所 有 的 标 量 数 组 参 数 诸 如 [in ou t] 参 数 使 用 V is u a l J + + 编 程 - 图5805数 组 类 型 不 能 作 为 返 回 类 型 这 里 不 支 持 对 象 或 字 符 串 数 组

使 用 V is u a l J + + 编 程 - 图5806使 用 V is u a l J + + 编 程 - 图5807使 用 V is u a l J + + 编 程 - 图5808使 用 V is u a l J + + 编 程 - 图5809使 用 V is u a l J + + 编 程 - 图5810使 用 V is u a l J + + 编 程 - 图5811使 用 V is u a l J + + 编 程 - 图5812使 用 V is u a l J + + 编 程 - 图5813使 用 V is u a l J + + 编 程 - 图5814通 常 这 种 机 制 由 O L E 函 数 用 来 返 回 值 O L E 函 数 保 留 函 数 返 回值 来 返 回 HR ES U L T 错 误 代 码 使 用 V is u a l J + + 编 程 - 图5815 参 看 本 章 后 面 的 调 用 O L E A P I 函数 一 节 会 了 解 到 O L E 函 数 是 如 何 获 得 返 回 值 的

结 构

使 用 V is u a l J + + 编 程 - 图5816使 用 V is u a l J + + 编 程 - 图5817使 用 V is u a l J + + 编 程 - 图5818使 用 V is u a l J + + 编 程 - 图5819使 用 V is u a l J + + 编 程 - 图5820Ja va 语 言 不 直 接 支 持 结 构 的 概 念 尽 管 使 用 Ja va 类 包 含 的 字 段 可 以 在Ja va 语 言 中 模 拟 结 构 的 概 念 也 不 能 使 用 普 通 的 Ja va 对 象 在 本 机 D L L 调 用 中 模 拟 结 构 这 是 因 为 Ja va 语 言 不 能 保 证 字 段 的 布 局 因 为 无 用单 元 收 集 程 序 可 以 在 内 存 中 自 由 移 动 对 象

使 用 V is u a l J + + 编 程 - 图5821使 用 V is u a l J + + 编 程 - 图5822使 用 V is u a l J + + 编 程 - 图5823使 用 V is u a l J + + 编 程 - 图5824使 用 V is u a l J + + 编 程 - 图5825使 用 V is u a l J + + 编 程 - 图5826使 用 V is u a l J + + 编 程 - 图5827使 用 V is u a l J + + 编 程 - 图5828使 用 V is u a l J + + 编 程 - 图5829使 用 V is u a l J + + 编 程 - 图5830使 用 V is u a l J + + 编 程 - 图5831使 用 V is u a l J + + 编 程 - 图5832使 用 V is u a l J + + 编 程 - 图5833使 用 V is u a l J + + 编 程 - 图5834使 用 V is u a l J + + 编 程 - 图5835然 而 为 了 传 递 和 接 收 来 自 D L L 方 法 的 结 构 需 要 使 用 @ d l l . s t ru c t 编译 器 伪 指 令 当 对 Ja va 类 定 义 应 用 它 时 这 个 伪 指 令 将 对 内 存 块 中 分配 的 类 产 生 类 的 所 有 实 例 此 内 存 块 在 无 用 单 元 回 收 期 间 是 不 可 移 动的 另 外 使 用 p ack 修 饰 符 可 以 控 制 内 存 中 字 段 的 格 式 参 看 本 章后 面 的 结 构 封 装 使 用 V is u a l J + + 编 程 - 图5836 例 如 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 ;

使 用 V is u a l J + + 编 程 - 图5837使 用 V is u a l J + + 编 程 - 图5838在 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 ;

}

使 用 V is u a l J + + 编 程 - 图5839下 面 的 例 子 在 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.

}

}

使 用 V is u a l J + + 编 程 - 图5840使 用 V is u a l J + + 编 程 - 图5841使 用 V is u a l J + + 编 程 - 图5842注 意 已 声 明 的 带 有 @dll.struc t 的 类 是 不 安 全 的 不 能 被 不 信 任的 小 应 用 程 序 使 用

结 构 内 部 各 类 型 间 的 一 致 性

使 用 V is u a l J + + 编 程 - 图5843下 表 描 述 了 在 结 构 内 部 标 量 类 型 是 如 何 映 射 的

Ja v a 本机

byte B Y T E

使 用 V is u a l J + + 编 程 - 图5844vh 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 )

使 用 V is u a l J + + 编 程 - 图5845使 用 V is u a l J + + 编 程 - 图5846使 用 V is u a l J + + 编 程 - 图5847引 用 类 型 Ja va 对 象 和 类 使 用 V is u a l J + + 编 程 - 图5848 通 常 映 射 到 嵌 套 结 构 和 数 组 下 表 给 出 各 种支 持 的 映 射

Ja v a

本机

strin g

使用 @ d ll.s tru c t

标记 的类

指针 或 字 符 串嵌套 结 构

或 嵌 套的 定长 字 符 串

使 用 V is u a l J + + 编 程 - 图5849使 用 V is u a l J + + 编 程 - 图5850使 用 V is u a l J + + 编 程 - 图5851cha 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 [] 双 精 度的 嵌 套 数组

使 用 V is u a l J + + 编 程 - 图5852使 用 V is u a l J + + 编 程 - 图5853使 用 V is u a l J + + 编 程 - 图5854使 用 V is u a l J + + 编 程 - 图5855使 用 V is u a l J + + 编 程 - 图5856使 用 V is u a l J + + 编 程 - 图5857使 用 V is u a l J + + 编 程 - 图5858使 用 V is u a l J + + 编 程 - 图5859由 于 有 许 多 种 方 法 可 完 成 引 用 对 象 的 分 配 和 清 理 所 以 这 里 不 直 接 支持 结 构 内 部 的 指 针 为 了 表 示 带 嵌 套 指 针 的 结 构 需 声 明 此 指 针 字 段 为整 数 类 型 需 要 对 适 当 的 分 配 函 数 生 成 显 式 D L L 调 用 然 后 初 始 化 内存 块 可 以 使 用 D ll L ib . p tr T o S tru c t 将 这 块 内 存 映 射 到 @ d l l . S t ru c t 类 使 用 V is u a l J + + 编 程 - 图5860

嵌 套 的 结 构

使 用 V is u a l J + + 编 程 - 图5861使 用 V is u a l J + + 编 程 - 图5862使 用 V is u a l J + + 编 程 - 图5863使 用 V is u a l J + + 编 程 - 图5864结 构 可 通 过 命 名 其 他 结 构 作 为 字 段 类 型 来 简 单 地 嵌 套 另 一 个 结 构 例如 如 下 将 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 ;

使 用 V is u a l J + + 编 程 - 图5865下 面 直 接 翻 译 进 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 ;

}

使 用 V is u a l J + + 编 程 - 图5866使 用 V is u a l J + + 编 程 - 图5867使 用 V is u a l J + + 编 程 - 图5868使 用 V is u a l J + + 编 程 - 图5869使 用 V is u a l J + + 编 程 - 图5870使 用 V is u a l J + + 编 程 - 图5871使 用 V is u a l J + + 编 程 - 图5872使 用 V is u a l J + + 编 程 - 图5873使 用 V is u a l J + + 编 程 - 图5874使 用 V is u a l J + + 编 程 - 图5875使 用 V is u a l J + + 编 程 - 图5876使 用 V is u a l J + + 编 程 - 图5877提 示 尽 管 嵌 套 结 构 是 很 方 便 的 但 实 际 上 Java 并 不 真 正 支 持嵌 套 的 对 象 而 只 支 持 对 象 的 嵌 套 引 用 Microsoft VM 必 须 在 每次 传 递 嵌 套 结 构 时 在 两 种 格 式 之 间 进 行 转 换 然 而 在 关 键 性 的 代码 路 径 中 可 以 通 过 人 为 嵌 套 结 构 来 改 善 性 能 使 用 V is u a l J + + 编 程 - 图5878 通 过 把 嵌 套 结 构 的字 段 拷 贝 到 包 含 结 构 中 使 用 V is u a l J + + 编 程 - 图5879 例 如 M S G 结 构 中 的 Pt 字 段 可 以 很 容易 地 声 明 为 两 个 整 型 字 段 Pt_x 和 Pt_y

在 结 构 中 嵌 套 定 长 字 符 串

使 用 V is u a l J + + 编 程 - 图5880使 用 V is u a l J + + 编 程 - 图5881在 一 些 结 构 中 可 嵌 套 定 长 字 符 串 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 ;

使 用 V is u a l J + + 编 程 - 图5882在 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 ;

}

使 用 V is u a l J + + 编 程 - 图5883使 用 V is u a l J + + 编 程 - 图5884使 用 V is u a l J + + 编 程 - 图5885@ d l l . s t ru tm a p 伪 指 令 指 明 了 固 定 字 符 串 的 长 度 作 为 字 符 的 测 量 尺 度 对空 字 符 结 尾 的 串 包 括 空 格 使 用 V is u a l J + + 编 程 - 图5886

使 用 V is u a l J + + 编 程 - 图5887使 用 V is u a l J + + 编 程 - 图5888使 用 V is u a l J + + 编 程 - 图5889更 多 的 信 息 请 参 看 在 结 构 中 嵌 套 定 长 标 量 数 组

在 结 构 中 嵌 套 定 长 标 量 数 组

使 用 V is u a l J + + 编 程 - 图5890使 用 V is u a l J + + 编 程 - 图5891使 用 V is u a l J + + 编 程 - 图5892使 用 @ 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 ]

};

使 用 V is u a l J + + 编 程 - 图5893使 用 V is u a l J + + 编 程 - 图5894在 下 面 的 方 法 中 通 过 使 用 @ 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[];

}

结 构 装 填

使 用 V is u a l J + + 编 程 - 图5895使 用 V is u a l J + + 编 程 - 图5896在 AN S I C 草 案 3 .5 .2 .1 中 说 明 了 结 构 字 段 的 填 充 和 对 齐 可 通 过 使 用

使 用 V is u a l J + + 编 程 - 图5897p ack 修 饰 符 来 设 置 装 填 长 度

/* * @ d l l.s tru ct( p a c k = n ) */

使 用 V is u a l J + + 编 程 - 图5898使 用 V is u a l J + + 编 程 - 图5899使 用 V is u a l J + + 编 程 - 图5900使 用 V is u a l J + + 编 程 - 图5901使 用 V is u a l J + + 编 程 - 图5902使 用 V is u a l J + + 编 程 - 图5903使 用 V is u a l J + + 编 程 - 图5904使 用 V is u a l J + + 编 程 - 图5905使 用 V is u a l J + + 编 程 - 图5906使 用 V is u a l J + + 编 程 - 图5907这 里 的 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 之 间 的 关 系

使 用 V is u a l J + + 编 程 - 图5908使 用 V is u a l J + + 编 程 - 图5909使 用 V is u a l J + + 编 程 - 图5910使 用 V is u a l J + + 编 程 - 图5911使 用 V is u a l J + + 编 程 - 图5912使 用 V is u a l J + + 编 程 - 图5913使 用 V is u a l J + + 编 程 - 图5914使 用 V is u a l J + + 编 程 - 图5915使 用 V is u a l J + + 编 程 - 图5916使 用 V is u a l J + + 编 程 - 图5917使 用 V is u a l J + + 编 程 - 图5918使 用 V is u a l J + + 编 程 - 图5919使 用 V is u a l J + + 编 程 - 图5920使 用 V is u a l J + + 编 程 - 图5921@ 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 所 代 替 使 用 V is u a l J + + 编 程 - 图5922 最 重 要 的不 同 点 是 默 认 类 型 映 射 适 于 M c i rosoft W indow s 函 数 调 用 而 不 是 CO M 对 象 调 用 这 样 就 可 以 在 类 型 库 中 描 述 这 个 结 构 并 使 用 ja c tiv e x 工具 生 成 Ja va 类 以 生 成 @ d l l . s t ru c t 类 然 而 通 常 情 况 下 手 工 生 成 类更 快 些

指 针

使 用 V is u a l J + + 编 程 - 图5923使 用 V is u a l J + + 编 程 - 图5924使 用 V is u a l J + + 编 程 - 图5925使 用 V is u a l J + + 编 程 - 图5926使 用 V is u a l J + + 编 程 - 图5927使 用 V is u a l J + + 编 程 - 图5928Ja va 不 支 持 指 针 数 据 类 型 然 而 用 户 可 以 传 递 一 个 元 素 的 数 组 而 不是 传 递 指 针 可 以 在 Ja va 整 数 中 存 储 指 针 然 后 从 原 始 指 针 中 读 写 数据

返 回 值 指 针

使 用 V is u a l J + + 编 程 - 图5929使 用 V is u a l J + + 编 程 - 图5930使 用 V is u a l J + + 编 程 - 图5931使 用 V is u a l J + + 编 程 - 图5932通 常 具 有 多 个 返 回 值 的 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 ) ;

使 用 V is u a l J + + 编 程 - 图5933G 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 ) ;

使 用 V is u a l J + + 编 程 - 图5934使 用 V is u a l J + + 编 程 - 图5935在 Ja va 中 这 是 传 递 元 素 标 量 数 组 的 典 型 例 子 下 例 显 示 了 如 何 调 用

使 用 V is u a l J + + 编 程 - 图5936G 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[]);

}

原 始 指 针

使 用 V is u a l J + + 编 程 - 图5937使 用 V is u a l J + + 编 程 - 图5938使 用 V is u a l J + + 编 程 - 图5939使 用 V is u a l J + + 编 程 - 图5940使 用 V is u a l J + + 编 程 - 图5941使 用 V is u a l J + + 编 程 - 图5942使 用 V is u a l J + + 编 程 - 图5943使 用 V is u a l J + + 编 程 - 图5944使 用 V is u a l J + + 编 程 - 图5945使 用 V is u a l J + + 编 程 - 图5946使 用 V is u a l J + + 编 程 - 图5947使 用 V is u a l J + + 编 程 - 图5948使 用 V is u a l J + + 编 程 - 图5949使 用 V is u a l J + + 编 程 - 图5950使 用 V is u a l J + + 编 程 - 图5951未 知 的 或 难 以 实 现 的 结 构 指 针 可 存 放 于 普 通 的 Ja va 整 数 中 如 果 应 用程 序 只 需 存 储 指 针 而 不 需 要 引 用 它 那 就 是 是 最 简 单 且 最 有 效 的 方 法可 以 使 用 此 技 术 来 存 储 分 配 内 存 块 的 DL L 函 数 返 回 的 指 针 实 际 上可 以 使 用 这 种 技 术 来 存 储 任 何 D L L 函 数 返 回 的 指 针 不 用 说 使 用 原始 指 针 消 除 了 许 多 Ja va 安 全 性 的 优 点 只 要 可 能 都 应 使 用 其 他 方 法然 而 还 是 有 可 能 选 择 使 用 原 始 指 针 的 情 况 记 住 从 原 始 指 针 中 读 写数 据 有 两 种 方 式

转 换 引 用 为 @ D ll. S tru c t 类

使 用 V is u a l J + + 编 程 - 图5952使 用 V is u a l J + + 编 程 - 图5953使 用 V is u a l J + + 编 程 - 图5954使 用 V is u a l J + + 编 程 - 图5955使 用 V is u a l J + + 编 程 - 图5956使 用 V is u a l J + + 编 程 - 图5957通 过 原 始 指 针 中 读 写 数 据 的 一 种 方 法 是 将 原 始 指 针 转 换 为 对 @ 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;

使 用 V is u a l J + + 编 程 - 图5958使 用 V is u a l J + + 编 程 - 图5959使 用 V is u a l J + + 编 程 - 图5960使 用 V is u a l J + + 编 程 - 图5961使 用 V is u a l J + + 编 程 - 图5962使 用 V is u a l J + + 编 程 - 图5963使 用 V is u a l J + + 编 程 - 图5964使 用 V is u a l J + + 编 程 - 图5965在 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 拷 贝 方 法

使 用 V is u a l J + + 编 程 - 图5966使 用 V is u a l J + + 编 程 - 图5967使 用 V is u a l J + + 编 程 - 图5968使 用 V is u a l J + + 编 程 - 图5969使 用 V is u a l J + + 编 程 - 图5970使 用 V is u a l J + + 编 程 - 图5971使 用 V is u a l J + + 编 程 - 图5972从 原 始 指 针 中 读 写 数 据 的 另 一 种 方 法 是 在 D ll L ib 中 使 用 重 载 拷 贝 方 法这 些 方 法 在 各 种 类 型 的 Ja va 数 组 和 原 始 指 针 之 间 拷 贝 数 据 如 果 需 要把 原 始 指 针 作 为 指 向 字 符 串 的 指 针 L P TS TR 使 用 V is u a l J + + 编 程 - 图5973 可 以 使 用 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);

使 用 V is u a l J + + 编 程 - 图5974使 用 V is u a l J + + 编 程 - 图5975使 用 V is u a l J + + 编 程 - 图5976使 用 V is u a l J + + 编 程 - 图5977使 用 V is u a l J + + 编 程 - 图5978使 用 V is u a l J + + 编 程 - 图5979警 告 所 有 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

使 用 V is u a l J + + 编 程 - 图5980}

使 用 V is u a l J + + 编 程 - 图5981使 用 V is u a l J + + 编 程 - 图5982使 用 V is u a l J + + 编 程 - 图5983多 态 参 数

p t r 值 只 在 调 用 Cast 函 数 期 间 才 能 保 证 是 有 效 的 这 是 因 为 允 许 V M 实 现 通 过 拷 贝 来 执 行 数 组 的 传 递 并 且 因 为 在 对 Cast 函 数 的 调 用返 回 后 无 用 单 元 回 收 可 能 会 使 数 组 的 物 理 存 储 位 置 变 得 不 同

使 用 V is u a l J + + 编 程 - 图5984使 用 V is u a l J + + 编 程 - 图5985— 些 W in 3 2 函 数 声 明 参 数 的 类 型 依 赖 于 另 一 个 参 数 的 值 例 如 W in H e lp

使 用 V is u a l J + + 编 程 - 图5986函 数 声 明 如 下

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 ) ;

使 用 V is u a l J + + 编 程 - 图5987使 用 V is u a l J + + 编 程 - 图5988使 用 V is u a l J + + 编 程 - 图5989使 用 V is u a l J + + 编 程 - 图5990使 用 V is u a l J + + 编 程 - 图5991看 似 简 单 的 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 参 数 的 值

使 用 V is u a l J + + 编 程 - 图5992J /D i rect 提 供 两 种 方 法 来 声 明 这 种 参 数

  • 使 用 V is u a l J + + 编 程 - 图5993声 明

    此 参 数 作 为 O b ject 类 型

  • 使 用 V is u a l J + + 编 程 - 图5994使 用 V is u a l J + + 编 程 - 图5995

    每 种 可 能 的 类 型 使 用 过 载 来 声 明 分 离 方 法

使 用 V is u a l J + + 编 程 - 图5996使 用 V is u a l J + + 编 程 - 图5997使 用 V is u a l J + + 编 程 - 图5998使 用 V is u a l J + + 编 程 - 图5999关 于 这 两 种 方 法 的 比 较 请 参 看 本 章 后 面 的 两 种 方 法 的 比 较

声 明 参 数 为 O b je c t 类 型

使 用 V is u a l J + + 编 程 - 图6000下 面 给 出 了 如 何 通 过 声 明 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 ) ;

使 用 V is u a l J + + 编 程 - 图6001当 调 用 W in H e lp 时 J /D i rect 将 使 用 运 行 时 间 类 型 来 决 定 如 何 传 递

使 用 V is u a l J + + 编 程 - 图6002使 用 V is u a l J + + 编 程 - 图6003dw 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

使 用 V is u a l J + + 编 程 - 图6004使 用 V is u a l J + + 编 程 - 图6005ja v a .la n g .C h a r CH A R 如 果 un ic od e 或 o le 修 饰 符 有 效 则 是

W C H A R 使 用 V is u a l J + + 编 程 - 图6006

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

使 用 V is u a l J + + 编 程 - 图6007ja 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 )

使 用 V is u a l J + + 编 程 - 图6008或 o le 修 饰 符 有 效 则 是

使 用 V is u a l J + + 编 程 - 图6009或 o le 修 饰 符 有 效 则 是

重 载 函 数

使 用 V is u a l J + + 编 程 - 图6010声 明 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 ) ;

使 用 V is u a l J + + 编 程 - 图6011使 用 V is u a l J + + 编 程 - 图6012使 用 V is u a l J + + 编 程 - 图6013使 用 V is u a l J + + 编 程 - 图6014使 用 V is u a l J + + 编 程 - 图6015使 用 V is u a l J + + 编 程 - 图6016使 用 V is u a l J + + 编 程 - 图6017使 用 V is u a l J + + 编 程 - 图6018使 用 V is u a l J + + 编 程 - 图6019使 用 重 载 技 术 不 能 处 理 多 态 返 回 值 因 为 在 单 一 返 回 值 上 不 能 重 载 Ja va 方 法 因 此 必 须 给 函 数 的 每 种 变 体 起 不 同 的 Ja va 名 称 然 后 使 用en t ryp o in t 修 饰 符 来 把 它 们 链 接 到 相 同 的 D L L 方 法 要 了 解 其 他 D L L 方 法 的 更 多 信 息 请 参 看 本 章 后 面 的 别 名 使 用 V is u a l J + + 编 程 - 图6020 方 法 重 命 名 使 用 V is u a l J + + 编 程 - 图6021

两 种 方 法 的 比 较

使 用 V is u a l J + + 编 程 - 图6022使 用 V is u a l J + + 编 程 - 图6023使 用 V is u a l J + + 编 程 - 图6024使 用 V is u a l J + + 编 程 - 图6025使 用 V is u a l J + + 编 程 - 图6026使 用 V is u a l J + + 编 程 - 图6027在 大 多 数 实 例 中 优 先 考 虑 重 载 方 法 因 为 它 运 行 性 能 高 还 有 较 好 的类 型 检 查 另 外 重 载 避 免 了 在 In te g e r 对 象 内 部 封 装 整 数 参 数

使 用 V is u a l J + + 编 程 - 图6028使 用 V is u a l J + + 编 程 - 图6029使 用 V is u a l J + + 编 程 - 图6030使 用 V is u a l J + + 编 程 - 图6031使 用 V is u a l J + + 编 程 - 图6032使 用 V is u a l J + + 编 程 - 图6033然 而 在 有 多 个 多 态 参 数 的 情 况 中 声 明 参 数 为 类 型 O b je c t 是 很 有 用的 当 要 访 问 大 量 类 型 的 服 务 时 诸 如 可 以 接 受 使 用 @ d l l . s t ru c t 伪 指 令声 明 的 任 意 对 象 的 函 数 也 可 以 选 择 这 种 方 法

回 调

使 用 V is u a l J + + 编 程 - 图6034几 种 W in3 2 A P I 要 求 程 序 提 供 具 有 回 调 函 数 地 址 的 W in d o w s 在 Ja va

使 用 V is u a l J + + 编 程 - 图6035使 用 V is u a l J + + 编 程 - 图6036中 可 以 通 过 展 开 系 统 类 c o m .m s. d l l .c a llb a c k 来 写 回 调 函 数

声 明 带 有 回 调 的 方 法

使 用 V is u a l J + + 编 程 - 图6037使 用 V is u a l J + + 编 程 - 图6038使 用 V is u a l J + + 编 程 - 图6039使 用 V is u a l J + + 编 程 - 图6040使 用 V is u a l J + + 编 程 - 图6041在 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 ) ;

使 用 V is u a l J + + 编 程 - 图6042对 应 的 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 ) ;

调 用 带 回 调 的 函 数

使 用 V is u a l J + + 编 程 - 图6043使 用 V is u a l J + + 编 程 - 图6044使 用 V is u a l J + + 编 程 - 图6045使 用 V is u a l J + + 编 程 - 图6046使 用 V is u a l J + + 编 程 - 图6047为 了 调 用 带 回 调 的 函 数 必 须 定 义 展 开 的 类 为 C a l lb a c k 派 生 类 必 须 公布 一 个 非 静 态 的 方 法 它 的 名 称 是 ca l lb ac k 全 部 小 写 使 用 V is u a l J + + 编 程 - 图6048

使 用 V is u a l J + + 编 程 - 图6049W 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 ) ;

使 用 V is u a l J + + 编 程 - 图6050使 用 V is u a l J + + 编 程 - 图6051使 用 V is u a l J + + 编 程 - 图6052为 了 在 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 ) ;

}

使 用 V is u a l J + + 编 程 - 图6053可 以 使 用 如 下 方 法 调 用 带 有 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);

回 调 方 法 接 受 类 型 的 限 制

使 用 V is u a l J + + 编 程 - 图6054使 用 V is u a l J + + 编 程 - 图6055使 用 V is u a l J + + 编 程 - 图6056使 用 V is u a l J + + 编 程 - 图6057使 用 V is u a l J + + 编 程 - 图6058使 用 V is u a l J + + 编 程 - 图6059使 用 V is u a l J + + 编 程 - 图6060使 用 V is u a l J + + 编 程 - 图6061使 用 V is u a l J + + 编 程 - 图6062回 调 方 法 的 返 回 类 型 必 须 是 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 类 的指 针

用 回 调 关 联 数 据

使 用 V is u a l J + + 编 程 - 图6063使 用 V is u a l J + + 编 程 - 图6064使 用 V is u a l J + + 编 程 - 图6065使 用 V is u a l J + + 编 程 - 图6066使 用 V is u a l J + + 编 程 - 图6067使 用 V is u a l J + + 编 程 - 图6068使 用 V is u a l J + + 编 程 - 图6069经 常 需 要 把 一 些 数 据 从 函 数 的 调 用 程 序 传 到 回 调 程 序 这 解 释 了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 对 象 中 把 数 据 作 为 字 段 来 存 储

回 调 的 生 存 期

使 用 V is u a l J + + 编 程 - 图6070使 用 V is u a l J + + 编 程 - 图6071使 用 V is u a l J + + 编 程 - 图6072使 用 V is u a l J + + 编 程 - 图6073使 用 V is u a l J + + 编 程 - 图6074使 用 V is u a l J + + 编 程 - 图6075需 要 注 意 要 完 成 本 机 函 数 之 前 无 用 单 元 回 收 程 序 不 回 收 回 调 如 果回 调 是 短 期 的 使 用 V is u a l J + + 编 程 - 图6076 只 对 函 数 调 用 的 生 存 期 可 用 使 用 V is u a l J + + 编 程 - 图6077 则 不 需 要 特 殊 的 行 为因 为 对 D L L 函 数 传 递 的 回 调 可 以 保 证 在 调 用 过 程 中 不 必 由 无 用 单 元 回收 程 序 来 回 收

使 用 V is u a l J + + 编 程 - 图6078使 用 V is u a l J + + 编 程 - 图6079使 用 V is u a l J + + 编 程 - 图6080使 用 V is u a l J + + 编 程 - 图6081使 用 V is u a l J + + 编 程 - 图6082如 果 回 调 是 长 期 的 整 个 函 数 调 用 过 程 中 都 使 用 使 用 V is u a l J + + 编 程 - 图6083 将 必 须 在 Ja va 数据 结 构 中 通 过 存 储 它 的 引 用 防 止 回 调 被 回 收 也 可 以 在 本 机 数 据 结 构 中通 过 使 用 c o m .m s. d l l . ro o t 类 在 根 句 柄 内 封 装 此 回 调 来 存 储 回 调 的 引 用

使 用 V is u a l J + + 编 程 - 图6084使 用 V is u a l J + + 编 程 - 图6085使 用 V is u a l J + + 编 程 - 图6086使 用 V is u a l J + + 编 程 - 图6087使 用 V is u a l J + + 编 程 - 图6088使 用 V is u a l J + + 编 程 - 图6089根 句 柄 是 32 位 句 柄 它 可 以 防 止 回 调 被 回 收 直 到 句 柄 显 式 释 放 为 止例 如 W ndP ro c 的 根 句 柄 可 存 储 在 HW ND 结 构 的 应 用 数 据 区 中 并 且在 W M _ N C D ES TR O Y 消 息 中 显 式 释 放

在 结 构 内 部 嵌 套 回 调

使 用 V is u a l J + + 编 程 - 图6090使 用 V is u a l J + + 编 程 - 图6091使 用 V is u a l J + + 编 程 - 图6092使 用 V is u a l J + + 编 程 - 图6093使 用 V is u a l J + + 编 程 - 图6094为 把 回 调 嵌 套 到 结 构 内 部 必 须 先 调 用 c o m .m s . d ll. R o o t.a llo c 方 法 以 在根 句 柄 中 封 装 回 调 然 后 把 根 句 柄 传 递 到 D ll L ib . a d d r O f 方 法 以 获 得回 调 的 实 际 使 用 V is u a l J + + 编 程 - 图6095 本 机 使 用 V is u a l J + + 编 程 - 图6096 地 址 然 后 把 这 个 地 址 作 为 整 数 存 储

使 用 V is u a l J + + 编 程 - 图6097使 用 V is u a l J + + 编 程 - 图6098例 如 在 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 > * /

}

使 用 V is u a l J + + 编 程 - 图6099假 设 已 经 展 开 回 调 如 下

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 )

{

}

}

使 用 V is u a l J + + 编 程 - 图6100使 用 V is u a l J + + 编 程 - 图6101为 了 在 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函 数

使 用 V is u a l J + + 编 程 - 图6102本 节 提 供 关 于 O L E A P I 函 数 的 信 息

O L E 模 式 句 法

使 用 V is u a l J + + 编 程 - 图6103使 用 V is u a l J + + 编 程 - 图6104使 用 V is u a l J + + 编 程 - 图6105@ 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 函 数 的 比 较

使 用 V is u a l J + + 编 程 - 图6106使 用 V is u a l J + + 编 程 - 图6107使 用 V is u a l J + + 编 程 - 图6108使 用 V is u a l J + + 编 程 - 图6109使 用 V is u a l J + + 编 程 - 图6110使 用 V is u a l J + + 编 程 - 图6111理 论 上 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 函 数

  • 使 用 V is u a l J + + 编 程 - 图6112使 用 V is u a l J + + 编 程 - 图6113O

    L E 函 数 只 在 U n ic ode 中 出 现 这 里 没 有 AN S I O L E 函 数

  • 使 用 V is u a l J + + 编 程 - 图6114使 用 V is u a l J + + 编 程 - 图6115使 用 V is u a l J + + 编 程 - 图6116使 用 V is u a l J + + 编 程 - 图6117使 用 V is u a l J + + 编 程 - 图6118使 用 V is u a l J + + 编 程 - 图6119使 用 V is u a l J + + 编 程 - 图6120使 用 V is u a l J + + 编 程 - 图6121实 际 上 所 有 O L E 函 数 都 通 过 标 准 函 数 返 回 值 来 返 回 32 位 状 态 码即 HR ES U L T 高 位 指 出 函 数 是 成 功 高 位 关 闭 使 用 V is u a l J + + 编 程 - 图6122 还 是 失 败 高 位 打开 使 用 V is u a l J + + 编 程 - 图6123 少 量 函 数 可 返 回 多 个 成 功 值 通 常 有 S_ O K 和 S_ F A LS E 使 用 V is u a l J + + 编 程 - 图6124

使 用 V is u a l J + + 编 程 - 图6125使 用 V is u a l J + + 编 程 - 图6126但 大 多 数 只 返 回 一 个 成 功 值 S_ O K 使 用 V is u a l J + + 编 程 - 图6127

  • 使 用 V is u a l J + + 编 程 - 图6128使 用 V is u a l J + + 编 程 - 图6129使 用 V is u a l J + + 编 程 - 图6130使 用 V is u a l J + + 编 程 - 图6131使 用 V is u a l J + + 编 程 - 图6132如 果 O L E 函 数 除 状 态 码 外 还 返 回 多 个 值 则 调 用 程 序 应 提 供 指 向 变量 的 指 针 这 个 变 量 将 接 收 退 出 值 通 常 返 回 值 指 针 作 为 最 后 的 参数

  • 使 用 V is u a l J + + 编 程 - 图6133使 用 V is u a l J + + 编 程 - 图6134使 用 V is u a l J + + 编 程 - 图6135返 回 字 符 串 的 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 代 码

使 用 V is u a l J + + 编 程 - 图6136简 单 Ad d 函 数 的 代 码 看 起 来 像 W in 3 2 编 码 结 构 中 的 代 码

in t s u m ;

s u m = A d d ( 10, 20);

使 用 V is u a l J + + 编 程 - 图6137使 用 V is u a l J + + 编 程 - 图6138在 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 函 数

使 用 V is u a l J + + 编 程 - 图6139使 用 V is u a l J + + 编 程 - 图6140o 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 模 式 的 工 作 方 式

使 用 V is u a l J + + 编 程 - 图6141使 用 V is u a l J + + 编 程 - 图6142使 用 V is u a l J + + 编 程 - 图6143使 用 V is u a l J + + 编 程 - 图6144由 于 o le 修 饰 符 M ic rosoft V M 自 动 假 设 本 机 Ad d 函 数 返 回 HR E S U L T VM 通 知 Ad d 函 数 返 回 整 数 当 调 用 Ad d 时 V M 自 动 分 配 整 型 的 临

使 用 V is u a l J + + 编 程 - 图6145使 用 V is u a l J + + 编 程 - 图6146使 用 V is u a l J + + 编 程 - 图6147使 用 V is u a l J + + 编 程 - 图6148使 用 V is u a l J + + 编 程 - 图6149使 用 V is u a l J + + 编 程 - 图6150使 用 V is u a l J + + 编 程 - 图6151使 用 V is u a l J + + 编 程 - 图6152使 用 V is u a l J + + 编 程 - 图6153使 用 V is u a l J + + 编 程 - 图6154使 用 V is u a l J + + 编 程 - 图6155时 变 量 并 插 入 指 向 它 的 指 针 作 为 第 三 个 参 数 本 机 Ad d 函 数 返 回 后VM 自 动 检 查 HR ES U L T 并 且 如 果 它 指 出 了 失 败 高 位 打 开 使 用 V is u a l J + + 编 程 - 图6156 则发 出 类 型 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 函 数 的 真 正 返回 值 并 返 回 此 值

使 用 V is u a l J + + 编 程 - 图6157使 用 V is u a l J + + 编 程 - 图6158使 用 V is u a l J + + 编 程 - 图6159使 用 V is u a l J + + 编 程 - 图6160使 用 V is u a l J + + 编 程 - 图6161S_ 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 作 为 整 数 返 回 值

使 用 V is u a l J + + 编 程 - 图6162o le 模 式 修 改 D L L 调 用 的 语 义 概 括 如 下

  1. 使 用 V is u a l J + + 编 程 - 图6163所 有 字 符 串 和 字 符 都 假 设 为 U n ic ode

  2. 使 用 V is u a l J + + 编 程 - 图6164使 用 V is u a l J + + 编 程 - 图6165使 用 V is u a l J + + 编 程 - 图6166本 机 函 数 的 函 数 返 回 值 假 设 是 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

  3. 使 用 V is u a l J + + 编 程 - 图6167使 用 V is u a l J + + 编 程 - 图6168使 用 V is u a l J + + 编 程 - 图6169使 用 V is u a l J + + 编 程 - 图6170使 用 V is u a l J + + 编 程 - 图6171使 用 V is u a l J + + 编 程 - 图6172如 果 Ja va 方 法 返 回 类 型 不 是 vo id 则 M ic rosoft V M 将 被 假 设 本 机 函数 通 过 指 针 返 回 附 加 结 果 此 指 针 是 函 数 的 最 后 一 个 参 数 在 调 用 获得 附 加 返 回 值 之 后 VM 将 提 供 这 个 指 针 的 参 数 和 引 用 这 个 值 将 作为 Ja va 方 法 的 值 来 返 回

传 递 和 接 收 来 自 O L E 函 数 的 字 符 串

使 用 V is u a l J + + 编 程 - 图6173使 用 V is u a l J + + 编 程 - 图6174使 用 V is u a l J + + 编 程 - 图6175使 用 V is u a l J + + 编 程 - 图6176在 o le 模 式 函 数 上 声 明 一 个 参 数 为 S tr in g 类 型 来 传 递 LP C O L E ST R M ic rosoft V M 也 包 括 长 度 前 缀 所 以 这 个 字 符 串 可 以 作 为 BS T R

使 用 V is u a l J + + 编 程 - 图6177在 o le 模 式 中 声 明 返 回 值 为 S tr in g 类 型 可 使 M ic rosoft V M 传 递 指 向 未

使 用 V is u a l J + + 编 程 - 图6178使 用 V is u a l J + + 编 程 - 图6179使 用 V is u a l J + + 编 程 - 图6180使 用 V is u a l J + + 编 程 - 图6181初 始 化 的 LPC O L E ST R 的 指 针 当 本 机 函 数 返 回 时 M ic rosoft V M 将把 返 回 的 LPC O L E ST R 转 换 成 字 符 串 然 后 调 用 Co T a sk F e e 来 释 放 字符 串

使 用 V is u a l J + + 编 程 - 图6182使 用 V is u a l J + + 编 程 - 图6183传 递 GU ID s 及 IID s 和 C L S IDs

使 用 V is u a l J + + 编 程 - 图6184使 用 V is u a l J + + 编 程 - 图6185使 用 V is u a l J + + 编 程 - 图6186使 用 V is u a l J + + 编 程 - 图6187使 用 V is u a l J + + 编 程 - 图6188使 用 V is u a l J + + 编 程 - 图6189使 用 系 统 类 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 模 式 中 使 用 V is u a l J + + 编 程 - 图6190 未 初 始化 的 GU ID 的 指 针

使 用 V is u a l J + + 编 程 - 图6191使 用 V is u a l J + + 编 程 - 图6192使 用 V is u a l J + + 编 程 - 图6193例 如 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 使 用 的 可 读 名 称 之 间 进 行映 射

使 用 V is u a l J + + 编 程 - 图6194这 些 方 法 具 有 如 下 原 型

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 ) ;

使 用 V is u a l J + + 编 程 - 图6195使 用 V is u a l J + + 编 程 - 图6196在 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);

}

使 用 V is u a l J + + 编 程 - 图6197使 用 V is u a l J + + 编 程 - 图6198注 意 com.ms.com ._Guid 取 代 了 com.ms.com .Guid 使 用 V is u a l J + + 编 程 - 图6199 去 掉 了 下 划线 使 用 V is u a l J + + 编 程 - 图6200

传 递 VAR IA N T s

使 用 V is u a l J + + 编 程 - 图6201使 用 V is u a l J + + 编 程 - 图6202使 用 V is u a l J + + 编 程 - 图6203使 用 V is u a l J + + 编 程 - 图6204使 用 V is u a l J + + 编 程 - 图6205声 明 类 型 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 is u a l J + + 编 程 - 图6206 的 返 回 值 来为 本 机 函 数 传 递 指 向 未 被 初 始 化 的 V a r ia n t 的 指 针 以 进 行 填 充

传 递 CO M 接 口 指 针

使 用 V is u a l J + + 编 程 - 图6207使 用 V is u a l J + + 编 程 - 图6208使 用 V is u a l J + + 编 程 - 图6209使 用 V is u a l J + + 编 程 - 图6210使 用 V is u a l J + + 编 程 - 图6211为 传 递 CO M 接 口 指 针 必 须 使 用 诸 如 ja c tiv e x . e x e 之 类 的 工 具 来 生 成Ja va /C O M 接 口 类 然 后 通 过 声 明 接 口 类 型 的 参 数 来 传 递 或 接 收 CO M 接 口

使 用 V is u a l J + + 编 程 - 图6212使 用 V is u a l J + + 编 程 - 图6213使 用 V is u a l J + + 编 程 - 图6214使 用 V is u a l J + + 编 程 - 图6215例 如 系 统 类 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);

别 名 使 用 V is u a l J + + 编 程 - 图6216 方 法 重 命 名 使 用 V is u a l J + + 编 程 - 图6217

使 用 V is u a l J + + 编 程 - 图6218使 用 V is u a l J + + 编 程 - 图6219使 用 V is u a l J + + 编 程 - 图6220使 用 V is u a l J + + 编 程 - 图6221使 用 V is u a l J + + 编 程 - 图6222使 用 V is u a l J + + 编 程 - 图6223使 用 V is u a l J + + 编 程 - 图6224使 用 V is u a l J + + 编 程 - 图6225有 时 可 能 想 使 用 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 );

使 用 V is u a l J + + 编 程 - 图6226使 用 V is u a l J + + 编 程 - 图6227使 用 V is u a l J + + 编 程 - 图6228使 用 V is u a l J + + 编 程 - 图6229使 用 V is u a l J + + 编 程 - 图6230使 用 V is u a l J + + 编 程 - 图6231使 用 V is u a l J + + 编 程 - 图6232使 用 V is u a l J + + 编 程 - 图6233使 用 V is u a l J + + 编 程 - 图6234使 用 V is u a l J + + 编 程 - 图6235不 需 要 用 别 名 来 执 行 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 之 间 进 行 选 择 使 用 V is u a l J + + 编 程 - 图6236 当 访 问 通 过 a .d e f 文 件 导 出 的 函 数 时 也 不 必 使 用别 名 方 式 通 常 这 些 名 称 是 使 用 破 坏 标 准 调 用 s td ca ll m a n g in g 使 用 V is u a l J + + 编 程 - 图6237

使 用 V is u a l J + + 编 程 - 图6238使 用 V is u a l J + + 编 程 - 图6239的 方 式 导 出 的 以 下 范 例 给 出 了 _sa m p le @ 8 重 新 命 名 的 方 法 这 里 的 8

使 用 V is u a l J + + 编 程 - 图6240表 示 函 数 接 受 的 参 数 类 型 数 量 使 用 V is u a l J + + 编 程 - 图6241

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 ){

}

使 用 V is u a l J + + 编 程 - 图6242使 用 V is u a l J + + 编 程 - 图6243使 用 V is u a l J + + 编 程 - 图6244使 用 V is u a l J + + 编 程 - 图6245如 果 没 有 显 式 入 口 点 则 J /D i rect 自 动 对 破 坏 的 标 准 调 用 std c a l l - m a n g le d 使 用 V is u a l J + + 编 程 - 图6246 名 称 进 行 绑 定 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

按 序 号 链 接

使 用 V is u a l J + + 编 程 - 图6247使 用 V is u a l J + + 编 程 - 图6248使 用 V is u a l J + + 编 程 - 图6249使 用 V is u a l J + + 编 程 - 图6250使 用 V is u a l J + + 编 程 - 图6251— 些 D L L 是 通 过 序 号 16 位 整 数 使 用 V is u a l J + + 编 程 - 图6252 而 不 是 名 称 导 出 函 数 的 为 了 调 用这 样 的 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" ) */

使 用 V is u a l J + + 编 程 - 图6253注 意 ord ina l 是 以 十 进 制 形 式 指 定 的

使 用 V is u a l J + + 编 程 - 图6254使 用 V is u a l J + + 编 程 - 图6255使 用 V is u a l J + + 编 程 - 图6256使 用 V is u a l J + + 编 程 - 图6257使 用 V is u a l J + + 编 程 - 图6258例 如 要 以 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

使 用 V is u a l J + + 编 程 - 图6259使 用 V is u a l J + + 编 程 - 图6260使 用 V is u a l J + + 编 程 - 图6261在 类 定 义 之 前 可 以 使 用 @ 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);

}

使 用 V is u a l J + + 编 程 - 图6262使 用 V is u a l J + + 编 程 - 图6263为 每 种 方 法 指 定 @ 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);

}

使 用 V is u a l J + + 编 程 - 图6264使 用 V is u a l J + + 编 程 - 图6265使 用 V is u a l J + + 编 程 - 图6266使 用 V is u a l J + + 编 程 - 图6267在 类 级 使 用 @ d l l . im port 伪 指 令 可 以 节 省 .c la ss 文 件 中 的 空 间 并 消 除 了冗 余 的 信 息 然 而 类 级 的 @ d l l . im port 伪 指 令 不 是 通 过 子 类 来 继 承 的

VM 如 何 在 AN S I和 U n ic o d e 之 间 选 择

使 用 V is u a l J + + 编 程 - 图6268使 用 V is u a l J + + 编 程 - 图6269使 用 V is u a l J + + 编 程 - 图6270使 用 V is u a l J + + 编 程 - 图6271使 用 V is u a l J + + 编 程 - 图6272使 用 V is u a l J + + 编 程 - 图6273使 用 V is u a l J + + 编 程 - 图6274使 用 V is u a l J + + 编 程 - 图6275使 用 V is u a l J + + 编 程 - 图6276使 用 V is u a l J + + 编 程 - 图6277使 用 V is u a l J + + 编 程 - 图6278使 用 V is u a l J + + 编 程 - 图6279考 虑 介 绍 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 函 数 那 样 处 理 字 符 串 使 用 V is u a l J + + 编 程 - 图6280 必 须 存 在 于 两个 版 本 中 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 使 用 V is u a l J + + 编 程 - 图6281 当 在 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版 本

使 用 V is u a l J + + 编 程 - 图6282使 用 V is u a l J + + 编 程 - 图6283使 用 V is u a l J + + 编 程 - 图6284使 用 V is u a l J + + 编 程 - 图6285使 用 V is u a l J + + 编 程 - 图6286默 认 情 况 下 M ic rosoft V M 假 设 M e ss a g e B o x 函 数 的 AN S I 版 本 是 唯 一需 要 的 如 果 使 用 @ d l l . im port 不 带 修 饰 符 使 用 V is u a l J + + 编 程 - 图6287 导 入 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);

使 用 V is u a l J + + 编 程 - 图6288M ic rosoft V M 将 采 取 如 下 步 骤

  1. 使 用 V is u a l J + + 编 程 - 图6289使 用 V is u a l J + + 编 程 - 图6290使 用 V is u a l J + + 编 程 - 图6291使 用 V is u a l J + + 编 程 - 图6292使 用 V is u a l J + + 编 程 - 图6293字 符 串 的 文 本 和 标 题 转 换 成 AN S I 空 字 符 结 尾 的 字 符 串

  2. 使 用 V is u a l J + + 编 程 - 图6294VM 试 图 在 U S E R 32 .D L L 中 找 到 名 为 M e ss a g e B o x 的 出 口

  3. 使 用 V is u a l J + + 编 程 - 图6295使 用 V is u a l J + + 编 程 - 图6296使 用 V is u a l J + + 编 程 - 图6297使 用 V is u a l J + + 编 程 - 图6298若 此 尝 试 失 败 则 VM 在 名 称 上 追 加 A 然 后 寻 找 名 为 M e s sa g e B o x A

使 用 V is u a l J + + 编 程 - 图6299的 出 口

  1. 使 用 V is u a l J + + 编 程 - 图6300使 用 V is u a l J + + 编 程 - 图6301若 此 尝 试 成 功 则 VM 调 用 M e ss a g e B o x A 函 数

调 用 D L L 函 数 的 U n ic ode 版 本

使 用 V is u a l J + + 编 程 - 图6302使 用 V is u a l J + + 编 程 - 图6303使 用 V is u a l J + + 编 程 - 图6304假 设 不 想 调 用 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);

使 用 V is u a l J + + 编 程 - 图6305使 用 V is u a l J + + 编 程 - 图6306既 然 已 给 出 了 U n ic ode 修 饰 符 则 M ic rosoft V M 将 采 取 如 下 步 骤

  1. 使 用 V is u a l J + + 编 程 - 图6307使 用 V is u a l J + + 编 程 - 图6308使 用 V is u a l J + + 编 程 - 图6309使 用 V is u a l J + + 编 程 - 图6310使 用 V is u a l J + + 编 程 - 图6311字 符 串 的 文 本 和 标 题 转 换 成 U n ic o d e 空 字 符 结 尾 的 字 符 串

  2. 使 用 V is u a l J + + 编 程 - 图6312VM 试 图 在 U S E R 32 .D L L 中 找 到 名 为 M e ss a g e B o x 的 出 口

  3. 使 用 V is u a l J + + 编 程 - 图6313使 用 V is u a l J + + 编 程 - 图6314使 用 V is u a l J + + 编 程 - 图6315使 用 V is u a l J + + 编 程 - 图6316若 尝 试 失 败 则 VM 在 名 称 上 追 加 W 然 后 寻 找 名 为 M e ss a g e B oxW

使 用 V is u a l J + + 编 程 - 图6317的 出 口

  1. 使 用 V is u a l J + + 编 程 - 图6318若 尝 试 成 功 则 VM 调 用 M e ss a g e B o x W 函 数

调 用 D L L 函 数 的 最 佳 版 本

使 用 V is u a l J + + 编 程 - 图6319使 用 V is u a l J + + 编 程 - 图6320使 用 V is u a l J + + 编 程 - 图6321使 用 V is u a l J + + 编 程 - 图6322使 用 V is u a l J + + 编 程 - 图6323使 用 V is u a l J + + 编 程 - 图6324使 用 V is u a l J + + 编 程 - 图6325使 用 V is u a l J + + 编 程 - 图6326使 用 V is u a l J + + 编 程 - 图6327使 用 V is u a l J + + 编 程 - 图6328不 幸 的 是 调 用 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 函 数 的最 佳 版 本

使 用 V is u a l J + + 编 程 - 图6329使 用 au to 修 饰 符 提 供 了 这 两 种 优 点 下 面 的 例 子 显 示 了 如 何 调 用

使 用 V is u a l J + + 编 程 - 图6330M 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);

使 用 V is u a l J + + 编 程 - 图6331使 用 V is u a l J + + 编 程 - 图6332使 用 V is u a l J + + 编 程 - 图6333使 用 V is u a l J + + 编 程 - 图6334使 用 V is u a l J + + 编 程 - 图6335使 用 V is u a l J + + 编 程 - 图6336使 用 V is u a l J + + 编 程 - 图6337使 用 V is u a l J + + 编 程 - 图6338使 用 V is u a l J + + 编 程 - 图6339当 给 定 了 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 系 统 上 都 能 运 行

使 用 V is u a l J + + 编 程 - 图6340使 用 V is u a l J + + 编 程 - 图6341使 用 V is u a l J + + 编 程 - 图6342使 用 V is u a l J + + 编 程 - 图6343使 用 V is u a l J + + 编 程 - 图6344使 用 V is u a l J + + 编 程 - 图6345使 用 V is u a l J + + 编 程 - 图6346— 般 来 说 无 论 何 时 调 用 U n ic ode A P I 函 数 都 可 以 使 用 au to 修 饰 符如 果 调 用 自 己 的 D L L s 则 根 据 自 己 的 需 要 选 择 an s i 默 认 使 用 V is u a l J + + 编 程 - 图6347 或 U n ic ode 下 表 给 出 了 当 使 用 au to 修 饰 符 时 VM 如 何 决 定 使 用 AN S I 或 U n ic ode 的细 节

  1. 使 用 V is u a l J + + 编 程 - 图6348使 用 V is u a l J + + 编 程 - 图6349使 用 V is u a l J + + 编 程 - 图6350VM 打 开 注 册 表 键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 此 值 是 下 列 几 种 之 一

使 用 V is u a l J + + 编 程 - 图6351使 用 V is u a l J + + 编 程 - 图63522 — A N S I 一 直 使 用 AN S I 版 本

使 用 V is u a l J + + 编 程 - 图6353使 用 V is u a l J + + 编 程 - 图63543— U n ic ode 一 直 使 用 U n ic ode 版 本

使 用 V is u a l J + + 编 程 - 图6355使 用 V is u a l J + + 编 程 - 图63564 — P la tfo rt 根 据 平 台 确 定 使 用 AN S I 或 U n ic ode

  1. 使 用 V is u a l J + + 编 程 - 图6357使 用 V is u a l J + + 编 程 - 图6358使 用 V is u a l J + + 编 程 - 图6359使 用 V is u a l J + + 编 程 - 图6360

    果 键 不 存 在 或 如 果 它 已 经 设 置 为 4 表 示 平 台 则 VM 调 用 W in 3 2 Ge t V e rs io n 函 数 然 后 检 查 高 位 来 确 定 本 平 台 是 M ic rosoft W indow s

使 用 V is u a l J + + 编 程 - 图6361使 用 V is u a l J + + 编 程 - 图6362使 用 V is u a l J + + 编 程 - 图636395 还 是 M ic rosoft W indow s N T 如 果 平 台 是 W ind ow s 95 则 使 用

使 用 V is u a l J + + 编 程 - 图6364使 用 V is u a l J + + 编 程 - 图6365AN S I 模 式 否 则 使 用 U n ic ode 模 式

使 用 V is u a l J + + 编 程 - 图6366使 用 V is u a l J + + 编 程 - 图6367使 用 V is u a l J + + 编 程 - 图6368使 用 V is u a l J + + 编 程 - 图6369使 用 V is u a l J + + 编 程 - 图6370使 用 V is u a l J + + 编 程 - 图6371使 用 V is u a l J + + 编 程 - 图6372没 有 必 要 自 己 设 置 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

使 用 V is u a l J + + 编 程 - 图6373An s i , U n ic o d e 和 au to 也 可 用 于 @ d l l . s t ru c t 伪 指 令

通 过 D L L 函 数 获 得 错 误 代 码

使 用 V is u a l J + + 编 程 - 图6374使 用 V is u a l J + + 编 程 - 图6375使 用 V is u a l J + + 编 程 - 图6376使 用 V is u a l J + + 编 程 - 图6377使 用 V is u a l J + + 编 程 - 图6378使 用 V is u a l J + + 编 程 - 图6379使 用 V is u a l J + + 编 程 - 图6380不 调 用 W in3 2 函 数 G e t L a s t E rro r 而 是 通 过 另 一 个 D L L 调 用 也 可 以获 得 错 误 代 码 因 为 M ic rosoft V M 可 能 在 执 行 Ja va 代 码 的 过 程 中 执 行自 身 的 函 数 调 用 所 以 在 获 得 错 误 代 码 时 它 可 能 已 经 被 已 经 重 写 了

使 用 V is u a l J + + 编 程 - 图6381使 用 V is u a l J + + 编 程 - 图6382使 用 V is u a l J + + 编 程 - 图6383使 用 V is u a l J + + 编 程 - 图6384使 用 V is u a l J + + 编 程 - 图6385使 用 V is u a l J + + 编 程 - 图6386为 了 可 靠 地 通 过 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 线 程 都 独 立 保 存 这 个 值

使 用 V is u a l J + + 编 程 - 图6387使 用 V is u a l J + + 编 程 - 图6388使 用 V is u a l J + + 编 程 - 图6389例 如 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 ) ;

使 用 V is u a l J + + 编 程 - 图6390典 型 的 调 用 如 下

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

使 用 V is u a l J + + 编 程 - 图6391使 用 V is u a l J + + 编 程 - 图6392使 用 V is u a l J + + 编 程 - 图6393使 用 V is u a l J + + 编 程 - 图6394有 时 可 能 需 要 比 @ d l l . im port 伪 指 令 正 常 提 供 的 更 多 控 件 来 控 制 加 载和 链 接 过 程 比 如 需 求 可 能 包 括

  • 使 用 V is u a l J + + 编 程 - 图6395加 载

    库 它 的 名 称 和 路 径 必 须 是 在 运 行 时 计 算 的 或 从 用 户 输 入 产 生

使 用 V is u a l J + + 编 程 - 图6396

  • 使 用 V is u a l J + + 编 程 - 图6397在 处

    理 终 止 之 前 释 放 库

  • 使 用 V is u a l J + + 编 程 - 图6398使 用 V is u a l J + + 编 程 - 图6399

    行 函 数 它 的 名 称 和 顺 序 必 须 在 运 行 时 计 算

使 用 V is u a l J + + 编 程 - 图6400使 用 V is u a l J + + 编 程 - 图6401使 用 V is u a l J + + 编 程 - 图6402W 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 的 加 载 和 释 放

使 用 V is u a l J + + 编 程 - 图6403使 用 V is u a l J + + 编 程 - 图6404使 用 V is u a l J + + 编 程 - 图6405使 用 V is u a l J + + 编 程 - 图6406使 用 V is u a l J + + 编 程 - 图6407G e t P ro c A ddre s s 函 数 允 许 链 接 到 特 定 的 出 口 G e t P ro c A d d re s s 函 数 返 回一 个 函 数 指 针 所 以 可 通 过 函 数 指 针 调 用 任 何 语 言 这 样 可 以 实 现 动态 调 用 而 毫 无 问 题

使 用 V is u a l J + + 编 程 - 图6408J /D i rect 允 许 Ja va 程 序 员 以 下 列 方 式 声 明 需 要 的 函 数

使 用 V is u a l J + + 编 程 - 图6409使 用 V is u a l J + + 编 程 - 图6410使 用 V is u a l J + + 编 程 - 图6411注 意 如 果 使 用 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);

使 用 V is u a l J + + 编 程 - 图6412使 用 V is u a l J + + 编 程 - 图6413使 用 V is u a l J + + 编 程 - 图6414使 用 V is u a l J + + 编 程 - 图6415使 用 V is u a l J + + 编 程 - 图6416注 意 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 系 统 上 是失 败 的

使 用 V is u a l J + + 编 程 - 图6417使 用 V is u a l J + + 编 程 - 图6418使 用 V is u a l J + + 编 程 - 图6419使 用 V is u a l J + + 编 程 - 图6420使 用 V is u a l J + + 编 程 - 图6421使 用 V is u a l J + + 编 程 - 图6422使 用 V is u a l J + + 编 程 - 图6423调 用 函 数 唯 一 留 下 的 问 题 是 通 过 G e t P ro c A ddre s s 获 得 的 为 了 方 便 起见 m sja v a . d ll 实 现 M ic rosoft V M 的 D L L 使 用 V is u a l J + + 编 程 - 图6424 导 出 名 为 ca l l 的 指 定 函 数ca l l 函 数 的 第 一 个 参 数 是 指 向 第 二 个 函 数 的 指 针 所 有 调 用 所 做 的 就 是调 用 第 二 个 函 数 把 它 传 递 给 其 余 参 数

使 用 V is u a l J + + 编 程 - 图6425下 面 是 关 于 应 用 程 序 如 何 加 载 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与 原 始 本 机 接 口 比 较

使 用 V is u a l J + + 编 程 - 图6426使 用 V is u a l J + + 编 程 - 图6427使 用 V is u a l J + + 编 程 - 图6428J /D r iect 与 原 始 本 机 接 口 RN I 使 用 V is u a l J + + 编 程 - 图6429 是 互 补 的 技 术 使 用 RN I 要 求 D L L 函数 遵 循 严 格 的 命 名 约 定 要 求 D L L 函 数 可 以 与 Ja va 无 用 单 元 回 收 程 序

使 用 V is u a l J + + 编 程 - 图6430使 用 V is u a l J + + 编 程 - 图6431使 用 V is u a l J + + 编 程 - 图6432使 用 V is u a l J + + 编 程 - 图6433使 用 V is u a l J + + 编 程 - 图6434使 用 V is u a l J + + 编 程 - 图6435使 用 V is u a l J + + 编 程 - 图6436使 用 V is u a l J + + 编 程 - 图6437使 用 V is u a l J + + 编 程 - 图6438使 用 V is u a l J + + 编 程 - 图6439使 用 V is u a l J + + 编 程 - 图6440协 调 工 作 也 就 是 说 RN I 函 数 必 须 保 证 在 消 耗 时 间 的 代 码 起 始 yie ld 使 用 V is u a l J + + 编 程 - 图6441代 码 阻 塞 其 他 线 程 的 代 码 阻 塞 用 户 输 入 的 代 码 周 围 调 用 GC En a b le 和 GC D isa b le 在 Ja va 环 境 中 必 须 特 别 设 计 RN I 函 数 作 为 回 报 RN I 函 数 对 Ja va 对 象 内 部 和 Ja va 类 加 载 程 序 可 获 得 快 速 访 问

使 用 V is u a l J + + 编 程 - 图6442使 用 V is u a l J + + 编 程 - 图6443使 用 V is u a l J + + 编 程 - 图6444使 用 V is u a l J + + 编 程 - 图6445使 用 V is u a l J + + 编 程 - 图6446使 用 V is u a l J + + 编 程 - 图6447使 用 V is u a l J + + 编 程 - 图6448使 用 V is u a l J + + 编 程 - 图6449使 用 V is u a l J + + 编 程 - 图6450使 用 V is u a l J + + 编 程 - 图6451使 用 V is u a l J + + 编 程 - 图6452使 用 V is u a l J + + 编 程 - 图6453使 用 V is u a l J + + 编 程 - 图6454使 用 V is u a l J + + 编 程 - 图6455使 用 V is u a l J + + 编 程 - 图6456使 用 V is u a l J + + 编 程 - 图6457使 用 V is u a l J + + 编 程 - 图6458使 用 V is u a l J + + 编 程 - 图6459使 用 V is u a l J + + 编 程 - 图6460使 用 V is u a l J + + 编 程 - 图6461使 用 V is u a l J + + 编 程 - 图6462使 用 V is u a l J + + 编 程 - 图6463J /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 自 动 转 换 普 通 数 据 类 型 如 字符 串 和 结 构 使 用 V is u a l J + + 编 程 - 图6464 为 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 函 数 操 纵 的 对象 句 柄 原 本 就 是 不 稳 定 的

使 用 V is u a l J + + 编 程 - 图6465使 用 V is u a l J + + 编 程 - 图6466幸 运 的 是 可 以 使 用 RN I 或 J / D irect 或 两 者 使 用 V is u a l J + + 编 程 - 图6467 编 译 器 和 M ic rosoft V M

使 用 V is u a l J + + 编 程 - 图6468允 许 根 据 需 要 在 相 同 的 类 中 混 合 和 匹 配 J /D i rect 和 RN I

安 全 问 题

使 用 V is u a l J + + 编 程 - 图6469对 独 立 的 Ja va 应 用 程 序 和 信 任 的 内 部 网 W e b 应 用 程 序 来 说 尽 管 J /D i re c t

使 用 V is u a l J + + 编 程 - 图6470使 用 V is u a l J + + 编 程 - 图6471使 用 V is u a l J + + 编 程 - 图6472使 用 V is u a l J + + 编 程 - 图6473是 非 常 有 力 的 特 征 但 它 显 然 太 强 大 了 以 致 于 不 能 被 W e b 上 的 普 通 Ja va 小 应 用 程 序 使 用 本 节 描 述 J /D i rect 如 何 与 M ic rosoft V M 的 安 全 系 统 一起 防 止 不 被 信 任 的 代 码 错 误 地 访 问 J /D i rect 提 供 的 功 能

信 任 与 不 信 任 的 类

使 用 V is u a l J + + 编 程 - 图6474J /D i rect 把 所 有 加 载 的 类 分 成 了 两 种

  1. 使 用 V is u a l J + + 编 程 - 图6475使 用 V is u a l J + + 编 程 - 图6476完 全 信 任 指 出 了 最 大 权 限 使 用 V is u a l J + + 编 程 - 图6477

  2. 使 用 V is u a l J + + 编 程 - 图6478不 信 任

使 用 V is u a l J + + 编 程 - 图6479使 用 V is u a l J + + 编 程 - 图6480使 用 V is u a l J + + 编 程 - 图6481只 有 完 全 信 任 的 类 才 允 许 使 用 J /D i rect 如 果 以 下 有 一 条 语 句 是 正 确 的则 认 为 Ja va 类 是 完 全 信 任 的

  • 使 用 V is u a l J + + 编 程 - 图6482使 用 V is u a l J + + 编 程 - 图6483使 用 V is u a l J + + 编 程 - 图6484

    进 行 数 字 签 名 指 出 完 全 信 任 这 种 类 的 例 子 有 签 名 的 小 应 用 程 序

  • 使 用 V is u a l J + + 编 程 - 图6485使 用 V is u a l J + + 编 程 - 图6486使 用 V is u a l J + + 编 程 - 图6487在 目 标 计 算 机 的 C L A S S P A T H 上 安 装 的 类 或 通 过 软 件 包 管 理 器 安装 的 类 为 在 多 个 小 应 用 程 序 之 间 共 享 而 设 计 的 数 字 签 名 库 必 须 遵 循这 项 准 则

  • 使 用 V is u a l J + + 编 程 - 图6488使 用

    JV IE W 或 W J V IE W 应 用 程 序 把 类 作 为 非 浏 览 器 应 用 程 序 来 运行

使 用 V is u a l J + + 编 程 - 图6489使 用 V is u a l J + + 编 程 - 图6490使 用 V is u a l J + + 编 程 - 图6491另 一 方 面 W e b 上 未 签 名 的 小 应 用 程 序 是 不 信 任 的 Ja va 代 码

J /D ire c t方 法 调 用 的 安 全 检 查 点

使 用 V is u a l J + + 编 程 - 图6492M ic rosoft V M 在 三 个 不 同 的 时 间 为 J /D i rect 方 法 应 用 安 全 检 查

  1. 使 用 V is u a l J + + 编 程 - 图6493连 接 时

  2. 使 用 V is u a l J + + 编 程 - 图6494第 一 次 调 用 时

  3. 使 用 V is u a l J + + 编 程 - 图6495每 次 调 用 时

使 用 V is u a l J + + 编 程 - 图6496只 有 在 传 递 任 意 三 个 安 全 检 查 中 的 一 个 或 显 式 禁 用 时 才 尝 试 J /D i re c t

使 用 V is u a l J + + 编 程 - 图6497调 用

链 接 时 的 安 全 检 查

使 用 V is u a l J + + 编 程 - 图6498使 用 V is u a l J + + 编 程 - 图6499使 用 V is u a l J + + 编 程 - 图6500使 用 V is u a l J + + 编 程 - 图6501使 用 V is u a l J + + 编 程 - 图6502使 用 V is u a l J + + 编 程 - 图6503使 用 V is u a l J + + 编 程 - 图6504使 用 V is u a l J + + 编 程 - 图6505当 Ja va 类 调 用 或 访 问 使 用 R e f le c t io n A P I 使 用 V is u a l J + + 编 程 - 图6506 另 一 类 的 成 员 时 才 进 行链 接 在 链 接 时 M ic rosoft V M 查 看 引 用 的 类 是 否 是 可 访 问 的 传 递 参数 的 类 型 和 数 目 是 否 正 确 如 果 类 在 相 同 的 软 件 包 中 或 已 声 明 为 公 共的 则 认 为 此 类 是 可 访 问 的

使 用 V is u a l J + + 编 程 - 图6507使 用 V is u a l J + + 编 程 - 图6508使 用 V is u a l J + + 编 程 - 图6509使 用 V is u a l J + + 编 程 - 图6510使 用 V is u a l J + + 编 程 - 图6511使 用 V is u a l J + + 编 程 - 图6512使 用 V is u a l J + + 编 程 - 图6513使 用 V is u a l J + + 编 程 - 图6514使 用 V is u a l J + + 编 程 - 图6515使 用 V is u a l J + + 编 程 - 图6516使 用 V is u a l J + + 编 程 - 图6517使 用 V is u a l J + + 编 程 - 图6518使 用 V is u a l J + + 编 程 - 图6519使 用 V is u a l J + + 编 程 - 图6520使 用 标 准 的 Ja va 语 言 对 类 的 可 访 问 性 限 于 两 种 选 项 可 以 声 明 一个 公 共 的 类 使 用 V is u a l J + + 编 程 - 图6521 每 个 人 都 可 链 接 到 它 使 用 V is u a l J + + 编 程 - 图6522或 声 明 不 带 有 公 共 修 饰 符 的 类 使 用 V is u a l J + + 编 程 - 图6523 只有 在 相 同 软 件 包 中 的 类 才 能 链 接 到 它 使 用 V is u a l J + + 编 程 - 图6524 然 而 使 用 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) */

使 用 V is u a l J + + 编 程 - 图6525使 用 V is u a l J + + 编 程 - 图6526使 用 V is u a l J + + 编 程 - 图6527使 用 V is u a l J + + 编 程 - 图6528使 用 V is u a l J + + 编 程 - 图6529使 用 V is u a l J + + 编 程 - 图6530使 用 V is u a l J + + 编 程 - 图6531使 用 V is u a l J + + 编 程 - 图6532使 用 V is u a l J + + 编 程 - 图6533使 用 V is u a l J + + 编 程 - 图6534使 用 V is u a l J + + 编 程 - 图6535使 用 V is u a l J + + 编 程 - 图6536重 要 的 是 要 注 意 这 种 安 全 检 查 只 防 止 不 信 任 的 调 用 程 序 直 接 调 用 保护 的 类 并 不 防 止 间 接 调 用 第 三 使 用 V is u a l J + + 编 程 - 图6537 完 全 信 任 的 使 用 V is u a l J + + 编 程 - 图6538 类 可 以 将 不 信 任 调用 程 序 的 调 用 转 发 到 保 护 的 类 然 而 这 是 一 种 防 护 措 施 中 间 类必 须 在 目 标 计 算 机 的 C L A S S P A T H 上 安 装 或 必 须 已 经 为 最 大 信 任 度进 行 数 字 签 名 并 使 用 浏 览 器 安 装

首 次 调 用 的 安 全 检 查

使 用 V is u a l J + + 编 程 - 图6539使 用 V is u a l J + + 编 程 - 图6540使 用 V is u a l J + + 编 程 - 图6541使 用 V is u a l J + + 编 程 - 图6542使 用 V is u a l J + + 编 程 - 图6543使 用 V is u a l J + + 编 程 - 图6544使 用 V is u a l J + + 编 程 - 图6545使 用 V is u a l J + + 编 程 - 图6546使 用 V is u a l J + + 编 程 - 图6547使 用 V is u a l J + + 编 程 - 图6548使 用 V is u a l J + + 编 程 - 图6549使 用 V is u a l J + + 编 程 - 图6550使 用 V is u a l J + + 编 程 - 图6551使 用 V is u a l J + + 编 程 - 图6552使 用 V is u a l J + + 编 程 - 图6553方 法 的 第 一 次 调 用 是 指 第 一 次 从 任 一 调 用 程 序 调 用 此 方 法 此 时 对 于本 机 关 键 字 所 标 记 的 任 何 一 种 方 法 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 只 有 完 全 信 任 的类 才 可 以 有 本 机 方 法 作 为 成 员 使 用 V is u a l J + + 编 程 - 图6554 因 为 这 项 安 全 检 查 并 不 依 赖 于 调 用上 下 文 所 以 它 只 须 一 次 执 行 如 果 已 传 递 则 在 将 来 的 调 用 中 就 不 再进 行 检 查 这 里 没 有 方 法 来 禁 止 安 全 检 查

每 次 调 用 的 安 全 检 查

使 用 V is u a l J + + 编 程 - 图6555使 用 V is u a l J + + 编 程 - 图6556使 用 V is u a l J + + 编 程 - 图6557使 用 V is u a l J + + 编 程 - 图6558使 用 V is u a l J + + 编 程 - 图6559使 用 V is u a l J + + 编 程 - 图6560使 用 V is u a l J + + 编 程 - 图6561使 用 V is u a l J + + 编 程 - 图6562使 用 V is u a l J + + 编 程 - 图6563使 用 V is u a l J + + 编 程 - 图6564使 用 V is u a l J + + 编 程 - 图6565这 是 最 严 格 的 有 效 性 检 查 在 每 次 调 用 都 检 查 整 个 调 用 栈 即 使 在 调用 栈 上 发 现 调 用 程 序 不 是 完 全 信 任 的 也 发 出 S ecu r i ty E x cep t io n 默 认情 况 下 所 有 J /D i rect 方 法 都 执 行 这 项 检 查 RN I 方 法 不 执 行 这 项 检 查这 是 由 于 向 后 兼 容 的 需 要 RN I 的 设 计 允 许 从 原 始 JD K 1 . 0 本 机 接 口 很容 易 地 进 行 移 植 此 接 口 不 提 供 安 全 检 查

使 用 V is u a l J + + 编 程 - 图6566尽 管 此 安 全 检 查 提 供 了 最 大 的 安 全 性 M ic rosoft 也 提 供 了 一 种 禁 用 它

使 用 V is u a l J + + 编 程 - 图6567使 用 V is u a l J + + 编 程 - 图6568使 用 V is u a l J + + 编 程 - 图6569使 用 V is u a l J + + 编 程 - 图6570使 用 V is u a l J + + 编 程 - 图6571的 方 法 提 供 此 禁 止 机 制 是 因 为 严 格 的 安 全 检 查 有 两 点 副 作 用

可能 的 性 能 下 降 这 项 安 全 性 检查 需 要 在 每次调 用 J/ D ire c t 方法 时 扫 描 整 个 调用堆 栈 在 信 任 的 小 应用程 序上 性能 的 下 降最 为 显 著 它通常 是 用 现 有 的 安 全 性管理 器来 运行的 另一 方 面 应 用 程序 通 常看 不到 大 幅 性能 下 降 这是 由于 J / D i rect 对没 有安全管 理 器的 应 用 程序 忽略 了 堆 栈扫 描

使 用 V is u a l J + + 编 程 - 图6572使 用 V is u a l J + + 编 程 - 图6573使 用 V is u a l J + + 编 程 - 图6574使 用 V is u a l J + + 编 程 - 图6575使 用 V is u a l J + + 编 程 - 图6576in fle x ib ility 这个 安 全 机 制 强 制 使 用最大 权限 甚至 是 在 一些 情 况 下 只

使 用 V is u a l J + + 编 程 - 图6577使 用 V is u a l J + + 编 程 - 图6578使 用 V is u a l J + + 编 程 - 图6579使 用 V is u a l J + + 编 程 - 图6580使 用 V is u a l J + + 编 程 - 图6581需 要 特定 的权 限 例如 要考 虑使 用 J/ D ire c t 用安 全方 式 公布单 一 权 限 到 不 信 任 的小应 用程 序 对于 此库 来 说 应 当 关闭 调 用时 间安 全 检 查 特 征 并为 具体的 权 限 执行 自 己 的 安 全检查

使 用 V is u a l J + + 编 程 - 图6582使 用 V is u a l J + + 编 程 - 图6583@ se c u r i ty 伪 指 令 禁 用 每 次 调 用 的 安 全 检 查 句 法 如 下

/* * @ s ecurit y ( ch eckD llC a lls = o f f ) */

使 用 V is u a l J + + 编 程 - 图6584使 用 V is u a l J + + 编 程 - 图6585使 用 V is u a l J + + 编 程 - 图6586@ 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();

}

使 用 V is u a l J + + 编 程 - 图6587使 用 V is u a l J + + 编 程 - 图6588使 用 V is u a l J + + 编 程 - 图6589使 用 V is u a l J + + 编 程 - 图6590使 用 V is u a l J + + 编 程 - 图6591使 用 V is u a l J + + 编 程 - 图6592使 用 V is u a l J + + 编 程 - 图6593使 用 V is u a l J + + 编 程 - 图6594使 用 V is u a l J + + 编 程 - 图6595注 意 如 果 禁 用 这 项 安 全 检 查 会 将 M ic rosoft V M 的 安 全 性 责 任 转 换到 用 户 那 里 要 记 住 即 使 禁 止 了 安 全 性 检 查 对 于 最 大 信 任 的 类 仍然 必 须 数 字 签 名 如 果 决 定 使 用 这 条 伪 指 令 请 确 保 采 用 如 下 预 防 措 施

  • 使 用 V is u a l J + + 编 程 - 图6596所 有

    J /D i rect 方 法 都 已 声 明 为 专 用

  • 使 用 V is u a l J + + 编 程 - 图6597使 用 V is u a l J + + 编 程 - 图6598任 何 公 共 可 访 问 的 方 法 都 不 能 盲 目 为 J /D i re c t 传 递 调 用 程 序 参 数 用户 必 须 负 责 保 证 只 有 有 效 的 参 数 可 以 传 递 到 本 机 代 码

  • 使 用 V is u a l J + + 编 程 - 图6599使 用 V is u a l J + + 编 程 - 图6600

    公 布 的 能 力 不 应 当 多 于 需 要 的 能 力 应 当 通 过 适 当 的 安 全 检 查 防 止对 这 些 功 能 的 访 问

使 用 V is u a l J + + 编 程 - 图6601使 用 V is u a l J + + 编 程 - 图6602使 用 V is u a l J + + 编 程 - 图6603使 用 V is u a l J + + 编 程 - 图6604使 用 V is u a l J + + 编 程 - 图6605使 用 V is u a l J + + 编 程 - 图6606使 用 V is u a l J + + 编 程 - 图6607重 点 即 使 小 应 用 程 序 是 信 任 的 来 自 小 应 用 程 序 的 初 始 化 启 动停 止 或 撤 消 方 法 中 的 调 用 也 可 能 会 触 发 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结 构 的 安 全 检 查 点

使 用 V is u a l J + + 编 程 - 图6608使 用 V is u a l J + + 编 程 - 图6609使 用 V is u a l J + + 编 程 - 图6610使 用 V is u a l J + + 编 程 - 图6611使 用 V is u a l J + + 编 程 - 图6612使 用 V is u a l J + + 编 程 - 图6613J /D i rect 也 在 使 用 @ d l l . s t ru c t 伪 指 令 标 记 的 类 上 强 加 安 全 性 限 制 因 为在 例 示 结 构 时 此 结 构 是 不 安 全 的 所 以 这 些 安 全 性 检 查 要 比 J /D i rec t方 法 使 用 的 检 查 要 有 效 得 多 下 面 是 在 @ d l l . s t ru c t 类 上 执 行 的 两 种 安 全性 检 查

使 用 V is u a l J + + 编 程 - 图6614加 载 时间 只 有 在上 下 文 指出 完全 信 任 时 使用 @ d ll.s tru c t 伪指 令 标 记 的类才 加 载

使 用 V is u a l J + + 编 程 - 图6615使 用 V is u a l J + + 编 程 - 图6616链 接 时 间 非 完 全 信 任 的 代 码 不 能 链 接 到 使 用 @ 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 类

使 用 V is u a l J + + 编 程 - 图6617使 用 V is u a l J + + 编 程 - 图6618使 用 V is u a l J + + 编 程 - 图6619使 用 V is u a l J + + 编 程 - 图6620使 用 V is u a l J + + 编 程 - 图6621使 用 V is u a l J + + 编 程 - 图6622使 用 V is u a l J + + 编 程 - 图6623使 用 V is u a l J + + 编 程 - 图6624使 用 V is u a l J + + 编 程 - 图6625使 用 V is u a l J + + 编 程 - 图6626使 用 V is u a l J + + 编 程 - 图6627使 用 V is u a l J + + 编 程 - 图6628使 用 V is u a l J + + 编 程 - 图6629对 于 最 大 安 全 性 J /D i rect 方 法 在 c o m . m s . W in32 软 件 包 中 定 义 在 每 次调 用 时 都 执 行 调 用 的 堆 栈 检 查 如 果 正 使 用 这 些 Ja va 应 用 程 序 的 类 在V IEW 或 W J V IE W 下 运 行 使 用 V is u a l J + + 编 程 - 图6630 则 性 能 开 销 是 可 以 忽 略 的 如 果 使 用 来自 信 任 类 的 c o m .m s. W in 3 2 类 并 要 求 最 大 性 能 则 应 该 把 需 要 的 J /D i re c t 声 明 拷 贝 到 自 己 的 类 中 并 禁 止 每 次 调 用 都 执 行 安 全 检 查 有 关 信 息 请参 看 本 章 前 面 的 每 次 调 用 时 的 安 全 检 查

错 误 信 息

使 用 V is u a l J + + 编 程 - 图6631使 用 V is u a l J + + 编 程 - 图6632使 用 V is u a l J + + 编 程 - 图6633使 用 V is u a l J + + 编 程 - 图6634当 使 用 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

使 用 V is u a l J + + 编 程 - 图6635消息 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 只 有 完 全 信 任 的 类 可 以 具 有 本 机 方法作 为 成 员 使 用 V is u a l J + + 编 程 - 图6636

使 用 V is u a l J + + 编 程 - 图6637使 用 V is u a l J + + 编 程 - 图6638使 用 V is u a l J + + 编 程 - 图6639使 用 V is u a l J + + 编 程 - 图6640可能 的 原 因 na t iv e 关键 字已 经在 方 法 上使 用 这个方 法是 不使用 完全权 限 加载 的类 的 成 员 使 用 V is u a l J + + 编 程 - 图6641 例如 未 签 名 的 小应 用程 序 使 用 V is u a l J + + 编 程 - 图6642 只有 在 尝试 调 用 本机 方式 时 再发 出此 异常

可能 的 解 决 方 案 数 字 签 名请 求完 全 权 限的 小应 用 程 序

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

使 用 V is u a l J + + 编 程 - 图6643使 用 V is u a l J + + 编 程 - 图6644 类 已 经对 不信 任 代 码标 记的 非 公 共的

使 用 V is u a l J + + 编 程 - 图6645使 用 V is u a l J + + 编 程 - 图6646使 用 V is u a l J + + 编 程 - 图6647使 用 V is u a l J + + 编 程 - 图6648使 用 V is u a l J + + 编 程 - 图6649使 用 V is u a l J + + 编 程 - 图6650可能 的 原 因 不 信 任 的 类 已经 尝 试 引 用 一 个 字段 或 另 一 个类的 方法 这个 类 已 经 标 记 为 只 能 信 任 使 用 在 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

使 用 V is u a l J + + 编 程 - 图6651消息 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 方法 未授 权 代 表不 信 任 的 调 用 程 序使用 使 用 V is u a l J + + 编 程 - 图6652

使 用 V is u a l J + + 编 程 - 图6653使 用 V is u a l J + + 编 程 - 图6654使 用 V is u a l J + + 编 程 - 图6655使 用 V is u a l J + + 编 程 - 图6656可能 的 原 因 不 信 任 的类 已经 调 用 了一 个信 任 的 方 法 试图 生 成 J/ D i re c t 调用 即使 生 成 实际 J/ D ire c t 调用 的类 是 信 任 的 如果 调用 堆栈 中 的任 何 方 法属 于 不 信任 的 类 安 全 管 理 程序也 将发 出 一个 Se c u r ity E x c e p t io n

使 用 V is u a l J + + 编 程 - 图6657使 用 V is u a l J + + 编 程 - 图6658使 用 V is u a l J + + 编 程 - 图6659使 用 V is u a l J + + 编 程 - 图6660可能 的 解 决 方 案 数 字 签 名请 求完 全 权 限 的 小应 用程 序 或者 可以 禁用 安 全检查 方法 是使 用 @ 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 {

...

}

使 用 V is u a l J + + 编 程 - 图6661使 用 V is u a l J + + 编 程 - 图6662使 用 V is u a l J + + 编 程 - 图6663使 用 V is u a l J + + 编 程 - 图6664使 用 V is u a l J + + 编 程 - 图6665使 用 V is u a l J + + 编 程 - 图6666使 用 V is u a l J + + 编 程 - 图6667使 用 V is u a l J + + 编 程 - 图6668使 用 V is u a l J + + 编 程 - 图6669注意 如 果 禁 用 这项 安全 检 查 则 为 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

消息 无

使 用 V is u a l J + + 编 程 - 图6670使 用 V is u a l J + + 编 程 - 图6671使 用 V is u a l J + + 编 程 - 图6672使 用 V is u a l J + + 编 程 - 图6673可能 的 原 因 不 信 任 的 类已经 尝试 加载使 用 @ d ll.s tru c t 伪 指 令标 记的类或 者 是 使 用 jactiv ex 工 具 生 成 的 类 尽 管 这 实际上 违反 了安全 性 使 用 V is u a l J + + 编 程 - 图6674 不 是 类加 载程 序 的 错 误 使 用 V is u a l J + + 编 程 - 图6675 为了 向 后 兼 容 的目 的要发 出 一 个 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

使 用 V is u a l J + + 编 程 - 图6676消息 [ 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 方法 未授 权 用 于代 表不 信 任的 调 用 程序 使 用 V is u a l J + + 编 程 - 图6677

使 用 V is u a l J + + 编 程 - 图6678使 用 V is u a l J + + 编 程 - 图6679可 能 的 原 因 从 小 应 用 程 序 的 初 始 化 启 动 停 止 或 撤 消 方 法 来 尝 试

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 );

故 障 排 除 提 示

使 用 V is u a l J + + 编 程 - 图6680使 用 V is u a l J + + 编 程 - 图6681使 用 V is u a l J + + 编 程 - 图6682这 一 节 描 述 了 使 用 J /D i rect 时 可 能 遇 到 的 问 题 对 每 一 种 情 况 都 提 供了 可 能 解 决 的 方 案

调 用 方 法 时 出 现 U n sa tis if ie d L in kE rro r

  • 使 用 V is u a l J + + 编 程 - 图6683使 用 V is u a l J + + 编 程 - 图6684使 用 V is u a l J + + 编 程 - 图6685使 用 V is u a l J + + 编 程 - 图6686使 用 V is u a l J + + 编 程 - 图6687检 查 编 译 器 的 版 本 查 看 它 是 否 是 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 来 链 接 本 机 方 法 并 且 将 不 会 成 功 使 用 V is u a l J + + 编 程 - 图6688

  • 使 用 V is u a l J + + 编 程 - 图6689使 用 V is u a l J + + 编 程 - 图6690使 用 V is u a l J + + 编 程 - 图6691使 用 V is u a l J + + 编 程 - 图6692

    保 D L L 在 系 统 路 径 上 是 可 视 的 将 按 下 列 位 置 依 次 查 找 D L L s

    1. 使 用 V is u a l J + + 编 程 - 图6693使 用 V is u a l J + + 编 程 - 图6694来 自 加 载 的 应 用 程 序 的 目 录 通 常 为 JV IE W 使 用 V is u a l J + + 编 程 - 图6695

    2. 使 用 V is u a l J + + 编 程 - 图6696当 前 目 录

    3. 使 用 V is u a l J + + 编 程 - 图6697W ind ow s 系 统 目 录

    4. 使 用 V is u a l J + + 编 程 - 图6698W ind ow s 目 录

    5. 使 用 V is u a l J + + 编 程 - 图6699PA T H 环 境 变 量 中 列 出 的 目 录

使 用 V is u a l J + + 编 程 - 图6700使 用 V is u a l J + + 编 程 - 图6701使 用 V is u a l J + + 编 程 - 图6702使 用 V is u a l J + + 编 程 - 图6703使 用 V is u a l J + + 编 程 - 图6704M ic rosoft V M 将 不 再 试 图 加 载 D L L 直 到 真 正 调 用 需 求 的 方 法 为 止然 而 不 能 只 因 为 Ja va 类 加 载 成 功 就 认 为 D L L 加 载 成 功

  • 使 用 V is u a l J + + 编 程 - 图6705使 用 V is u a l J + + 编 程 - 图6706使 用 V is u a l J + + 编 程 - 图6707使 用 V is u a l J + + 编 程 - 图6708使 用 V is u a l J + + 编 程 - 图6709使 用 V is u a l J + + 编 程 - 图6710检 查 方 法 限 制 词 使 用 @ d l l . im port 伪 指 令 声 明 的 方 法 必 须 是 本 机 的而 且 是 静 态 的 它 们 可 以 拥 有 Ja va 语 言 支 持 的 任 何 访 问 级 别 公 共的 私 有 的 等 等 使 用 V is u a l J + + 编 程 - 图6711

  • 使 用 V is u a l J + + 编 程 - 图6712使 用 V is u a l J + + 编 程 - 图6713

    证 方 法 名 称 与 D L L 导 出 名 称 确 切 匹 配 包 括 大 小 写 W in 3 2 中 的

使 用 V is u a l J + + 编 程 - 图6714D L L 链 接 机 制 是 大 小 写 相 关 的

  • 使 用 V is u a l J + + 编 程 - 图6715使 用 V is u a l J + + 编 程 - 图6716使 用 V is u a l J + + 编 程 - 图6717使 用 V is u a l J + + 编 程 - 图6718

    果 在 链 接 方 法 时 一 直 有 问 题 使 用 实 用 程 序 诸 如 dum pb in /e xport V isu a l C+ + 使 用 V is u a l J + + 编 程 - 图6719 来 通 过 使 用 名 称 验 证 DL L 导 出 了 这 个 方 法 有 些 D L L

使 用 V is u a l J + + 编 程 - 图6720使 用 V is u a l J + + 编 程 - 图6721使 用 V is u a l J + + 编 程 - 图6722使 用 V is u a l J + + 编 程 - 图6723使 用 V is u a l J + + 编 程 - 图6724使 用 V is u a l J + + 编 程 - 图6725使 用 V is u a l J + + 编 程 - 图6726使 用 V is u a l J + + 编 程 - 图6727要 求 通 过 ord ina l 整 数 使 用 V is u a l J + + 编 程 - 图6728 而 不 是 名 称 来 链 接 导 出 的 方 法 在 这 种 情 况中 在 方 法 上 使 用 入 口 点 超 越 如 下 例 所 示 使 用 #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();

  • 使 用 V is u a l J + + 编 程 - 图6729使 用 V is u a l J + + 编 程 - 图6730使 用 V is u a l J + + 编 程 - 图6731要 知 道 所 谓 函 数 实 际 上 是 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

使 用 V is u a l J + + 编 程 - 图6732D 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

使 用 V is u a l J + + 编 程 - 图6733使 用 V is u a l J + + 编 程 - 图6734使 用 V is u a l J + + 编 程 - 图6735使 用 V is u a l J + + 编 程 - 图6736使 用 V is u a l J + + 编 程 - 图6737使 用 V is u a l J + + 编 程 - 图6738在 调 用 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伪 指 令 内 的 语 法 错 误

使 用 V is u a l J + + 编 程 - 图6739在 @ d l l . im port 和 @ d ll . s t ru c t 伪 指 令 内 的 额 外 空 格 将 会 导 致 语 法 错 误 在

使 用 V is u a l J + + 编 程 - 图6740@ d l l 内 部 要 避 免 使 用 空 格

编 译 器 没 有 找 到 c o m .m s .d ll软 件 包

使 用 V is u a l J + + 编 程 - 图6741使 用 V is u a l J + + 编 程 - 图6742使 用 V is u a l J + + 编 程 - 图6743可 以 使 用 旧 版 本 的 C la sse s.z ip 在 磁 盘 驱 动 器 上 重 装 V isu a l J + + 试 着保 留 所 有 C la sse s.z ip 的 旧 版 本

使 用 V is u a l J + + 编 程 - 图6744@ d ll伪 指 令 不 能 用 于 小 应 用 程 序 或 只 可 用 于 M ic ros o f t V is ual J + +

环 境 使 用 V is u a l J + + 编 程 - 图6745

使 用 V is u a l J + + 编 程 - 图6746使 用 V is u a l J + + 编 程 - 图6747使 用 V is u a l J + + 编 程 - 图6748因 为 J /D i rect 使 用 的 安 全 性 是 折 衷 方 式 所 以 它 只 限 于 Ja v a 应 用 程 序和 签 名 的 Ja va 小 应 用 程 序

使 用 J /D ire ct 可 产 生 不 信 任 的 类

使 用 V is u a l J + + 编 程 - 图6749使 用 V is u a l J + + 编 程 - 图6750使 用 V is u a l J + + 编 程 - 图6751使 用 V is u a l J + + 编 程 - 图6752使 用 V is u a l J + + 编 程 - 图6753在 类 中 通 过 不 信 任 代 码 使 用 J /D i rect 都 会 导 致 类 成 为 不 安 全 的 或 者不 可 使 用 的 实 际 上 即 使 J /D i rect 方 法 也 不 调 用

使 用 V is u a l J + + 编 程 - 图6754在 调 用 本 机 函 数 之 后 J /D ire c t 抛 弃 了

P a ra m e te r C oun tM is m a tc h E r ro r

使 用 V is u a l J + + 编 程 - 图6755使 用 V is u a l J + + 编 程 - 图6756使 用 V is u a l J + + 编 程 - 图6757P a ra m e te r C oun t M ism a tc h E r ro r 异 常 会 警 告 用 户 被 调 用 函 数 消 耗 的 参 数用 堆 栈 使 用 V is u a l J + + 编 程 - 图6758 比 J /D i rect 传 递 的 参 数 或 多 或 少 这 个错 误 通 常 指 出 在 Ja v a

使 用 V is u a l J + + 编 程 - 图6759方 法 中 声 明 的 参 数 与 D L L 函 数 期 望 的 参 数 是 不 匹 配 的

使 用 V is u a l J + + 编 程 - 图6760使 用 V is u a l J + + 编 程 - 图6761如 果 函 数 没 有 参 数 则 假 设 使 用 cd ec l 调 用 约 定 且 不 发 出 异 常 即 使 Ja v a

使 用 V is u a l J + + 编 程 - 图6762方 法 声 明 了 非 零 参 数

使 用 V is u a l J + + 编 程 - 图6763使 用 V is u a l J + + 编 程 - 图6764使 用 V is u a l J + + 编 程 - 图6765使 用 V is u a l J + + 编 程 - 图6766使 用 V is u a l J + + 编 程 - 图6767使 用 V is u a l J + + 编 程 - 图6768使 用 V is u a l J + + 编 程 - 图6769使 用 V is u a l J + + 编 程 - 图6770使 用 V is u a l J + + 编 程 - 图6771使 用 V is u a l J + + 编 程 - 图6772警 告 不 应 当 试 图 捕 获 和 处 理 ParameterC ountMismatchError 异常 异 常 是 为 了 辅 助 开 发 人 员 在 开 发 阶 段 捕 获 错 误 而 设 计 的 由 于性 能 的 原 因 只 有 当 应 用 程 序 是 在 Java 调 试 器 下 运 行 时 才 执 行参 数 的 计 数 检 查 在 函 数 调 用 完 成 后 记 下 J/Direct 执 行 了 这 次检 查 也 是 很 重 要 的 因 为 异 常 指 出 了 为 函 数 调 用 传 递 了 一 个 或 多 个无 效 参 数 所 以 它 不 能 保 证 此 进 程 可 以 恢 复

J /D ire c t不 能 卸 载 D L L

使 用 V is u a l J + + 编 程 - 图6773使 用 V is u a l J + + 编 程 - 图6774当 M ic rosoft V M 放 弃 了 导 入 D L L 的 Ja va 类 时 J /D i re c t 卸 载 D L L 对

使 用 V is u a l J + + 编 程 - 图6775使 用 V is u a l J + + 编 程 - 图6776使 用 V is u a l J + + 编 程 - 图6777使 用 V is u a l J + + 编 程 - 图6778使 用 V is u a l J + + 编 程 - 图6779使 用 V is u a l J + + 编 程 - 图6780使 用 V is u a l J + + 编 程 - 图6781使 用 V is u a l J + + 编 程 - 图6782使 用 V is u a l J + + 编 程 - 图6783于 运 行 在 JV IE W 下 的 Ja va 应 用 程 序 来 说 直 到 进 程 退 出 也 不 会 发 生这 种 情 况 对 于 信 任 的 Ja va 小 应 用 程 序 在 浏 览 器 离 开 了 包 含 小 应 用程 序 的 页 之 后 会 在 某 些 不 确 定 的 时 间 发 生 在 重 新 访 问 页 面 的 情 况 下为 了 优 化 小 应 用 程 序 的 刷 新 时 间 M ic rosoft V M 试 图 为 后 面 的 几 页 保 留已 加 载 的 Ja va 类

使 用 V is u a l J + + 编 程 - 图6784使 用 V is u a l J + + 编 程 - 图6785使 用 V is u a l J + + 编 程 - 图6786使 用 V is u a l J + + 编 程 - 图6787使 用 V is u a l J + + 编 程 - 图6788使 用 V is u a l J + + 编 程 - 图6789使 用 V is u a l J + + 编 程 - 图6790如 果 需 要 显 式 控 制 D L L 的 加 载 和 卸 载 就 必 须 显 式 调 用 W ind ow s 加 载程 序 并 使 用 调 用 入 口 点 来 自 动 调 用 函 数 关 于 如 何 做 这 些 的 详 细 信 息请 参 看 本 章 前 面 的 动 态 加 载 和 调 用 DL L s