第 一 章 面 向 对 象 编 程
C
-
- B u ild e r 3 的最 大特点就是 面向对 象 在面 向对 象 领 域 Bo r la n d ® 一直处 于 世界领先的 地位 C+ + Bu i ld e r 3 的面向对 象主要体现在 三个方面 一 是编程语言最 接近IS O C + + 标 准 二 是 全 面 支 持 基 于 元 件 的 应 用 程 序 开 发 三 是 借 助 于 对 象 库 可 实 现 代码重用
本 章 从 一 些 基 本 概 念 开 始 详 细 介 绍 C+ + Bu ild e r 3 面 向 对 象 的 编 程 思 想 并
初 步 介 绍 VC L 的 结 构 C+ + Bu ild e r 3 中 的 元 件 很 多 尽 管 这 些 元 件 千 差 万 别但 它 们 都 是 从 几 个 公 共 基 类 继 承 下 来 的 因 此 这 些 元 件 具 有 某 种 程 度 的相 似 性 为 了 节 省 篇 幅 本 书 按 照 这 样 的 思 路 编 写 即 先 介 绍 公 共 基 类 后 面 将 只 介 绍 每 个 元 件 特 有 的 特 性 和 方 法
1 . 1 什 么 是 对 象
什 么 是 对 象 这 得 先 从 什 么 是 类 说 起 类 ( C la ss) 是 一 种 数 据 类 型 与 一 般 的数 据 类 型 不 同 的 是 类 除 了 包 含 数 据 以 外 还 包 含 了 操 纵 数 据 的 方 法 类把 数 据 和 方 法 封 装 在 一 起 在 一 个 类 中 可 以 包 含 不 同 类 型 的 数 据 这 一点 与 C+ + 的 结 构 相 似
类 具 有 可 继 承 性 如 果 要 创 建 一 个 新 的 类 只 要 选 择 一 个 基 类 再 加 上 自 己
的 成 员 就 派 生 出 一 个 新 的 类 事 实 上 C+ + Bu ild e r 3 中 所 有 的 类 都 是 从 一 个共 同 的 基 类 继 承 下 来 的 基 类 的 非 私 有 成 员 自 动 成 为 派 生 类 的 成 员 类 的继 承 还 具 有 传 递 性 例 如 假 设 T3 继 承 了 T2 而 T2 又 继 承 了 T1 可 以 认 为T3 也 继 承 了 T1
在 C+ + Bu ild e r 3 中 所 有 的 类 都 是 从 T O b ject继 承 下 来 的 T O b ject是 一 个 抽象 类 它 的 派 生 类 可 以 对 TO b je c t的 方 法 包 括 构 造 和 析 构 重 载 T O b ject也 被称 为 默 认 祖 先 类
类 只 是 一 种 数 据 类 型 要 使 用 类 一 般 还 得 声 明 类 的 变 量 ( 某 些 特 殊 的 情 况下 可 以 直 接 对 类 进 行 操 作 ) 需 要 指 出 的 是 类 的 变 量 和 类 的 实 例 从 严 格 意义 上 讲 不 完 全 是 一 个 概 念 类 的 实 例 (In s ta n c e ) 是 一 块 动 态 分 配 的 内 存 区域 一 般 我 们 把 类 的 实 例 称 为 对 象 (O b je c t) 同 一 个 类 可 以 有 多 个 实 例 存在 每 个 对 象 都 有 自 己 的 数 据 但 方 法 是 共 享 的
类 的 变 量 实 际 上 是 一 个 指 针 指 向 类 的 实 例 要 访 问 对 象 的 成 员 就 是 通过 类 的 变 量 来 引 用 的 同 一 个 类 可 以 有 多 个 变 量 多 个 变 量 可 以 引 用 同 一个 对 象
下 面 我 们 还 是 通 过 一 个 典 型 的 程 序 示 例 把 类 和 对 象 的 概 念 讲 清 楚 当 您 使用 F ile 菜 单 上 的 N e w A p p lic a tio n 命 令 时 C+ + Bu ild e r 3 将 创 建 一 个新 的 项 目 默 认 情 况 下 这 个 项 目 中 只 有 一 个 空 白 的 Fo rm 和 一 个 单 元 文 件及 头 文 件
在 C+ + Bu i ld e r 3 中 Fo rm 就 是 一 个 非 常 典 型 的 对 象 Fo rm 的 直 接 基 类 是
TF o rm 我 们 先 看 看 头 文 件 中 是 怎 样 声 明 Fo rm 的
//- -- -- -- -- - - -- -- ---- ----- ----- ----- ----- ----- -----
# ifn d e f U n i t 1 H #de f ine U n i t 1 H
/ /-
# inc lude < C la s se s . h pp > # inc lude < C o n tro ls . h p p > # inc lude < S td C tr ls . hp p > # inc lude < F orm s . h p p >
/ /-
c la s s T F o rm 1 : p u b lic T F o rm
{
_pu b lis h e d:
priv a te :
pub l ic :
_ fa s tc a ll T F o rm 1 ( T C o m p o n e n t* O w n e r ) ;
};
/ /-
e x te rn P A C K A G E T F orm 1 *F o rm 1 ;
/ /-
#e n d if
可 以 看 出 头 文 件 中 声 明 了 一 个 类 叫 TF o rm 1 它 的 基 类 是 TF o rm 由 于 Fo rm 现 在 是 空 白 的 也 没 有 建 立 任 何 事 件 句 柄 因 此 TF o rm 1 中 除 了 构 造 外 没有 其 它 数 据 和 方 法
如 果 您 对 类 的 概 念 理 解 得 比 较 透 彻 的 话 您 就 知 道 TF o rm 1 中 实 际 上 是 有成 员 的 因 为 TF o rm 1 是 从 TF o rm 继 承 下 来 的 TF o rm 的 成 员 也 就 成 为 TF o rm 1 的 成 员
声 明 了 TF o rm 1 后 头 文 件 中 声 明 了 TF o rm 1 类 型 的 变 量 Fo rm 1 以 后 就 是 用Fo rm 1 来 引 用 这 个 Fo rm 注 意 在 调 用 TF o rm 1 的 构 造 之 前 也 就 是 说 创 建TF o rm 1 的 实 例 之 前 Fo rm 1 这 个 变 量 基 本 上 是 没 意 义 的
我 们 再 看 看 单 元 文 件 的 代 码 是 怎 样 的
//- -- -- -- -- - - -- -- ---- ----- ----- ----- ----- ----- -----
# inc lude < v c l . h > #pra g m a hd rs top
# inc lude " U n it 1 .h "
/ /-
# p ra g m a p a c k ag e( s m art_ in i t) # p rag m a re so u rce "* . d fm "
T F orm 1 *F orm 1 ;
/ /-
_fa s tc a l l T F orm 1 : : T F o rm 1( T C o m po n e n t* O w n e r )
: T F o rm ( Ow n e r )
{
}
/ /-
由 于 现 在 Fo rm 是 空 白 的 单 元 文 件 中 只 有 TF o rm 1 的 构 造 函 数 您 可 以 在 构造 函 数 中 加 入 任 何 代 码 只 要 不 引 用 Fo rm 本 身 因 为 在 构 造 函 数 中 类 的实 例 还 没 有 创 建 好
假 设 您 向 Fo rm 中 加 入 一 个 按 钮 ( T B u t ton) 名 称 是 B u t ton1 双 击 此 按 钮 C+ + B u ild e r 3 就 自 动 建 立 一 个 处 理 O n C lic k 事 件 的 句 柄 这 时 候 头 文 件 就 变 成这 样
//-------- -------------------- -------------------- ---------------
# ifn d e f U n i t 1 H #de f ine U n i t 1 H
/ /-
# inc lude < C la s se s . h pp > # inc lude < C o n tro ls . h p p > # inc lude < S td C tr ls . hp p > # inc lude < F orm s . h p p >
/ /-
c la s s T F o rm 1 : p u b lic T F o rm
{
_pu b lis h e d:
T B u tton *B u tto n 1 ;
vo id _ fa s tc a l l B u tto n 1C l ic k ( T O b je c t *S e n d e r ) ; priv a te :
pub l ic :
_ fa s tc a ll T F o rm 1 ( T C o m p o n e n t* O w n e r ) ;
};
/ /-
e x te rn P A C K A G E T F orm 1 *F o rm 1 ;
/ /-
#e n d if
可 以 看 出 头 文 件 在 TF o rm 1 的 _pub lis he d 部 分 声 明 了 一 个 T B u tto n 类 型 的 变量 叫 B u tto n 1 同 时 声 明 了 一 个 无 返 回 的 函 数 B u tto n 1 C lic k 作 为 处 理 O n C lic k 事 件 的 句 柄
我 们 再 看 看 单 元 文 件 的 代 码 有 什 么 变 化
/ /-
# inc lude < v c l . h > #pra g m a hd rs top
# inc lude " U n it 1 .h "
/ /-
# p ra g m a p a c k ag e( s m art_ in i t) # p rag m a re so u rce "* . d fm "
T F orm 1 *F orm 1 ;
/ /-
_fa s tc a l l T F orm 1 : : T F o rm 1( T C o m po n e n t* O w n e r )
: T F o rm ( Ow n e r )
{
}
/ /-
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
}
/ /-
可 以 看 出 单 元 文 件 唯 一 的 变 化 就 是 给 出 了 事 件 句 柄 的 实 体 目 前 实 体 中没 有 代 码 您 可 以 加 入 任 何 代 码 包 括 对 Fo rm 的 引 用 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
F o rm 1-> C o lor = c l G re e n ;
}
1 .2 修 改 元 件 的 名 称
- 般
来 说 您 最 好 在 设 计 期 用 O b je c t In s p ecto r修 改 元 件 的 名 称 而 且 最 好 在您 刚 刚 把 元 件 加 到 Fo rm 上 时 就 改 在 设 计 期 修 改 元 件 的 名 称 有 一 个 好 处
C+
- Bu ild e r 3 会 自 动 更 新 源 代 码 中 所 有 引 用 元 件 名 的 地 方 也 就 是 说 您 不用 担 心 是 否 有 不 一 致 的 地 方 例 如 您 可 以 把 Fo rm 的 名 称 从 Fo rm 1 改 为M a in F o rm 头 文 件 会 相 应 变 化
/ /-
# ifn d e f U n i t 1 H #de f ine U n i t 1 H
/ /-
# inc lude < C la s se s . h pp > # inc lude < C o n tro ls . h p p > # inc lude < S td C tr ls . hp p > # inc lude < F orm s . h p p >
/ /-
c la s s T M a inF orm : p ub lic T F orm
{
_pu b lis h e d:
T B u tton *B u tto n 1 ;
vo id _ fa s tc a l l B u tto n 1C l ic k ( T O b je c t *S e n d e r ) ; priv a te :
pub l ic :
_fa s tc a l l T M a inF orm ( T C om po ne n t* O w ne r ) ;
};
/ /-
e x te rn P A C K A G E T M a inF orm *M a in F orm ;
/ /-
#e n d if
可 以 看 出 所 有 原 先 是 Fo rm 1 的 地 方 现 在 都 改 为 M a in F o rm 包 括 类 名完 全 可 以 预 料 单 元 文 件 的 代 码 也 改 过 来 了
/ /-
# inc lude < v c l . h > #pra g m a hd rs top
# inc lude " U n it 1 .h "
/ /-
# p ra g m a p a c k ag e( s m art_ in i t) # p rag m a re so u rce "* . d fm "
T M a inF o rm * M a in F o rm ;
/ /-
_ fa s tc a ll T M a in F o rm ::T M a in F o rm ( T C o m p o n e n t* O w n e r )
: T F o rm ( Ow n e r )
{
}
/ /-
v o id _ fa s tc a ll T M a in F o rm ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
F o rm 1-> C o lor = c l G re e n ;
}
/ /-
要 注 意 的 是 如 果 您 在 事 件 句 柄 B u tto n 1 C lic k 中 写 了 代 码 而 且 还 用 老 名 字引 用 了 Fo rm 当 您 修 改 Fo rm 的 名 称 时 这 部 分 代 码 不 会 自 动 改 变 因 为 代码 是 您 自 己 键 入 的 这 时 候 您 就 要 手 动 更 改 对 Fo rm 的 引 用 否 则 编 译 不能 通 过
1 .3 对 象 的 作 用 域 问 题
在 C+ + Bu ild e r 3 中 要 特 别 注 意 对 象 的 作 用 域 问 题 因 为 这 关 系 到 对 象 的 成 员是 否 可 见 和 可 访 问 总 的 原 则 是 在 类 的 方 法 中 类 的 成 员 都 是 可 见 的
例 如 假 设 Fo rm ( 类 名 叫 TF o rm 1 ) 上 有 一 个 按 钮 B u tton1 由 于 C+ + Bu ild e r 3 把 处 理 Fo rm 及 Fo rm 上 元 件 事 件 的 句 柄 作 为 TF o rm 1 的 一 个 方 法 因 此 在 处理 按 钮 的 O n C lic k 事 件 的 句 柄 中 您 可 以 任 意 访 问 TF o rm 1 的 所 有 成 员 而 且不 需 要 用 TF o rm 1 的 变 量 来 引 用 例 如
_ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r ) ;
{
C o lo r = cl F u ch s ia;
B u tto n 1 -> C o lo r = c l L im e ;
}
由 于 Co lo r 是 TF o rm 的 成 员 也 就 成 为 TF o rm 1 的 成 员 因 此 您 可 以 直 接 对
Co lo r特 性 赋 值 而 不 需 要 这 么 写 ( 尽 管 这 样 写 编 译 器 也 不 认 为 出 错 ) F o rm 1-> C o lor = c l F u c h s ia ;
但 是 如 果 要 访 问 Fo rm 上 某 个 元 件 的 成 员 例 如 B u tto n 1 的 Co lo r特 性 您 就
必 须 加 上 对 象 限 定 符 否 则 编 译 器 就 认 为 您 要 访 问 的 是 TF o rm 1 的 Co lo r 特性
也 许 您 要 问 既 然 访 问 按 钮 的 Co lo r 特 性 时 要 加 上 B u tto n 1 限 定 符 为 什 么 不在 B u tto n 1 前 加 Fo rm 1 限 定 符 呢 这 是 因 为 B u tto n 1 被 声 明 为 TF o rm 1 的 一 个数 据 成 员 在 类 的 方 法 中 类 的 成 员 总 是 可 见 的 可 访 问 的 因 此 不 需要 加 Fo rm 1 限 定 符
假 设 当 前 项 目 中 有 两 个 Fo rm 分 别 是 Fo rm 1 和 Fo rm 2 如 果 要 在 Fo rm 1 中 访问 Fo rm 2 上 的 B u t ton2 元 件 该 怎 样 访 问 呢
由 于 B u tto n 2 已 超 出 Fo rm 1 的 作 用 域 因 此 在 访 问 B u t ton2 时 您 必 须 加 上 Fo rm 2
限 定 符 程 序 示 例 如 下
F o rm 2-> B u tton2-> C o lor = c l L im e ;
如 果 您 以 为 这 样 就 可 以 了 那 就 错 了 因 为 Fo rm 1 根 本 就 不 知 道 Fo rm 2 是 什么 东 西 您 还 需 要 把 Fo rm 2 的 头 文 件 包 含 到 Fo rm 1 的 单 元 文 件 中
1 .4 类 成 员 的 可 见 性
面 向 对 象 编 程 的 重 要 特 征 之 一 就 是 隐 藏 复 杂 性 C+ + Bu ild e r 3 通 过
_pub lis he d priv a te pub lic pro te c te d 和 a u to m a te d 等 几 个 关 键 字 使 类 成 员 具有 不 同 的 可 见 性 例 如
//- -- -- -- -- - - -- -- ---- ----- ----- ----- ----- ----- -----
--
cla ss T F o r m 1 : p u b l ic TF or m
{
_pu bl is he d:
TBu tt on * B u t t o n 1 ;
voi d _f as tc a l l Bu tto n 1 Cl ic k( T O b j ec t *S e n d e r ) ; pri va te :
pub li c:
_fa st ca ll T F o r m 1 (T C omp on en t* O w n e r ) ;
};
上 例 中 数 据 B u tto n 1 和 方 法 B u tto n 1 C lic k 是 在 _pub lis he d 部 分 声 明 的 而TF o rm 1 的 构 造 函 数 是 在 pub lic 部 分 声 明 的 那 么 这 几 个 关 键 字 究 竟 是 什 么 含义 呢
在 pub lic 部 分 声 明 的 成 员 是 公 共 的 也 就 是 说 它 们 虽 然 是 在 某 个 类 中 声 明的 但 其 它 类 的 实 例 也 可 以 访 问 例 如 假 设 应 用 程 序 由 两 个 Fo rm 构 成
相 应 的 单 元 是 U n it1 和 U n it2 您 希 望 U n it2 能 共 享 U n it1 中 的 整 型 变 量 C ount 您 可 以 把 C oun t在 TF o rm 1 类 中 的 pub lic 部 分 声 明 然 后 把 U n it1 的 头 文 件 包 含到 U n it2 中
不 过 除 非 您 必 须 把 某 个 成 员 在 不 同 类 之 间 共 享 一 般 来 说 尽 量 不 要 把 成员 声 明 在 类 的 pub lic 部 分 以 防 止 程 序 意 外 地 不 正 确 地 修 改 了 数 据
在 priv a te 部 分 声 明 的 成 员 是 私 有 的 它 们 只 能 被 同 一 个 类 中 的 方 法 访 问 就好 象 局 部 变 量 一 样 对 于 其 它 类 包 括 它 的 派 生 类 priv a te 部 分 声 明 的 成 员 是不 可 见 的 这 就 是 面 向 对 象 编 程 中 的 数 据 保 护 机 制 程 序 员 不 必 知 道 类 实现 的 细 节 只 需 关 心 类 的 接 口
pro te c te d 与 priv a te 有 些 类 似 在 pro te c te d 部 分 声 明 的 成 员 是 私 有 的 不 同 的是 在 pro te c te d 部 分 声 明 的 成 员 在 它 的 派 生 类 中 是 可 见 的 并 且 成 为 派 生 类的 私 有 成 员
在 pro te c te d 部 分 声 明 的 成 员 通 常 是 方 法 这 样 既 可 以 在 派 生 类 中 访 问 这 些 方法 又 不 必 知 道 方 法 实 现 的 细 节
在 _pub lis he d 部 分 声 明 的 成 员 其 可 见 性 与 在 pub lic 部 分 声 明 的 成 员 的 可 见性 是 一 样 的 它 们 都 是 公 共 的 不 同 的 是 _pub lis he d 主 要 用 于 声 明 Fo rm 上的 元 件 和 事 件 句 柄 它 是 由 ID E 自 动 维 护 的
在 au to m a te d 部 分 声 明 的 成 员 其 可 见 性 与 在 pub lic 部 分 声 明 的 成 员 的 可 见 性是 一 样 的 它 们 都 是 公 共 的 唯 一 的 区 别 在 于 在 a u to m a te d 部 分 声 明 的 方法 和 特 性 将 生 成 OL E 自 动 化 的 类 型 信 息 不 过 在 C+ + Bu ild e r 3 中 a u to m a te d 的 作 用 不 大
1 .5 对 象 的 相 互 赋 值
尽 管 类 是 一 种 复 杂 的 数 据 类 型 既 有 数 据 又 有 方 法 但 是 您 完 全 可 以 象对 一 般 的 变 量 那 样 用 赋 值 号 把 类 的 变 量 赋 给 另 一 个 类 的 变 量 只 要 这 两个 类 的 类 型 是 一 致 的 或 相 容 的 例 如 假 设 Fo rm 1 和 Fo rm 2 都 是 TF o rm 的 变量 您 可 以 这 么 写
Fo rm 2 = Fo rm 1 ;
因 为 Fo rm 1 和 Fo rm 2 的 类 型 都 是 TF o rm
您 还 可 以 把 派 生 类 的 变 量 赋 给 基 类 的 变 量 例 如 假 设 TM y F o rm 是 这 样 声明 的
cla ss T M y F o r m : p ubl i c TF or m
{
_pu bl is he d:
TBu tt on * B u t t o n 1 ; TEd it * E d i t 1 ;
TDB Gr id * D B G r i d 1 ;
TDa ta ba se * D a t a b a s e 1 ; pri va te :
pub li c:
v i r t u a l _f a s t c al l T MyF o r m ( TC om po ne n t * O w ne r) ;
};
然 后 分 别 声 明 了 TM y F o rm 和 TF o rm 的 变 量
T M y F orm * M y F orm ; TF o rm * A F o rm ;
由 于 TM y F o rm 是 从 TF o rm 继 承 下 来 的 因 此 您 可 以 这 样 赋 值
AF o rm = M y F o rm ;
不 知 您 注 意 到 没 有 每 一 个 事 件 句 柄 中 都 有 一 个 S e nde r 参 数 它 的 类 型 是T O b ject 大 家 知 道 VC L 的 所 有 对 象 都 是 从 T O b ject继 承 下 来 的 因 此 VC L 的 所 有 对 象 都 能 赋 值 给 S e nde r 参 数 这 就 是 为 什 么 S e nde r 参 数 能 代 表 所 有VC L 对 象 的 原 因
S e nde r参 数 主 要 用 于 在 运 行 期 判 断 元 件 的 类 型 程 序 示 例 如 下
if ( ty p e id (* S e n d e r ) = = ty p e id ( T E d it)) D o S o m e th in g ;
els e
D o S o m e th in g E ls e ;
1 .6 自 己 创 建 一 个 对 象
C
-
- B u ild e r 3 已 经 在 VC L 中 声 明 了 众 多 的 对 象 不 过 有 时 候 您 可 能 需 要 自己 声 明 一 个 类 然 后 再 创 建 类 的 实 例 即 对 象 因 为 VC L 中 的 对 象 未 必 能 完全 满 足 您 的 编 程 需 要 例 如 您 可 以 声 明 一 个 TEm p lo y e e 类
clas s T E m p lo y ee : p u b l ic T O bjec t
{
priv a te :
ch ar N a m e [ 2 5 ] ; c h a r T itle [2 5 ];
dou b le H ourly R a te ; pub l ic :
dou b le C a lc u la te P a y A m oun t( ) ; T E m p lo y ee( ) ;
};
类 的 声 明 一 般 放 在 头 文 件 中 然 后 您 得 在 要 用 到 这 个 类 的 单 元 文 件 中 声 明类 的 变 量
T E m p lo y ee * E m p lo y ee;
TE m p lo y e e 只 是 一 种 数 据 类 型 要 使 用 这 个 类 您 必 须 创 建 类 的 实 例
E m p lo y e e = ne w T E m p lo y e e ;
ne w 会 自 动 调 用 TEm p lo y e e 的 构 造 函 数 现 在 您 就 可 以 访 问 TEm p loy e e 中 的成 员 了
前 面 讲 过 对 象 实 际 上 是 一 块 内 存 区 域 换 句 话 说 就 是 W ind ow s 的 资 源 如果 您 不 再 需 要 用 到 TEm p lo y e e 的 对 象 您 应 当 及 时 地 删 除 它 以 释 放 它 所 占用 的 资 源
要 删 除 TE m p lo y e e 的 对 象 您 可 以 调 用 d e le te
d e le te E m p lo y ee;
不 过 您 要 考 虑 到 这 样 一 种 情 况 就 是 如 果 程 序 出 现 异 常 程 序 将 非 正 常退 出 这 种 情 况 下 程 序 可 能 执 行 不 到 删 除 对 象 的 地 方 为 了 保 证 资 源 能可 靠 地 得 到 释 放 您 就 要 用 到 C+ + 的 异 常 处 理 机 制 把 删 除 对 象 的 代 码 放 到try .. c a tc h 块 中
要 说 明 的 是 当 您 把 元 件 选 项 板 上 的 元 件 加 到 Fo rm 上 时 C+ + Bu ild e r 3 会自 动 创 建 元 件 的 实 例 当 程 序 正 常 退 出 的 时 候 C+ + Bu ild e r 3 会 自 动 删 除 元件 的 实 例 这 一 切 都 用 不 着 您 自 己 编 写 代 码 除 非 您 是 自 己 在 运 行 期 动 态地 把 一 个 元 件 加 到 Fo rm 上
1 .7 VC L 的 结 构
VC L ( V is u a l C o m p o n e n t L ib ra r y 的 缩 写 ) 是 C+ + Bu ild e r 3 的 核 心 VC L 是 完 全面 向 对 象 的 VC L 中 的 所 有 对 象 都 存 在 着 继 承 与 被 继 承 的 关 系 下 图 是 VC L 的 示 意
从 示 意 图 可 以 看 出 最 顶 层 的 是 TO b je c t 它 是 一 切 对 象 的 基 类
T P e rsiste n t是 T O b ject的 下 一 级 继 承 者 它 是 一 个 抽 象 类 主 要 用 于 提 供 对 象之 间 的 相 互 赋 值 和 读 写 流 的 能 力
T C o m pone n t又 是 T P e rsiste n t的 继 承 者 这 个 类 是 VC L 中 所 有 元 件 的 祖 先 类
T C o m pone n t定 义 了 所 有 元 件 最 基 本 的 行 为
尽 管 所 有 元 件 都 是 从 T C om pone nt继 承 下 来 的 但 直 接 继 承 的 只 有 几 个 非 可视 的 元 件 如 TT im e r 和 T D ataS o u rce 等 其 它 元 件 则 是 从 T C om pon e n t 的 下 级T C on tro l继 承 下 来 的 从 T C on tro l继 承 下 来 的 元 件 是 可 视 元 件 可 视 元 件 也称 为 控 件 T C on tro l定 义 了 所 有 控 件 的 基 本 属 性 包 括 特 性 方 法 和 事 件 等T W in C on tro l 和 T G ra ph ic C on tro l 这 两 个 类 都 是 从 T C on tro l 继 承 下 来 的 这 两个 类 的 区 别 正 如 它 们 取 的 名 字 一 样 从 T W in C on tro l继 承 的 主 要 是 按 钮 对话 框 列 表 框 等 有 窗 口 句 柄 的 控 件 这 些 控 件 占 用 W ind ow s 的 资 源 并 且 允
许 用 户 输 入 而 从 T G ra ph ic C on tro l继 承 的 元 件 例 如 TLa b e l T S pe e d B u tton 等没 有 窗 口 句 柄 不 占 用 W ind ow s 资 源 也 不 能 接 受 键 盘 的 输 入 使 用 这 一 类元 件 的 好 处 在 于 节 约 资 源
VC L 的 面 向 对 象 还 体 现 在 它 的 可 扩 展 性 您 可 以 选 择 其 中 一 个 元 件 作 为 基类 派 生 出 一 个 新 的 类 ( 元 件 ) 并 把 新 创 建 的 元 件 加 入 到 VC L 中
1 .8 TO bj e c t
T O b ject是 VC L 中 所 有 对 象 的 基 类 它 定 义 了 操 纵 对 象 的 基 本 方 法 其 中有 的 是 类 方 法 用 于 返 回 对 象 的 类 型 信 息 有 的 是 虚 拟 方 法 能 够 在 派 生类 中 重 载 有 的 仅 用 于 C+ + Bu ild e r 3 的 ID E 自 身 调 用 而 不 能 被 程 序 调 用
T O b ject没 有 数 据 成 员
请 读 者 注 意 本 书 的 编 写 习 惯 在 介 绍 一 个 类 时 先 介 绍 类 的 继 承 关 系 再按 字 母 顺 序 介 绍 类 的 特 性 方 法 和 事 件 可 能 会 作 一 些 取 舍
A fter C o n s tru ctio n 函 数
声 明 v ir tua l vo id _fa s tc a ll A f te r C ons truc tion( ) ;
应 用 程 序 不 要 直 接 调 用 这 个 函 数 因 为 这 个 函 数 是 当 类 的 构 造 函 数 执 行 完毕 时 自 动 调 用 的 但 您 可 以 重 载 这 个 虚 拟 函 数
B e fo re D e s tr u c tio n
声 明 v ir tua l vo id _fa s tc a ll B e fo re D e s tru c t ion( ) ;
应 用 程 序 不 要 直 接 调 用 这 个 函 数 因 为 这 个 函 数 是 在 类 的 构 造 函 数 马 上 就要 执 行 时 自 动 调 用 的 但 您 可 以 重 载 这 个 虚 拟 函 数
C la ss N a m e 函 数
声 明 s ta tic S h o r t S trin g _ fa s tc a ll C la s s N a m e ( T C la s s c ls ) ;
S h o r t S tr in g _ fas tc a l l C las s N a m e( ){ re tu rn C la s s N a m e( C las s T yp e( ) ) ;}
这 个 函 数 返 回 一 个 对 象 实 例 的 类 名 注 意 您 可 以 用 基 类 的 变 量 来 引 用 派生 类 的 对 象 实 例 用 此 变 量 来 调 用 C la ssN a m e 时 返 回 的 是 派 生 类 的 类 名 而 不 是 变 量 本 身 的 类 型
假 设 Fo rm 上 有 一 个 按 钮 ( T B u t ton) 标 签 (T L a b e l) 复 选 框 ( T C h e c kB ox) 当用 户 单 击 其 中 一 个 任 何 控 件 要 使 控 件 的 类 名 显 示 在 Fo rm 的 标 题 栏 上 您当 然 应 当 首 先 为 这 些 控 件 建 立 处 理 O n C lic k 事 件 的 句 柄 然 后 这 样 写 代 码
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t ∗ Se n d e r )
{
F o rm 1-> C a p t ion = S tr in g ( B u tto n1-> C la s s N a m e ( ) ) ;
}
v o id _ fa s tc a ll T F o rm 1 ::C h e c k B o x 1 C lic k ( T O b je c t ∗ Se n d e r )
{
F o rm 1 -> C a p t io n = S trin g (C h e c k B o x 1 -> C la s s N a m e ( ) ) ;
}
v o id _ fa s tc a ll T F o rm 1 ::L a b e l 1 C lic k ( T O b je c t ∗ Se n d e r )
{
F o rm 1 -> C a p t io n = S trin g (L a b e l 1 -> C la s s N a m e ( ));
}
C la ss N a m e I s 函 数
声 明 sta tic b o o l _ fa s tc a l l C la ssN a m e Is( T C la ss c ls, c o n s t A n siS tr in g s tr in g ) ;
这 个 函 数 用 于 判 断 对 象 的 类 型 是 否 是 指 定 的 类 型 如 是 就 返 回 T ru e
D e fa u lt H a nd le r 函 数
声 明 v ir tua l vo id _fa s tc a ll D e fa u l t H a nd le r ( vo id* M e s s a ge ) ;
如 果 一 个 对 象 处 理 某 个 消 息 D e fa u lt H a nd le r 能 提 供 对 该 消 息 的 默 认 处 理派 生 类 可 以 重 载 这 个 方 法 例 如 T W in C on tro l就 重 载 了 D e fa u l t H an d ler 并且 换 名 为 D e f W indow P roc
D is p a tc h 函 数
声 明 v ir tua l vo id _fa s tc a ll D is p a tc h ( vo id *M e s s a ge ) ;
这 个 函 数 用 于 调 用 对 象 的 消 息 处 理 方 法 究 竟 调 用 哪 个 方 法 由 M e ss a g e 参数 指 定 的 消 息 来 决 定 如 果 对 象 中 没 有 找 到 处 理 该 消 息 的 方 法 D is p a tc h 就从 基 类 中 查 找 如 果 一 直 到 最 顶 层 还 没 有 找 到 就 调 用 D e fa u lt H a nd le r
M e ssa g e 是 个 无 类 型 的 参 数 从 语 法 上 讲 您 可 以 传 递 任 何 类 型 的 数 据 不过 最 好 是 T M e ssa g e 结 构 它 是 这 样 声 明 的
s tru ct T M es s a g e
{
C a rd in a l M s g ; un io n
{
stru c t
{
W o rd W P aram L o ; W o rd W P aram H i ; W o rd L P aram L o ; W o rd L P aram H i ; W o rd R e s u ltL o ;
W o rd R e s u ltH i;
};
stru c t
{
in t W P a ra m ; in t L P a ra m ; in t R e s u lt;
};
};
};
F re e In sta n c e 函 数
声 明 v ir tu a l v o id _ fa s tc a ll F re e In s ta n c e ( ) ;
这 个 函 数 是 由 析 构 函 数 自 动 调 用 的 您 一 般 不 要 直 接 调 用 它 除 非 派 生 类重 载 了 N e w In s ta n c e 您 也 要 相 应 地 重 载 F re e Ins ta nc e
F re e Ins ta nc e 是 与 N e w In s ta n c e 配 对 使 用 的 N e w In s ta n c e 用 于 建 立 一 个 新 的 对象 实 例 而 F re e Ins ta nc e 用 于 删 除 N e w In s ta n c e 建 立 的 对 象 实 例
I n h erits F ro m 函 数
声 明 bool _fa s tc a l l Inhe r its F ro m ( T C la s s a C la s s ) {re turn Inhe r its F rom (C la s s T y p e ( ), a C la s s );}
这 个 函 数 用 于 判 断 两 个 对 象 的 继 承 关 系 如 果 aC la s s 参 数 指 定 的 类 是 对 象 的
基 类 这 个 函 数 就 返 回 T ru e 否 则 就 返 回 Fa ls e 注 意 这 个 函 数 与 C las s N am eIs 函 数 的 区 别 C las s N am eIs 要 求 类 名 精 确 匹 配 而 Inhe r i ts F ro m 函 数 只 要 求 是继 承 关 系
N e w I ns ta nc e 函 数
声 明 v ir tua l T O b je c t* _fa s tc a ll N e w Ins ta nc e ( T C la s s c ls ) ;
这 个 函 数 用 于 为 对 象 实 例 分 配 内 存 并 返 回 对 象 实 例 的 指 针 注 意 类 的 构造 函 数 会 自 动 调 用 N e w In s ta n c e 应 用 程 序 不 能 直 接 调 用 这 个 函 数 但 派 生类 可 以 重 载 N e w In s ta n c e 相 应 地 派 生 类 也 必 须 重 载 F re e Ins ta nc e 因 为 这两 个 函 数 是 配 对 使 用 的
S a fe C a llE x c e p tio n 函 数
声明 v ir tu a l H R e s u lt _ fa s tc a ll S a fe C a ll E x c e p tio n ( T O b je c t ∗ E x c e p t O b ject, v o id
- E x c e p t- A d d r);
实 现 CO M 和 OL E 接 口 的 类 应 当 重 载 这 个 函 数 以 处 理 异 常
1 . 9 T P e rsi st en t
T P e rsiste n t 提 供 了 对 象 之 间 相 互 赋 值 和 读 写 流 的 能 力 T P e rsiste n t 是 一 个 抽象 类 不 要 直 接 创 建 T P e rsiste n t 的 对 象 实 例 T P e rsiste n t 的 大 部 分 方 法 是 从T O b ject继 承 的 因 此 这 里 只 介 绍 几 个 T P e rsiste n t特 有 的 方 法
A ssig n 函 数
声 明 v ir tua l vo id _fa s tc a ll A s s ign( T P e rs is te n t* S ourc e ) ;
这 个 函 数 用 于 把 S ourc e 参 数 指 定 的 对 象 的 数 据 复 制 给 自 己 调 用 的 形 式 是 这样 的
D e s tin a tio n -> A s s ig n ( S o u rc e ) ;
S ourc e 参 数 的 类 型 是 T P e rsiste n t 因 此 只 要 是 T P e rsiste n t的 派 生 类 都 可 以 相互 赋 值 只 有 一 些 直 接 从 TO b je c t继 承 下 来 的 类 如 TC o m O b je c t T A u toO b je c t 等 才 是 不 可 赋 值 的
要 注 意 的 是 对 象 之 间 的 相 互 赋 值 是 有 前 提 的 那 就 是 两 个 对 象 必 须 是 赋值 相 容 的 两 个 对 象 的 类 型 要 么 完 全 一 致 要 么 具 有 继 承 关 系
您 也 可 以 用 赋 值 语 句 在 对 象 之 间 相 互 赋 值 赋 值 形 式 是 这 样 的
D e s tin a tio n = S o u rc e
但 要 注 意 这 与 调 用 A ssig n 函 数 含 义 不 同 赋 值 语 句 的 含 义 是 用 目 标 变 量 引用 源 变 量 所 引 用 的 对 象 实 例 而 调 用 A ss ig n 则 是 把 源 对 象 的 数 据 复 制 给 目 标对 象
A ssig n To 函 数
声 明 v ir tua l vo id _fa s tc a ll A s s ignT o( T P e rs is te n t* D e s t) ;
这 个 函 数 与 A ssig n 恰 好 相 反 用 于 把 自 己 的 数 据 复 制 给 D e s t 参 数 指 定 的 对象
D e fin e P ro p er tie s 函 数
声 明 v ir tu a l v o id _ fa s tc a ll D e f in e P ro p e rtie s ( T F ile r* F ile r ) ;
这 是 个 虚 拟 函 数 T P e rsiste n t的 派 生 类 重 载 它 是 为 了 把 对 象 的 非 公 开 数 据 写到 流 例 如 Fo rm 文 件 中 F ile r参 数 指 定 要 写 的 流
1 . 1 0 TC omp on en t
T C o m pone n t是 C+ + Bu ild e r 3 中 所 有 元 件 的 抽 象 基 类 它 提 供 了 元 件 的 基 本特 征 元 件 可 以 出 现 在 元 件 选 项 板 上 可 以 被 加 到 Fo rm 上 可 以 拥 有 和 管理 其 它 元 件
T C o m pone n t是 个 抽 象 类 不 要 直 接 创 建 它 的 实 例 尽 管 C+ + Bu ild e r 3 的 所
有 元 件 都 是 从 T C om pone nt继 承 下 来 的 但 直 接 继 承 于 T C om pone n t的 只 是 少数 几 个 非 可 视 的 元 件 大 部 分 元 件 是 从 T C om pone nt 的 派 生 类 TC o n tro l 继 承下 来 的
C o m O b jec t 特 性
声 明 _prope r ty _d i_ IU nknow n C o m O b je c t;
这 个 只 读 的 特 性 返 回 支 持 CO M 的 VC L 元 件 的 接 口 引 用 如 果 VC L 元 件 不 是作 为 一 个 CO M 组 件 的 外 套 访 问 这 个 特 性 将 导 致 E C om pone n t E r ro r异 常
C o m p o n e n t C o un t 特 性
声 明 _prope r ty in t C o m p one n tC oun t;
这 个 只 读 的 特 性 返 回 元 件 拥 有 的 子 元 件 的 数 目 例 如 对 于 TF o rm 元 件 来 说它 的 C o m pon e n t C oun t特 性 就 是 Fo rm 上 元 件 的 个 数
元 件 拥 有 的 子 元 件 放 在 C o m pone n ts 特 性 中 这 是 个 由 所 有 子 元 件 组 成 的 数组 其 索 引 从 0 开 始 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
A n s i S tr ing n a m e S tr ing(" T B u t to n " ) ; ch ar c o m p B u f [ 1 0 ] ;
T B u tton * b u t to n;
fo r ( in t i= 0 ; i < C o m p o n e n tC o u n t; i+ + )
{
if ( C o m po ne n ts [ i]- > C la s s N a m e Is ( na m e S tr in g ) )
{
//c a s t th e c o m p o n e n t to a T B u tto n * bu tto n = ( T B u t ton *) C o m p on e n ts [ i]; bu tto n-> F on t-> N a m e = " C ou r ie r" ;
ito a ( C o m p o n e n tC o u n t , c o m p B u f , 1 0 ) ;
E d i t 1 -> T e x t = A n s i S tr in g ( c o m p B u f) + A n s i S trin g (" c o m p o n e n ts " ) ;
}
}
}
C o m p o n e n t Inde x 特 性
声 明 _prope r ty in t C o m p one n tIn d e x;
这 个 只 读 的 特 性 返 回 某 个 子 元 件 在 元 件 数 组 中 的 索 引 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t ∗ Se n d e r )
{
c h a r in de x [ 10 ];
c h a r * s trin g = n e w c h a r [ s trle n (" T h e in d e x o f th e b u tto n is " ) ] ; i to a ( B u t to n1-> C o m p one n t In de x, in d e x, 1 0 ) ;
s trc py ( s tr ing, " T he in d e x of th e bu tton is " ) ; s trc a t( s trin g , in d e x ) ;
E d i t 1 -> T e xt = s tr ing;
d e le te s tr in g ;
}
上 例 把 Fo rm 1 上 的 B u tto n 1 元 件 的 索 引 值 转 换 成 字 符 串 后 显 示 在 编 辑 框 Ed i t1
中
C o m p o n e n ts 特 性
声 明 _prope r ty T C o m pon e n t* C o m pon e n ts [ in t In d e x];
这 个 只 读 的 特 性 就 是 由 元 件 所 拥 有 的 所 有 子 元 件 组 成 的 数 组 程 序 示 例 请参 照 前 面
C o m p o n e n t S ta te 特 性
声 明 _prope r ty T C o m pon e n t S ta te C o m p o n e n t S ta te ;
这 个 只 读 的 特 性 返 回 元 件 当 前 的 状 态 T C om pone n t S ta te 是 个 集 合 类 型 包含 下 列 元 素 c s L o a d ing, c s R e a d ing, c s W r i ting, c s D e s tro y ing, c s D e s ign ing ,c s A n c e s tor, c s U pda tin g, c s F ixups
C o m p o n e n t S ty le 特 性
声 明 _prope r ty T C o m pon e n t S ty le C o m pone n t S ty le ;
这 个 只 读 的 特 性 返 回 元 件 的 风 格 如 果 返 回 c s Inhe r i ta b le 表 示 这 个 元 件 是可 继 承 的
N a m e 特 性
声 明 |
P rope r ty N a m e : T C o m pone n t N a m e ; |
||||
---|---|---|---|---|---|
这 个 |
特 |
性 就 是 元 件 的 名 称 当 您 把 一 个 元 件 放 到 Fo rm 上 时 |
C+ + |
Bu ild e r |
3 |
给 这 个 元 件 一 个 默 认 的 名 字 如 B u tto n 1 Ed it 1 等 当 然 您 可 以 另 取 一 个 名字 在 同 一 个 项 目 中 元 件 的 名 字 不 能 重 名 如 果 不 是 很 有 必 要 不 要 在运 行 期 修 改 元 件 的 名 字
Ow n e r 特 性
声 明 _prope r ty T C o m pon e n t* O w n e r ;
这 个 只 读 的 特 性 返 回 元 件 的 拥 有 者 当 拥 有 者 被 删 除 时 所 有 被 拥 有 的 元件 也 将 被 删 除 例 如 当 Fo rm 被 删 除 时 Fo rm 上 的 元 件 都 将 被 删 除
Ta g 特 性
声 明 _prope r ty in t T a g;
这 个 特 性 通 常 用 于 给 一 组 元 件 加 上 相 异 的 序 号 这 样 您 就 可 以 在 运 行 期 识别 它 们 例 如 假 设 Fo rm 上 有 十 个 按 钮 它 们 有 一 个 共 同 的 事 件 句 柄 为了 知 道 是 哪 个 按 钮 被 按 下 您 可 以 事 先 给 这 十 个 按 钮 编 号 然 后 用 Ta g 特 性判 断 是 哪 个 按 钮 被 按 下 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
if ( ty p e id(*S e n de r ) = = ty p e id ( T B u t ton)) if (((T B u t to n ∗ )S e n d e r)-> T a g = = 1 )
( ( T B u t to n *) S e nd e r ) -> C a p tio n = " M y ta g is 1" ;
}
T C o m po ne n t 构 造 函 数
声 明 _fa s tc a l l v ir tua l T C o m pone n t( T C o m pon e n t* AOw n e r ) ;
这 个 构 造 函 数 做 了 这 么 几 件 事 情 创 建 和 初 始 化 元 件 的 实 例 指 定 元 件 的拥 有 者 ( 由 AOw n e r 参 数 指 定 ) 把 C o m pone n tS ty le 特 性 设 为 c s Inhe r i ta b le 表 示此 元 件 是 可 继 承 的
对 于 元 件 来 说 一 般 不 需 要 显 式 地 调 用 这 个 构 造 函 数 因 为 当 您 把 一 个 元件 放 到 Fo rm 上 时 元 件 的 实 例 是 自 动 创 建 的 不 过 T C om pone nt的 派 生 类可 以 重 载 这 个 虚 拟 函 数
~ T C o m p o n e n t 析 构 函 数
声 明 _fa s tc a l l v ir tua l ~ T C o m p one n t( vo id);
析 构 函 数 用 于 删 除 元 件 的 实 例 包 括 该 元 件 所 拥 有 的 元 件 不 过 一 般 不需 要 显 式 地 删 除 元 件 的 实 例 因 为 当 应 用 程 序 终 止 时 会 自 动 删 除 应 用 程序 所 拥 有 的 Fo rm 进 而 删 除 Fo rm 上 的 元 件 当 然 如 果 元 件 是 在 运 行 期 动态 引 入 的 您 得 用 d e le te 关 键 字 来 删 除 元 件 的 实 例 对 于 Fo rm 来 说 最 好 调用 re le a s e 来 释 放 它 的 实 例 注 意 千 万 不 要 在 元 件 的 事 件 句 柄 中 删 除 元 件 自己 或 元 件 的 拥 有 者 否 则 会 导 致 意 想 不 到 的 结 果
F ind C o m po ne n t 函 数
声 明 T C o m pone n t* _fa s tc a ll F indC o m pon e n t( c ons t S y s te m :: A n s i S tr ing AN a m e ) ;
这 个 函 数 从 元 件 所 拥 有 的 元 件 ( 实 际 上 就 是 从 C o m pone n ts 数 组 ) 中 查 找 一 个 元
件 其 名 称 是 AN a m e 参 数 ( 大 小 写 不 敏 感 ) 如 找 到 就 返 回 这 个 元 件
F ree N o tifica tio n 函 数
声 明 vo id _fa s tc a ll F re e N o tif ic a tion( T C o m po ne n t* A C o m pon e n t) ;
这 个 函 数 通 知 A C om pone nt参 数 指 定 的 元 件 本 元 件 将 要 被 删 除 了 例 如元 件 A 被 赋 值 给 元 件 B 的 某 特 性 当 元 件 A 将 要 被 删 除 时 就 要 通 知 元 件 B 不 过 如 果 元 件 A 和 元 件 B 位 于 同 一 个 Fo rm 内 通 知 是 自 动 进 行 的 如 果 两个 元 件 不 在 同 一 个 Fo rm 内 并 且 存 在 依 赖 关 系 才 需 要 调 用 F re e N o tific a tio n
G e t P a re n t C o m p o n e n t 函 数
声 明 DYNA M IC T C o m pone n t* _fa s tc a l l G e t P a r e n t C o m pon e n t( vo id);
这 是 个 动 态 方 法 派 生 类 重 载 它 是 为 了 返 回 一 个 特 定 的 父 类 型
H a s P a r e n t 函 数
声 明 DYNA M IC b o o l _ fa s tc a ll H a s P a re n t( v o id ) ;
这 个 函 数 判 断 元 件 是 否 有 父 父 通 常 是 元 件 所 在 的 容 器 如 Fo rm Pa n e l
等
I n s ert C o m p o n en t 函 数
声 明 vo id _fa s tc a ll In s e r t C o m pone n t( T C o m p one n t* A C o m po ne n t) ;
这 个 函 数 向 元 件 的 C o m pon e n ts 数 组 中 增 加 一 个 A C o m pone nt 参 数 指 定 的 元件 这 个 元 件 要 么 没 有 名 字 要 么 与 C o m pone n ts 数 组 中 现 有 的 元 件 相 异程 序 示 例 如 下
vo id M o ve T o M o d u le ( T Form ∗ S o u rce, T D a taM o d u le ∗ D e s t)
{
in t I ;
T C om pon e n t∗ Te m p ;
fo r ( I = S ourc e -> C om p o n e n t C o unt - 1; I > = 0; I
-
- )
{
T e m p = S o u rc e -> C o m p o n e n ts [ I ] ;
if ( d y n a m ic _ c a s t< T C o n tro l ∗ >( T e m p ) = = N U L L )
{
S ourc e -> R e m ove C o m p o n e n t( T e m p ) ; D e s t-> In s e rt C o m p o n e n t( T e m p );
}
}
}
M ove T o M o d u le 函 数 的 作 用 就 是 把 Fo rm 上 所 有 非 可 视 的 元 件 移 到 数 据 模 块上 函 数 通 过 一 个 类 型 强 制 转 换 来 判 断 元 件 是 否 属 于 可 视 的 控 件 如 不 是
就 调 用 R e m o ve C o m pone n t 从 Fo rm 上 删 除 这 个 控 件 再 调 用 In s e r t C o m pone nt
把 控 件 插 入 到 数 据 模 块 上
R e m o v e C o m p o n e n t 函 数
声 明 vo id _fa s tc a ll R e m ove C o m pon e n t( T C o m po ne n t* A C om pon e n t) ;
这 个 函 数 从 元 件 的 C o m pone n ts 数 组 中 删 除 A C o m pone nt参 数 指 定 的 元 件 注意 在 设 计 期 无 论 您 把 一 个 元 件 加 到 Fo rm 上 还 是 从 Fo rm 上 移 走 一 个 元件 In s e r t C o m pone n t或 R e m o ve C o m pone n t都 是 自 动 调 用 的
1 . 11 TC ont ro l
T C on trol是 从 T C o m pone n t继 承 下 来 的 作 为 C+ + Bu i ld e r 3 中 所 有 控 件 的 基类 所 谓 控 件 是 指 那 些 在 运 行 期 可 见 的 元 件 例 如 TB u t to n 元 件 在 运 行期 就 是 个 按 钮 TEd i t元 件 在 运 行 期 就 是 一 个 编 辑 框 对 于 控 件 来 说 您 可以 设 置 它 的 外 观 包 括 尺 寸 位 置 光 标 形 状 提 示 信 息 并 且 能 够 响 应鼠 标 事 件
A lig n 特 性
声 明 _prope r ty T A l ign A lign; |
||||
---|---|---|---|---|
这 个 特 性 用 于 设 置 控 件 在 其 容 器 上 的 排 列 方 式 以 是 以 下 值 |
T A lig n 是 个 枚 举 |
类 |
型 |
可 |
|
-
alT
o p 控 件 移 到 容 器 的 顶 部 其 宽 度 总 是 填 满 容 器 的 水 平 尺 寸
-
alB
o t to m 控 件 移 到 容 器 的 底 部 宽 度 总 是 填 满 容 器 的 水 平 尺 寸
-
alL
e f t 控 件 移 到 容 器 的 左 部 其 高 度 总 是 填 满 容 器 的 竖 直 尺 寸
-
a
l R ight 控 件 移 到 容 器 的 右 部 其 高 度 总 是 填 满 容 器 的 竖 直 尺 寸
-
a l C
lie n t 控 件 总 是 填 满 整 个 容 器 的 剩 余 客 户 区 这 时 候 如 果 要 选 择容 器 元
件 只 能 在 O b ject In s p ecto r顶 端 的 对 象 列 表 中 找 到 容 器 元 件
B o unds R e c t 特 性
声 明 _prope r ty W indow s :: T R e c t B ounds R e c t ;
这 个 特 性 返 回 控 件 的 边 界 矩 形 该 矩 形 以 控 件 在 其 父 控 件 上 的 坐 标 表示 坐 标 原 点 就 是 父 控 件 的 左 上 角 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
T R ect M y R ect = A c t iv eC o n tro l-> B o u n d s R ect;
M y R ect. R ig h t = M y R e ct. L eft + 2 * ( M y R ect.R ig h t - M y R ect.L e f t) ;
M y R ect. B o t to m = M y R ect.T o p + ( M y R ec t . B o t to m - M y R ect.T o p ) / 2 ; A c tiv e C o n tro l-> B o u n d s R e c t = M y R e c t ;
}
上 述 代 码 把 Fo rm 上 当 前 控 件 的 宽 度 扩 大 一 倍 高 度 缩 小 一 倍
C a p tio n 特 性
声 明 _prope r ty S y s te m : : A n s i S tr ing C a p tion;
这 个 特 性 用 于 设 置 控 件 的 标 识 字 符 串 默 认 就 是 控 件 的 名 字 有 时 候 为 了兼 容 键 盘 操 作 您 可 能 需 要 给 控 件 设 一 个 加 速 键 例 如 如 果 把 一 个 按 钮的 C a p tio n 特 性 设 为 & O p e n 显 示 在 屏 幕 上 就 是 O p e n 用 户 按 A lt+ O 就 相 当 于 单 击 这 个 按 钮
C lie n t H e ig h t 特 性
声 明 _prope r ty in t C lie n t H e igh t;
这 个 特 性 用 于 设 置 控 件 的 客 户 区 高 度 ( 以 像 素 为 单 位 ) 客 户 区 的 高 度 一 般 就是 控 件 的 高 度 但 对 Fo rm 来 说 客 户 区 高 度 等 于 Fo rm 的 高 度 减 去 标 题 栏 边 框 以 及 滚 杆 的 高 度
C lie n t O r ig in 特 性
声 明 _prope r ty ta gP O IN T C lie n tO r ig in ;
这 个 特 性 返 回 控 件 的 客 户 区 的 坐 标 原 点 实 际 上 就 是 客 户 区 的 左 上 角 坐 标
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
c h a r buf[ 1 0 ];
ito a ( B u tto n 1 -> C lie n t O rig in .y , b u f , 1 0 ) ; A n s i S trin g a B u f(b u f ) ;
E d i t 1 -> T e xt = a B uf;
}
C lie n t R e c t 特 性
声 明 _prope r ty W indow s :: T R e c t C lie n tR e c t;
这 个 特 性 返 回 控 件 的 客 户 区 的 矩 形 该 矩 形 的 左 上 角 坐 标 总 是 (0 , 0 ) 右 下角 的 坐 标 就 是 控 件 的 高 度 和 宽 度 相 当 于 R e c t( 0 , 0, C l ie n t W id th, C lie n tH e igh t) 程 序 示 例 如 下
M y C o n tro l-> C a n v a s -> M o v e T o ( M y C o n tro l-> C lie n t R e c t .L e f t, M y C o n tro l-> C lie n t R e c t .T o p ) ; M y C o n tro l-> C a n v a s -> L in e T o ( M y C o n tro l-> C lie n tR e c t .R ig h t ,
M y C o n tro l-> C lie n t R e c t .B o tto m ) ;
上 述 程 序 首 先 把 光 标 移 到 控 件 客 户 区 的 左 上 角 再 画 一 根 直 线 到 客 户 区 的右 下 角
C lie n t W id th 特 性
声 明 _prope r ty in t C lie n t W id th;
这 个 特 性 返 回 控 件 的 客 户 区 的 宽 度 ( 以 像 素 为 单 位 ) 相 当 于
C lie n tR e c t. R ight
C o lo r 特 性
声 明 _prope r ty G ra ph ic s :: T C o lo r C o lo r ;
这 个 特 性 用 于 设 置 控 件 的 背 景 颜 色 可 以 是 RG B 值 也 可 以 是 颜 色 常 量也 可 以 从 颜 色 对 话 框 的 返 回 值 获 取 颜 色 程 序 示 例 如 下
B u t to n 1 -> C o lo r = R G B ( 0 ,2 55 ,0); E d it1 -> C o lo r = c l M a ro o n ;
if (C o lo r D ia lo g 1 -> E x e c u te ( )) S h a p e 1 -> C o lo r = C o lo rD ia lo g 1 -> C o lo r;
C o n tro lS ty le 特 性
声 明 _prope r ty T C o n tro lS ty le C o n tro l S ty le ;
这 个 特 性 用 于 设 置 控 件 的 风 格 一 般 来 说 控 件 的 风 格 在 创 建 时 设 好 后一 般 是 不 改 的
Cu r s o r 特 性
声明 _p rop e r ty T C urs o r C u rs or;
这 个 特 性 用 于 设 置 当 鼠 标 进 入 控 件 的 客 户 区 时 光 标 的 形 状 可 以 设 为 以 下常 量
D e s k to p F o n t 特 性
声 明 _prope r ty bool D e s k topF on t;
如 果 这 个 特 性 设 为 T ru e 就 把 Sc re e n 对 象 的 Ic onF ont 特 性 赋 给 控 件 的 F ont 特性 这 是 为 了 保 证 整 个 桌 面 的 字 体 一 致
D r ag C u r s o r 特 性
声 明 _prope r ty T C u rs o r D ra g C u rs or;
这 个 特 性 用 于 设 置 在 进 行 鼠 标 拖 放 操 作 时 光 标 的 形 状
D r ag M o d e 特 性
声 明 _prope r ty T D ra gM ode D ra g M ode ;
这 个 特 性 用 于 设 置 鼠 标 拖 放 的 方 式 可 以 是 以 下 值
- dm A
u to m a t ic 只 要 在 控 件 上 按 下 鼠 标 就 进 入 拖 放 操 作 不 需 要 调 用
B e g in D ra g
- dm
M a nu a l 需 要 调 用 B e g in D ra g 拖 放 才 可 以 进 行
En a b le d 特 性
声 明 _prope r ty bool E n a b le d ;
正 常 情 况 下 En a b le d 特 性 设 为 T ru e 如 果 把 En a b le d 特 性 设 为 Fa ls e 控 件 就不 能 响 应 鼠 标 键 盘 以 及 定 时 器 同 时 控 件 本 身 也 变 灰 显 示
Fo n t 特 性
声 明 _prope r ty G ra ph ic s :: T F on t* F on t;
这 个 特 性 用 于 设 置 控 件 上 文 本 的 字 体 在 设 计 期 您 可 以 用 O b je c t In s p ecto r
修 改 控 件 的 F on t特 性 要 在 运 行 期 修 改 F on t特 性 程 序 示 例 如 下
vo id _ fa s tc a l l T F orm 1 : : F orm C re a te ( T O b je c t *S e n d e r )
{
fo r ( in t i = 0 ; i < S c re e n -> F o n ts -> C o u n t; i+ + )
C o m b oB o x1-> I te m s -> A d d( S c re e n -> F o n ts -> S tr in gs [ i]) ;
}
vo id _ fa s tc a l l T F orm 1 : : C om boB ox 1C l ic k ( T O b je c t *S e n d e r )
{
R ic h E d i t 1 -> F o n t-> N a m e = C o m b oB ox 1-> I te m s -> S tr ings [ C om boB o x 1-> I te m Ind e x ];
}
上 述 程 序 首 先 在 Fo rm 创 建 的 时 候 把 屏 幕 所 支 持 的 字 体 的 名 称 列 在 组 合 框C o m boB ox1 中 当 用 户 从 组 合 框 中 选 择 一 种 字 体 后 RT F 编 辑 器 R ic h E d it 1 中 就 相 应 地 改 变 字 体
H e ig h t 特 性
声 明 _prope r ty in t H e ig h t;
这 个 特 性 用 于 设 置 控 件 的 高 度 ( 以 像 素 为 单 位 ) 一 般 就 是 控 件 客 户 区 的 高度
H in t 特 性
声 明 _prope r ty S y s te m : : A n s i S tr ing H in t;
当 鼠 标 在 控 件 上 稍 作 停 留 时 控 件 的 旁 边 将 弹 出 一 个 提 示 窗 口 一 般 是 显示 关 于 这 个 控 件 的 简 短 描 述 描 述 的 内 容 就 是 由 H in t特 性 设 置 的 同 时 将 触发 A p p lic a t io n 的 O n H in t事 件 如 果 程 序 处 理 这 个 事 件 的 话 就 可 以 在 状 态 栏上 进 一 步 显 示 详 细 的 描 述
注 意 要 显 示 H in t 控 件 的 S how H in t特 性 必 须 设 为 T ru e 如 果 控 件 的 S how H int
特 性 为 T ru e 但 没 有 指 定 H in t的 内 容 将 借 用 其 父 控 件 的 H in t
L e f t 特 性
声 明 _prope r ty in t L e f t ;
这 个 特 性 是 控 件 相 对 于 它 的 父 控 件 的 左 上 角 的 横 坐 标 ( 以 像 素 为 单 位 )
M o u s e C a p tu re 特 性
声 明 _prope r ty bool M ous e C a p tu re ;
如 果 这 个 特 性 设 为 T ru e 控 件 就 能 够 捕 捉 鼠 标 的 动 作
Pa re n t 特 性
声 明 _prope r ty T W in C on tro l* P a re n t;
这 个 特 性 用 于 设 置 或 返 回 控 件 的 父 控 件 在 设 计 期 当 您 把 一 个 控 件加 到 Fo rm 或 其 它 容 器 上 时 Fo rm 或 容 器 就 自 动 成 为 该 控 件 的 父 在 运行 期 当 您 通 过 代 码 创 建 了 一 个 控 件 的 实 例 后 一 定 要 指 定 这 个 控 件 的
父 程 序 示 例 如 下
T B u tton ∗ M y B u t ton;
M y B u tto n = n e w T B u tto n ( A p p lic a tio n ) ; M y B u t ton-> P a re n t = F o rm 1;
Pa re n t C o lo r 特 性
声 明 _prope r ty bool P a re n t C o lo r ;
如 果 这 个 特 性 设 为 T ru e 表 示 控 件 使 用 父 控 件 的 背 景 颜 色 这 是 为 了使 所 有 的 控 件 都 使 用 相 同 的 背 景 颜 色 如 果 这 个 特 性 设 为 Fa ls e 控 件 将 使
用 自 己 的 背 景 颜 色
Pa re n t F o n t 特 性
声 明 _prope r ty bool P a re n t F on t;
这 个 特 性 与 Pa re n t C o lo r 特 性 类 似 如 果 P a re n t F o nt 设 为 T ru e 表 示 所 有 控 件都 使 用 其 父 控 件 的 字 体 否 则 就 使 用 自 己 的 字 体
P a re n t Sho w H in t 特 性
声 明 _prope r ty bool P a re n t S how H in t;
如 果 这 个 特 性 设 为 T ru e 控 件 使 用 其 父 控 件 的 S how H int 特 性 值 换 句话 说 只 要 父 控 件 的 S h o wH in t 特 性 为 T ru e 所 有 子 控 件 将 显 示 提 示 窗口 如 果 父 控 件 的 S h o wH in t特 性 为 Fa ls e 所 有 子 控 件 不 显 示 提 示 窗 口如 果 P a re n t S h ow H in t特 性 设 为 Fa ls e 控 件 就 可 以 自 己 决 定 是 否 要 显 示 提 示 窗口
P o pup M e n u 特 性
声 明 _prope r ty M e nus : : T P opupM e nu* P opupM e nu;
这 个 特 性 用 于 指 定 一 个 浮 动 的 弹 出 式 菜 单 当 用 户 单 击 鼠 标 右 键 时 将 弹 出这 个 菜 单
Sho w H in t 特 性
声 明 _prope r ty bool S how H in t;
如 果 这 个 特 性 设 为 T ru e 当 鼠 标 在 控 件 上 稍 作 停 留 时 将 弹 出 一 个 提 示 窗口 提 示 的 内 容 由 H in t特 性 设 置
Te x t 特 性
声 明 _prope r ty S y s te m : : A n s i S tr ing T e x t;
这 个 特 性 并 不 是 所 有 控 件 都 有 如 果 有 的 话 默 认 就 是 控 件 的 名 称 对 于
TEd i t TM e m o 等 编 辑 类 控 件 来 说 Te x t特 性 就 是 编 辑 框 中 的 内 容
To p 特 性
声 明 _prope r ty in t T op;
这 个 特 性 是 控 件 相 对 于 它 的 父 控 件 的 左 上 角 的 纵 坐 标
V is ib le 特 性
声 明 _prope r ty bool V is ib le ;
这 个 特 性 用 于 决 定 控 件 是 否 要 显 示 在 屏 幕 上 如 果 设 为 T ru e 控 件 在 屏 幕上 就 是 可 见 的 相 当 于 调 用 Sh o w 如 果 设 为 Fa ls e 在 屏 幕 上 就 找 不 到 这 个控 件 相 当 于 调 用 H id e
W id th 特 性
声 明 _prope r ty in t W id th ;
这 个 特 性 是 控 件 的 宽 度 ( 以 像 素 为 单 位 ) 对 于 TTa b S h e e t 来 说 改 变 这 个 特性 是 无 效 的
W indo w P ro c 特 性
声 明 _prope r ty T W ndM e thod W indow P roc ;
其 中 T W n d M e thod 是 这 样 声 明 的
ty pe de f v o id _ fa s tc a l l (_ c lo sure *T W ndM e tho d ) ( M e s s a ge s : :T M e s sa g e & M e s s a ge ) ;
这 个 特 性 用 于 指 定 一 个 函 数 用 这 个 函 数 来 响 应 M e ss a g e 参 数 指 定 的 W ind ow s 消 息 在 对 这 个 特 性 赋 值 之 前 首 先 要 保 存 该 特 性 原 先 的 值 ( 默 认 是W ndP ro c )
W indo w Te x t 特 性
声 明 _prope r ty c h a r* W indow T e x t;
这 个 特 性 与 Te x t特 性 区 别 不 大 但 Te x t特 性 可 以 重 载
B e g in D r a g 函 数
声 明 vo id _fa s tc a ll B e g inD ra g( bool Im m e d ia te ) ;
这 个 函 数 用 于 开 始 拖 放 如 果 Im m e d ia te 参 数 设 为 T ru e 拖 放 立 即 开 始 光标 变 成 D ra g C u rs o r 特 性 指 定 的 形 状 如 果 Im m e d ia te 参 数 设 为 Fa ls e 用 户 必须 拖 动 一 段 距 离 (5 个 像 素 ) 后 光 标 才 改 变 形 状 开 始 拖 放 这 是 考 虑 到 有 时 候用 户 单 击 这 个 控 件 并 不 是 为 了 拖 放
B r in g ToF ro n t 函 数
声 明 vo id _fa s tc a ll B r ingT oF ron t( vo id);
这 个 函 数 把 控 件 在 它 的 父 控 件 范 围 内 推 到 最 前 端 如 果 控 件 的 V is ib le
特 性 原 来 是 Fa ls e 现 在 也 变 成 T ru e 注 意 如 果 一 个 窗 口 类 控 件 被 另 一 个窗 口 类 控 件 覆 盖 或 者 一 个 非 窗 口 类 控 件 被 另 一 个 非 窗 口 类 控 件 覆 盖 调用 B r ingT oF ron t是 有 效 的 但 如 果 是 非 窗 口 类 控 件 被 窗 口 类 控 件 覆 盖 即 使调 用 B r ingT oF ron t也 无 效
假 设 有 两 个 Fo rm 分 别 是 Fo rm 1 和 Fo rm 2 Fo rm 1 上 有 一 个 按 钮 Fo rm 2 作 为一 个 工 具 选 项 板 单 击 这 个 按 钮 使 工 具 选 项 板 出 现 在 屏 幕 的 前 端
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
if ( ! F orm 2 -> V is ib le )
{
F o rm 2 -> V is ib le = tru e ;
F o rm 2 -> B rin g T o F ro n t( ) ;
}
}
C h an ge S c a le 函 数
声 明 DYNA M IC v o id _ fa s tc a ll C h a n g e S c a le ( in t M , in t D );
这 个 函 数 把 控 件 按 M /D 的 比 例 缩 放 同 时 也 改 变 了 控 件 的 位 置 相 当 于 同时 修 改 了 控 件 的 To p Le f t W id th 和 H e igh t特 性 假 设 要 把 控 件 的 尺 寸 增 大33% 程 序 可 以 这 么 写
C h a nge S c a le ( 133 ,100);或 者 C h a nge S c a le ( 4 ,3);
如 果 多 次 重 复 调 用 C h an g e S cale 每 次 将 在 前 一 次 缩 放 的 基 础 上 再 次 缩 放
最 后 有 可 能 使 控 件 变 得 非 常 大 或 非 常 小
C lic k 函 数
声 明 DYNA M IC v o id _ fa s tc a ll C lic k ( v o id ) ;
这 个 函 数 模 拟 鼠 标 的 单 击 行 为 从 而 触 发 O n C lic k 事 件 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
B u tto n 2 -> C lic k ( ) ;
}
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 2 C lic k ( T O b je c t * S e n d e r )
{
M e s s ag eB ee p ( 0 ) ;
}
C lie n t To Sc re e n 函 数
声 明 ta gP O IN T _fa s tc a ll C lie n tT o S c re e n ( c ons t ta gP O IN T & P o in t) ;
这 个 函 数 用 于 把 以 控 件 的 客 户 区 为 参 照 的 坐 标 转 化 成 以 屏 幕 为 参 照 的 坐标
假 设 Fo rm 上 有 两 个 编 辑 框 分 别 是 Ed it 1 和 E d it2 当 用 户 在 Fo rm 上 单 击 鼠 标时 就 把 鼠 标 所 点 的 位 置 的 X 坐 标 显 示 在 Ed it 1 中 把 Y 坐 标 显 示 在 Ed it 2 中程 序 这 么 写
vo id _ fa s tc a l l T F orm 1 : : F orm M ous e D ow n( T O b je c t *S e n de r , T M ouse B u tto n B u t to n , T S h if t S ta te S h ift, in t X , in t Y )
{
TP o in t P , Q ;
P .x = X ;
P . y = Y ;
Q = C lie n t T o S c re e n ( P ) ; c h a r xC o o rd [ 40 ];
c h a r y C oo rd [ 40 ];
i to a ( Q .x, xC o o rd , 1 0 ) ; i to a ( Q .y , y C oord, 1 0 ) ;
A n s i S tr ing xS tr in g ( xC oo rd ) ; A n s i S tr ing y S tr in g( y C oo rd);
E d it1 -> T e x t = x S trin g + " is th e X sc re e n c o o rd in a te " ; E d i t 2 -> T e xt = y S tr ing + " is th e Y s c re e n c o o rd ina te " ;
}
D b lC lic k 函 数
声 明 DYNA M IC v o id _ fa s tc a ll D b l C l ic k ( v o id ) ;
这 个 函 数 与 C lic k 类 似 用 于 模 拟 鼠 标 的 双 击 行 为 从 而 触 发 控 件 的
O n D b l C lic k 事 件
D e fa u lt H a nd le r 函 数
声 明 v ir tua l vo id _fa s tc a ll D e fa u l t H a nd le r ( vo id *M e s s a ge ) ;
这 个 函 数 提 供 了 处 理 M e ss a g e 参 数 指 定 的 W ind ow s 消 息 的 默 认 句 柄 如 果 控件 本 身 没 有 处 理 这 个 消 息 的 话
D e fa u lt H a nd le r 是 虚 拟 函 数 派 生 类 以 重 载 它 后 面 将 要 讲 到 W ndP ro c 函数 也 提 供 这 样 的 默 认 句 柄 那 么 这 两 者 之 间 有 什 么 区 别 呢
D e fa u lt H a nd le r 是 在 没 有 发 现 有 处 理 某 消 息 的 句 柄 存 在 的 前 提 下 才 调 用 的而 对 于 W ndP ro c 来 说 即 使 有 处 理 某 消 息 的 句 柄 存 在 也 要 首 先 调 用W ndP ro c
D r ag D ro p 函 数
声 明 DYNA M IC v o id _ fa s tc a ll D ra g D ro p ( S y s te m : : T O b je c t* S o u rc e , in t X, in t Y );
这 个 函 数 将 调 用 处 理 O n D ra g D ro p 事 件 的 句 柄 ( 如 果 有 的 话 )
D r agg in g 函 数
声 明 bool _fa s tc a ll D ra gg in g ( vo id);
如 果 控 件 正 在 被 进 行 拖 放 操 作 这 个 函 数 就 返 回 T ru e 假 设 Fo rm 上 有 三 个复 选 框 当 用 户 拖 动 其 中 一 个 复 选 框 时 Fo rm 的 背 景 颜 色 就 发 生 改 变
v o id _ fa s tc a ll T F o rm 1 ::F o rm A c tiv a te ( T O b je c t * S e n d e r )
{
C h e c kB o x 1-> D ra gM o d e = dm A u to m a t ic ;
C h e c kB o x 2-> D ra gM o d e = dm A u to m a t ic ; C h e c kB o x 3-> D ra gM o d e = dm A u to m a t ic ;
}
v o id _ fa s tc a ll T F o rm 1 ::F o rm D ra g O v e r ( T O b je c t * S e n d e r , T O b je c t * S o u rc e , in t X , in t Y , T D ra g S ta te S tate, b o o l & A c cep t)
{
if (C h e c k B o x 1 -> D ra g g in g ( )) C o lo r = c l A q u a ;
if (C h e c k B o x 2 -> D ra g g in g ( )) C o lo r = c l Y e l lo w ; if (C h e c k B o x 3 -> D ra g g in g ( )) C o lo r = c l L im e ;
}
D r ag O ve r 函 数
声 明 DYNA M IC v o id _ fa s tc a ll D ra g O v e r ( S y s te m :: T O b je c t* S o u rc e , in t X, in t Y , T D ra gS ta te S ta te , bool & A ccep t) ;
这 个 函 数 将 调 用 处 理 O n D ra g O v e r事 件 的 句 柄 ( 如 果 有 的 话 )
E nd D r a g 函 数
声 明 vo id _fa s tc a ll E ndD ra g ( bool D rop);
这 个 函 数 与 B e g in D ra g 配 对 使 用 用 于 结 束 拖 放 其 中 D ro p 参 数 为 T ru e 时表 示 释 放 被 拖 放 的 对 象 D ro p 为 Fa ls e 时 表 示 不 释 放 对 象 拖 放 取 消
G e tTe x t B u f 函 数
声 明 in t _ fa s tc a ll G e tT e x t B u f ( c h a r * B u f fe r , in t B u f S iz e ) ;
这 个 函 数 把 控 件 上 的 文 字 复 制 到 B u ffe r指 定 的 缓 冲 区 中 Bu f S iz e 参 数 指 定 要复 制 的 字 符 个 数 函 数 返 回 实 际 复 制 的 字 符 数 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
in t S iz e = E d it1 -> G e tT e x tL e n ( ) ; ch ar * B u f fe r = n e w c h ar[ S ize+ 1 ] ;
E d it1 -> G e tT e x tB u f ( B u f fe r ,S iz e + 1 ) ; d e le te B u f fe r ;
}
G e tTe x t L e n 函 数
声 明 F u n c tio n G e tT e x tL e n : In te g e r ;
这 个 函 数 返 回 控 件 上 文 本 的 长 度 程 序 示 例 见 G e tT e x tB u f函 数
H a s P a r e n t 函 数
声 明 DYNA M IC b o o l _ fa s tc a ll H a s P a re n t( v o id ) ;
如 果 控 件 有 父 这 个 函 数 就 返 回 T ru e 一 般 来 说 控 件 总 是 有 父的
H id e 函 数
声 明 vo id _fa s tc a ll H ide ( v o id);
这 个 函 数 把 控 件 暂 时 隐 藏 起 来 相 当 于 把 V is ib le 特 性 设 为 Fa ls e
I n va lid ate 函 数
声 明 v ir tua l vo id _fa s tc a ll In v a lida te ( vo id);
这 个 函 数 通 知 W ind ow s 重 画 控 件 的 表 面
Pe r fo r m 函 数
声 明 in t _ fa s tc a ll P e r fo rm ( C a rd in a l M s g , in t W P a ra m , in t L P a ra m ) ;
这 个 函 数 向 控 件 自 己 发 一 个 消 息 M s g 指 定 消 息 W P a ra m 和 L P aram 指 定 参数
R e fre s h 函 数
声 明 vo id _fa s tc a ll R e f re s h ( vo id);
这 个 函 数 通 知 W ind ow s 重 画 控 件 的 表 面 与 R e p a in t函 数 的 功 能 相 似
R e p a in t 函 数
声 明 v ir tu a l v o id _ fa s tc a ll R e p a in t( v o id ) ;
这 个 函 数 通 知 W ind ow s 重 画 控 件 的 表 面 与 R e fre s h 函 数 的 功 能 相 似 如 果C on tro l S ty le 特 性 中 包 含 cs O p aq u e 元 素 这 个 函 数 只 重 画 控 件 自 己 如 果C on tro l S ty le 特 性 中 不 包 含 cs O p aq u e 元 素 这 个 函 数 还 将 重 画 被 控 件 部 分 遮
住 的 控 件 的 可 见 部 分
Sc re e n To C lie n t 函 数
声 明 ta gP O IN T _fa s tc a ll S c re e n T o C lie n t( c ons t ta gP O IN T & P o in t) ;
这 个 函 数 把 以 屏 幕 为 参 照 的 坐 标 转 化 为 以 控 件 的 客 户 区 为 参 照 的 坐 标 程序 示 例 如 下
T P o in t S c re e n O rg in , C lie n t P o in t; S c re e n O rg in .x = 0;
S c re e n O rg in .y = 0;
C l ie n t P o in t = B u t ton1-> S c re e nT oC lie n t( S c re e n O rg in);
上 述 程 序 把 屏 幕 坐 标 (0 , 0 ) 转 换 为 以 B u tto n 1 的 客 户 区 为 参 照 的 坐 标
Se nd C a n c e lM o d e 函 数
声 明 vo id _fa s tc a ll S e ndC a n c e l M ode ( T C o n tro l* S e nd e r ) ;
这 个 函 数 用 于 取 消 控 件 的 模 式 状 态 假 设 Fo rm 上 有 一 个 组 合 框 ( T C o m boB ox) 当 用 户 打 开 它 的 下 拉 列 表 时 组 合 框 就 处 于 模 式 状 态 此时 如 果 用 户 不 卷 起 下 拉 列 表 就 不 能 把 输 入 焦 点 移 走 调 用S e ndC a n c e l M ode 相 当 于 用 户 把 下 拉 列 表 卷 起
Se nd To B a c k 函 数
声 明 vo id _fa s tc a ll S e ndT oB a c k ( vo id);
这 个 函 数 与 B r ingT oF ront正 好 相 反 用 于 把 一 个 控 件 放 到 最 后 端 如 果 控 件
本 来 有 输 入 焦 点 输 入 焦 点 也 将 被 移 去 注 意 如 果 是 非 窗 口 类 控 件 被 窗口 类 控 件 覆 盖 即 使 调 用 S e ndT oB a c k 窗 口 类 控 件 始 终 在 非 窗 口 类 控 件 的前 端
Se t B o und s 函 数
声 明 v ir tua l vo id _ fa s tc a ll S e t B ounds ( int A L e f t, in t A T op , int A W id th , in t
AH e ig h t) ; |
|||
---|---|---|---|
这 个 函 数 同 时 设 置 控 件 的 Le f t |
To p |
W id th 和 H e ight特 性 |
从 最 终 效 果 看 |
调 用 S e t B ound s 与 分 别 修 改 Le f t |
To p |
W id th 和 H e igh t特 性 是 |
一 样 的 但 后 者 |
会 使 控 件 多 次 重 画 |
S e tTe x t B u f 函 数
声 明 v o id _ fa s tc a ll S e t T e x t B u f(c h a r* B u ffe r);
这 个 函 数 用 于 把 控 件 上 的 文 字 改 为 B u ffe r参 数 指 定 的 文 字 程 序 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t ∗ Se n d e r )
{
B u tto n 1 -> S e tT e x tB u f (" Y o u c lic k e d m e " ) ;
}
v o id _ fa s tc a ll T F o rm 1 ::F o rm A c tiv a te ( T O b je c t * S e n d e r )
{
B u tto n 1 -> C a p tio n = " C lic k m e " ;
}
Se t Z O r de r 函 数
声 明 DYNA M IC v o id _ fa s tc a ll S e t Z O rd e r ( bool T opM os t) ;
这 个 函 数 用 于 改 变 控 件 在 其 父 控 件 上 的 层 叠 顺 序 (Z -O rd e r ) 如 果 T opM os t 参 数 是 T ru e 控 件 就 移 到 最 顶 层 如 果 T opM os t参 数 是 Fa ls e 控 件 就 移 到 最底 层
Sho w 函 数
声 明 vo id _fa s tc a ll S how ( vo id);
这 个 函 数 相 当 于 把 控 件 的 V is ib le 特 性 设 为 T ru e 并 把 它 推 向 屏 幕 的 前 端
O n C lic k 事 件
声 明 _prope r ty C la s s e s :: T N o tif y E v e nt O n C lic k
ty p e d e f vo id _fa s tc a l l (_ c los ure * T N o tif y E v e n t) ( S y s te m :: T O b je c t* S e nde r ) ;
这 个 事 件 发 生 在 用 户 单 击 控 件 的 时 候 下 列 情 况 下 也 可 能 产 生 这 个 事 件
-
用
户 在 栅 格 列 表 树 状 视 图 中 用 键 盘 上 的 方 向 键 选 择 项 目
-
当 按
钮 或 复 选 框 具 有 输 入 焦 点 时 按 下 空 格 键
-
当 前
Fo rm 上 的 某 个 按 钮 定 义 为 默 认 按 钮 时 按 下 En te r键
-
当 前
Fo rm 上 的 某 个 按 钮 定 义 为 C a n c e l按 钮 时 按 下 Es c 键
-
用 户
按 下 了 按 钮 或 复 选 框 的 快 捷 键
-
把 单
选 按 钮 的 Ch e c k e d 特 性 设 为 T ru e
-
改 变
复 选 框 的 Ch e c k e d 特 性
-
用 户
单 击 Fo rm 上 的 空 白 处
O n D b lC lic k 事 件
声 明 _prope r ty C la s s e s :: T N o tif y E v e nt O n D b l C l ic k;
当 用 户 双 击 控 件 时 将 触 发 这 个 事 件
O n D r ag D ro p 事 件
声 明 _prope r ty T D ra gD ropE ve nt O n D ra g D rop;
其 中 T D ra gD ropE ve n t是 这 样 声 明 的
ty p e d e f vo id _ fas tcall (_ clo s u re *T D ra g D ro p E ven t) ( S y s te m : : T O b ject* S e n d e r , S y s tem : : T O b ject* S o u rce, in t X , in t Y ) ;
当 用 户 释 放 被 拖 曳 的 对 象 时 将 触 发 这 个 事 件 其 中 S e nde r参 数 是 被 拖 曳 的
对 象 释 放 时 的 目 标 控 件 S ourc e 参 数 是 被 拖 曳 的 对 象 X 和 Y 参 数 是 鼠 标 释放 时 的 坐 标
鼠 标 拖 放 是 非 常 有 趣 的 假 设 Fo rm 上 有 一 个 列 表 框 和 三 个 标 签 三 个 标 签的 字 体 各 不 相 同 当 用 户 拖 曳 某 个 标 签 到 列 表 框 时 希 望 列 表 框 的 字 体 变 成该 标 签 的 字 体 示 例 如 下
v o id _ fa s tc a ll T F o rm 1 ::L is tB o x 1 D ra g D ro p ( T O b je c t * S e n d e r , T O b je c t * S o u rc e , in t X , in t Y )
{
if (S e n d e r-> C la s s N a m e Is (" T L is t B o x " ) & & S o u rc e -> C la s s N a m e Is (" T L a b e l" ) )
{
T L is tB o x * D e s tL is t = ( T L is t B o x * ) S e n d e r ; D e s t L is t-> F ont = ( ( T L a b e l *) S ou rc e ) -> F o n t ;
D e s t L is t-> C o lo r = ( ( T L a b e l * ) S o u rc e )-> C o lo r;
}
}
O n D r ag O ve r 事 件
声 明 _prope r ty T D ra gO ve r E ve nt O n D ra g O v e r ;
其 中 T D ra gO ve r E ve n t是 这 样 声 明 的
ty pe de f v o id _ fa s tc a l l (_ c losure *T D ra g O v e r E v e n t) ( S y s te m : : T O b je c t* S e nd e r, S y s te m : : TO bje c t* S ourc e , in t X , in t Y, T D ra gS ta te S ta te , bool & A ccep t) ;
当 用 户 拖 着 对 象 经 过 控 件 时 将 触 发 这 个 事 件 在 事 件 句 柄 中 您 可 以 设 置
控 件 是 否 允 许 接 受 对 象 如 果 允 许 的 话 就 把 A cce p t参 数 设 为 T ru e 为 了 直 观地 表 示 是 否 允 许 接 受 通 常 要 改 变 光 标 的 形 状 来 表 示 是 否 允 许 要 改 变 光标 的 形 状 修 改 控 件 的 D ra g C u rs o r特 性
O n E nd D r a g 事 件
声 明 _prope r ty T E ndD ra gE ve nt O n E ndD ra g;
其 中 T E n d D ra gE ve n t是 这 样 声 明 的
ty pe de f v o id _ fa s tc a l l (_ c losure *T E n dD ra gE ve n t) ( S y s te m : : T O b je c t* S e n d e r, S y s te m : : T O b je c t* Ta rg e t , in t X , in t Y ) ;
这 个 事 件 发 生 在 拖 放 结 束 拖 放 结 束 可 能 是 因 为 用 户 释 放 了 鼠 标 或 者 被 取
消 如 果 拖 曳 的 对 象 被 控 件 接 受 Ta rg e t参 数 就 是 这 个 控 件 否 则 Ta rg e t参数 为 NUL L
注 意 上 述 三 个 事 件 中 前 二 个 发 生 于 目 标 控 件 上 第 三 个 发 生 于 被 拖 放的 对 象
O n M o u s e D o w n 事 件
声 明 _prope r ty T M ous e E ve nt O n M ous e D ow n;
其 中 T M ous e E ve n t是 这 样 声 明 的
ty pe de f v o id _ fa s tc a l l (_ c lo sure *T M o use E v e n t) ( S y s tem : : T O b je c t* S e nde r , T M ous e B u t to n B u tto n , C la s s e s ::T S h iftS ta te S h ift, in t X , in t Y ) ;
当 用 户 在 控 件 上 按 下 了 鼠 标 将 触 发 这 个 事 件 其 中 B u tto n 参 数 表 示 鼠 标 上 哪
个 按 钮 被 按 下 其 值 可 能 是 m b L e f t m b R ight或 m b M idd le Sh if t参 数 表 示 是否 有 Sh if t C tr l和 A lt键 按 下 其 值 可 能 是 ssS h if t ssA lt ssC tr l ssL e f t ssR ig h t ssM id d le s s D oub le
O n M o u s e M ov e 事 件
声 明 _prope r ty T M ous e M o v e E ve nt O n M ous e M ove ;
其 中 T M ous e M ove E v e n t是 这 样 声 明 的
ty p e d e f v o id _ fas tcall (_ clo s u re ∗ T M o u s e M o v e E v e n t)( S y s te m :: T O b je c t* S e n d e r , C la s s e s ::T S h iftS ta te S h ift, in t X , in t Y ) ;
当 用 户 在 控 件 上 移 动 鼠 标 的 时 候 将 触 发 这 个 事 件 Sh if t参 数 的 含 义 见 上
O n M o u s e U p 事 件
声 明 _prope r ty T M ous e E ve nt O n M ous e U p;
其 中 T M ous e E ve n t是 这 样 声 明 的
ty p e d e f v o id _ fa s tc a ll (_ c lo su re ∗ T M o u se E v e n t)( S y s te m ::T O b je c t* S e n d e r , T M o u s e B u tto n B u tto n , C la s s e s ::T S h iftS ta te S h ift, in t X , in t Y ) ;
当 用 户 在 控 件 上 释 放 鼠 标 时 将 触 发 这 个 事 件 注 意 释 放 和 按 下 可 能 不 在 同
一个控件上
下 面 通 过 一 个 程 序 示 例 帮 助 您 理 解 O n M ouse D ow n O n M ouse M ove 和
O n M ouse U p 事件
假 设 Fo rm 上 有 一 个 状 态 栏 状 态 栏 分 成 四 个 窗 格 要 让 用 户 在 Fo rm 上 用 鼠 标画 一 个 矩 形 并 且 在 状 态 栏 的 四 个 窗 格 中 显 示 矩 形 四 个 角 的 坐 标 程 序 这 么写
in t S ta rtX , S ta rtY ;
vo id _fa s tc a l l T F orm 1 : : B u tto n 1 M o us e D ow n( T O b je c t *S e n de r , T M ouse B u tto n B u t to n , T S h if t S ta te S h ift, in t X , in t Y )
{
S ta r t X = X ; S ta r t Y = Y ;
}
v o id _ fa s tc a ll T F o rm 1 ::F o rm M o u s e M o v e ( T O b je c t * S e n d e r , T S h if t S ta te S h if t, in t X , in t Y )
{
if ( S h if t . C on ta in s ( s s L e f t))
{
if ( Y > S ta rtY )
{
S ta tu s B a r 1 -> P a n e ls [ 0 ]-> T e x t = " T o p : "
- In tT o S tr ( S ta r t Y ) ; S ta tu s B a r 1 -> P a n e ls [ 2 ]-> T e x t = " B o tto m : " + In tT o S tr ( Y ) ;
}
els e
{
S ta tu s B a r 1 -> P a n e ls [ 0 ]-> T e x t = " T o p : "
- In tT o S tr ( Y ) ;
S ta tu s B a r 1 -> P a n e ls [ 2 ] .T e x t = " B o tto m : "
- In tT o S tr( S ta r t Y ) ;
}
if ( X > S ta rtX )
{
S ta tu s B a r 1 -> P a n e ls [ 1 ]-> T e x t = " L e ft: "
- In tT o S tr( S ta r t X ) ; S ta tu s B a r 1 -> P a n e ls [ 3 ]-> T e x t = " R ig h t: " + In tT o S tr( X ) ;
}
els e
{
S ta tu s B a r 1 -> P a n e ls [ 1 ]-> T e x t = " L e ft: "
- In tT o S tr( X ) ;
S ta tu s B a r 1 -> P a n e ls [ 3 ]-> T e x t = " R ig h t: " + In tT o S tr( S ta r t X ) ;
}
}
}
vo id _fa s tc a l l T F o rm 1 : : F orm M ous e U p( T O b je c t *S e nde r , T M ou s e B u t to n B u t to n, T S h if t S ta te S h ift, in t X , in t Y )
{
F o rm 1 -> C a n vas -> R ectang le( S ta r t X , S tart Y , X , Y ) ; S ta tu s B a r 1 -> Pa n e ls [ 0 ]-> T e x t = " " ;
S ta tu s B a r 1 -> Pa n e ls [ 1 ]-> T e x t = " " ; S ta tu s B a r 1 -> Pa n e ls [ 2 ]-> T e x t = " " ; S ta tu s B a r 1 -> Pa n e ls [ 3 ]-> T e x t = " " ;
}
1 . 1 2 TW in Co nt r o l
T W in C on tro l是 所 有 窗 口 类 控 件 的 基 类 窗 口 类 控 件 具 有 以 下 几 个 特 征 可以 有 输 入 焦 点 用 户 可 以 用 键 盘 与 控 件 交 互 可 以 作 为 其 它 控 件 的 容 器 有 窗 口 句 柄 不 过 窗 口 类 控 件 实 际 上 并 不 是 直 接 从 T W in C on tro l继 承 的而 是 从 T C us to m C on tro l继 承 的
B r u s h 特 性
声 明 _prope r ty G ra ph ic s :: T B rus h* B rus h;
这 个 特 性 返 回 控 件 的 画 布 所 使 用 的 刷 子 (T B ru s h 对 象 )
C lie n t O r ig in 特 性
声 明 _prope r ty ta gP O IN T C lie n tO r ig in ;
这 个 特 性 返 回 控 件 的 客 户 区 的 左 上 角 的 屏 幕 坐 标
C lie n t R e c t 特 性
声 明 _prope r ty W indow s :: T R e c t C lie n tR e c t;
这 个 特 性 返 回 控 件 的 客 户 区 的 矩 形 相 当 于 R e c t( 0 , 0, C l ie n t W id th, C lie n tH e igh t)
C o n tro lC o un t 特 性
声 明 _prope r ty in t C on tro l C oun t;
这 个 只 读 的 特 性 返 回 子 控 件 的 数 目 子 控 件 的 索 引 是 从 0 开 始 的
C on tro l C oun t特 性 的 值 总 是 比 最 大 索 引 值 大 1
C o n tro ls 特 性
声 明 _prope r ty T C o n tro l* C on tro ls [ in t Inde x];
这 个 只 读 的 特 性 是 由 控 件 的 子 控 件 组 成 的 数 组 注 意 : 不 要 把 它 同 元 件 的C o m pon e n ts 特 性 混 淆 假 设 把 一 个 按 钮 加 到 一 个 分 组 框 内 这 个 按 钮 的 拥有 者 仍 然 是 Fo rm 但 其 父 控 件 是 分 组 框 而 不 是 Fo rm 我 们 通 过 一 个 程序 示 例 来 说 明 C on tro ls 特 性 的 用 法
这 个 程 序 的 思 路 是 这 样 的 假 设 Fo rm 上 有 一 个 分 组 框 和 一 个 加 / 减 控 件 ( T U p D o w n ) 分 组 框 内 有 若 干 个 控 件 当 用 户 单 击 加 / 减 控 件 的 箭 头 时 分组 框 内 的 控 件 就 上 下 移 动
vo id _ fa s tc a l l T F orm 1 : : U pD ow n1C l ic k( T O b je c t *S e n de r , T U D B tn T y p e B u t to n)
{
in t I ;
T C on tro l *C h ild C o n tro l ;
fo r ( I = 0; I < G roupB ox 1 -> C on tro l C o u n t ; I+ + )
{
C h i ld C o n tro l = G rou pB o x 1-> C o n tro ls [ I ] ; if ( B u t ton = = b t N e x t)
C h i ld C o n tro l-> T op = C h i ld C on tro l-> T op + 1 5 ; els e
C h i ld C o n tro l-> T op = C h i ld C on tro l-> T op - 1 5 ;
}
}
C tl3 D 特 性
声 明 _prope r ty bool C tl3 D ;
这 个 特 性 用 于 设 置 控 件 是 否 具 有 3- D 的 外 观 默 认 是 T ru e
H a nd le 特 性
声 明 _prope r ty H W N D H a nd le ;
这 个 只 读 的 特 性 非 常 有 用 它 能 够 返 回 控 件 的 窗 口 句 柄 在 调 用 W ind ow s 的AP I 时 可 能 要 用 到 这 个 句 柄 例 如 下 面 的 程 序 中 就 调 用 了 W ind ow s 的S how W indo w 函 数
S how W indo w ( F o rm 2-> H a nd le , S W _ S H O W M IN IM IZ E D ) ;
H e lp C o n te x t 特 性
声 明 _prope r ty C la s s e s :: T H e lp C o n te x t H e lp C o n te x t ;
典 型 的 W ind ow s 应 用 程 序 应 当 具 有 这 样 的 功 能 当 用 户 在 控 件 上 按 下 F1 键时 将 显 示 关 于 此 控 件 的 帮 助 帮 助 系 统 的 每 一 屏 都 有 一 个 唯 一 的 上 下 文 编号 H e lp C o n te x t特 性 就 是 用 于 设 置 上 下 文 编 号 如 果 H e lp C o n te x t设 为 0 控件 将 从 它 的 父 控 件 继 承 上 下 文 编 号
Im e M o d e 特 性
声 明 _prope r ty T Im e M ode Im e M ode ;
其 中 T Im e M ode 是 这 样 声 明 的
e num T Im e M ode { im D is a b le , im C los e , im O p e n , im D on t C a re , im S A lp h a , im A lpha , im H ira , im S K ata, im K a ta , im C h in e s e, im S H an g u el, im H a n g u el };
这 个 特 性 是 C+ + Bu ild e r 3 新 加 的 用 于 设 置 输 入 方 式 (IM E ) 如 果 只 输 入 英
文 字 母 和 数 字 建 议 设 为 im C lo s e 或 im D on tC a re 如 果 要 输 入 汉 字 建 议 设为 im C h in e s e
Im e N a m e 特 性
声 明 _prope r ty S y s te m : : A n s i S tr ing Im e N a m e ;
这 个 特 性 用 于 指 定 输 入 法 相 当 于 在 W ind ow s 的 控 件 面 板 中 双 击 输 入法 图 标 然 后 在 输 入 法 框 内 选 择 一 种 输 入 法 如 智 能 AB C 输 入 法
微 软 拼 音 输 入 法 等
如 果 Im e N a m e 特 性 指 定 的 输 入 法 不 存 在 或 不 能 使 用 就 用 程 序 启 动 时 的 输入 法 替 代
Pa re n t C tl 3 D 特 性
声 明 _prope r ty bool P a re n t C tl3 D ;
如 果 这 个 特 性 设 为 T ru e 表 示 控 件 使 用 它 的 父 控 件 的 C tl3 D 特 性 如 果
P a re n t C tl3 D 特 性 设 为 Fa ls e 控 件 使 用 自 己 的 C tl3 D 特 性
Pa re n t W in d o w 特 性
声 明 _prope r ty H W N D P a re n tW indow ;
这 个 特 性 用 于 指 定 一 个 非 VC L 窗 口 作 为 控 件 的 父 前 提 是 控 件 的 Pa re n t 特 性 为 NUL L 即 原 先 没 有 父 这 个 特 性 经 常 用 于 把 A c tiv e X 控 件 插 入 到所 指 定 的 窗 口 中
Sho w in g 特 性
声 明 _prope r ty bool S how ing;
这 个 只 读 的 特 性 返 回 控 件 是 否 显 示 在 屏 幕 上
Ta b O rd e r 特 性
声 明 _prope r ty T T a b O rde r T a bO rd e r ;
这 个 特 性 设 置 控 件 在 其 父 控 件 上 的 制 表 键 停 顺 序 (T a b O rd e r) 所 谓 制 表键 停 顺 序 是 指 当 用 户 按 Ta b 键 时 输 入 焦 点 在 子 控 件 上 依 次 移 动 的 顺 序 默认 情 况 下 这 个 顺 序 就 是 控 件 被 加 到 父 控 件 上 的 顺 序 Ta b O rd e r从 0 开 始每 个 控 件 的 Ta b O rd e r值 必 须 是 相 异 的 如 果 您 把 一 个 控 件 的 Ta b O rd e r特 性 设为 另 一 个 控 件 的 Ta b O rd e r 特 性 值 C+ + Bu ild e r 3 将 自 动 给 每 个 控 件 重 新 编号 注 意 只 有 当 Ta b S to p 特 性 为 T ru e 时 Ta b O rd e r才 是 有 效 的
Ta bS to p 特 性
声 明 _prope r ty bool T a b S top;
这 个 特 性 用 于 设 置 当 用 户 按 Ta b 键 时 输 入 焦 点 要 不 要 移 到 控 件 上 假 设 Fo rm 上 有 3 个 按 钮 和 1 个 列 表 框 如 果 希 望 按 Ta b 键 时 输 入 焦 点 只 在 3 个 按 钮 上 移动 不 希 望 移 到 列 表 框 上 您 可 以 把 列 表 框 的 Ta b S to p 特 性 设 为 Fa ls e
W indo w H a nd le 特 性
声 明 _prope r ty H W N D W indow H a nd le ;
这 个 特 性 返 回 控 件 的 窗 口 句 柄 相 当 于 H a nd le 特 性 不 过 W ind ow H a nd le 特 性 是 在 T W in C on tro l的 P ro te c te d 部 分 声 明 的 对 于 窗 口 类 控 件 来 说 只 能在 控 件 内 部 访 问 另 一 个 不 同 点 是 H n a d le 特 性 是 只 读 的 而 W ind ow H a nd le 特 性 既 可 以 读 也 可 以 写
A lig n C on tro ls 函 数
声 明 v ir tua l vo id _fa s tc a ll A l ignC on tro ls ( T C on tro l* A C on tro l, W indo w s : : T R e c t & R e c t) ;
这 个 函 数 在 控 件 的 客 户 区 的 指 定 区 域 按 A lig n 特 性 重 新 排 列 某 个 子 控 件
A C on tro l参 数 指 定 要 排 列 的 子 控 件 R ect指 定 客 户 区 的 某 块 区 域
B road c a s t 函 数
声 明 vo id _fa s tc a ll B roa dc a s t( vo id *M e s s a ge ) ;
这 个 函 数 用 于 向 所 有 的 子 控 件 广 播 一 个 消 息
C a nF o c u s 函 数
声 明 bool _fa s tc a ll C a nF oc u s ( v o id);
这 个 函 数 返 回 控 件 是 否 能 接 受 输 入 焦 点 只 有 当 控 件 和 它 的 父 控 件 的V is ib le 特 性 和 En a b le d 特 性 都 为 T ru e 时 C a nF oc u s 函 数 才 返 回 T ru e 否 则 就返 回 Fa ls e
C h an ge S c a le 函 数
声 明 DYNA M IC v o id _ fa s tc a ll C h a n g e S c a le ( in t M , in t D );
这 个 函 数 把 控 件 按 M /D 的 比 例 缩 放
C o n ta ins C o n tro l 函 数
声 明 bool _fa s tc a ll C on ta ins C on tro l( T C on tro l* C o n tro l) ;
这 个 函 数 返 回 C on tro l参 数 指 定 的 控 件 是 否 是 本 控 件 的 子 控 件 程 序 示 例 如下
vo id _ fa s tc a l l T F orm 1 : : B u tton1C l ic k ( TO b je c t *S e n de r )
{
if ( F o rm 1 -> C o n ta ins C o n tro l( L is t B o x 1 ) )
L a be l 1 -> C a p tio n = " T he fo rm c o n ta ins L is t B o x1" ;
}
C o n tro lA t P o s 函 数
声 明 T C on tro l* _fa s tc a l l C o n tro l A t P os ( c ons t ta gP O IN T & P os , bool A llo wD is a b le d ) ;
这 个 函 数 返 回 控 件 的 指 定 坐 标 点 处 的 子 控 件 如 果 该 点 处 没 有 子 控 件 函
数 返 回 NUL L A llo wD is a b le d 参 数 指 定 搜 索 子 控 件 时 是 否 要 包 括 当 前 禁 止 的子 控 件
C re a te H a nd le 函 数
声 明 v ir tua l vo id _fa s tc a ll C r e a te H a n d le ( vo id);
这 个 函 数 用 于 为 控 件 建 立 窗 口 句 柄 ( 如 果 还 没 有 建 立 的 话 ) 注 意 如 果 控 件的 Pa re n t特 性 为 NUL L 调 用 这 个 函 数 将 触 发 异 常
C rea te P a ra m s 函 数
声 明 v ir tu a l v o id _ fas tc a ll C reateP ara m s ( T C re ateP a ra m s & P ara m s ) ;
其 中 T C re ate P aram s 是 这 样 声 明 的
s tru ct T C reateP ara m s
{
ch ar * C ap t io n ; in t S ty le ;
in t E x S ty le ; in t X ;
in t Y ;
in t W id th ; in t H e ig h t ;
HW ND W n d P a re n t ; v o id *P a ra m ;
ta gW N D C L A S S A W indo w C la s s ; ch ar W in C la s s N a m e [ 6 4 ];
} ;
这 个 函 数 用 于 初 始 化 T C re ateP ara m s 结 构 也 就 是 给 它 的 每 个 成 员 赋 值
C rea te P a re n te d 构 造
声 明 c ons truc to r C re a te P a re n te d( P a re n tW indow : H W nd);
这 个 函 数 创 建 一 个 控 件 作 为 P a re n t W indow 参 数 指 定 的 非 VC L 窗 口 的 子 控件
C re a te Sub C la s s 函 数
声 明 v o id _ fas tc a ll C reateS u b C la s s ( T C reateP ara m s & P a ra m s , ch ar * C on tro l C la s s N a m e ) ;
这 个 函 数 用 于 创 建 一 个 窗 口 类 控 件 C on tro l C la s s N a m e 参 数 指 定 基 类 的 名
称 Pa ra m s 参 数 用 于 初 始 化 T C re ateP aram s 对 象
C re a te W ind o w H a nd le 函 数
声 明 v ir tua l vo id _fa s tc a ll C r e a te W indow H a nd le ( c o n s t T C re a te P a ra m s & P a ra m s ) ;
这 个 函 数 创 建 控 件 的 窗 口 句 柄 Pa ra m s 参 数 用 于 传 递 已 初 始 化 的
T C re ate P ara m s 对 象
C re a te W n d 函 数
声 明 v ir tua l vo id _fa s tc a ll C r e a te W nd( vo id);
这 个 函 数 先 调 用 C reateP ara m s 初 始 化 参 数 再 调 用 C reateW in d o w H a n d le 创建 控 件 的 窗 口 句 柄 并 调 整 控 件 的 尺 寸 再 调 用 Pe r fo rm 传 递 W M _ S E T F ONT 消 息 来 设 置 字 体
D e fa u lt H a nd le r 函 数
声 明 v ir tua l vo id _fa s tc a ll D e fa u l t H a nd le r ( vo id *M e s s a ge ) ;
这 个 函 数 提 供 了 对 所 有 消 息 的 默 认 处 理 您 可 以 重 载 这 个 虚 拟 函 数
M e ssa g e 参 数 是 无 类 型 的 您 可 以 强 制 转 换 为 T M e ssa g e 类 型 再 分 析 出
W P a ra m LP a ra m 和 R e s u lt 如 果 R e s u lt不 等 于 零 表 示 消 息 已 处 理 如 果 R e s u lt 等 于 零 表 示 消 息 还 没 有 处 理 您 可 以 处 理 这 个 消 息 然 后 您 应 当 把 R e s u lt 设 为 一 个 非 零 数 表 示 消 息 已 处 理
D e s tro y H a n d le 函 数
声 明 vo id _fa s tc a ll D e s tro y H a nd le ( vo id ) ;
这 个 函 数 删 除 控 件 的 窗 口 句 柄 但 不 删 除 控 件 本 身 如 果 控 件 还 有 一 些 窗口 类 的 子 控 件 这 个 函 数 将 同 时 删 除 这 些 子 控 件 的 窗 口 句 柄
以 后 您 可 以 调 用 C reateH an d le 重 新 创 建 控 件 的 窗 口 句 柄
D e s tro y W in do w H a nd le 函 数
声 明 v ir tua l vo id _fa s tc a ll D e s tro y W indow H a nd le ( vo id);
这 个 函 数 删 除 由 C reateW in d o w H a n d le 创 建 的 窗 口 句 柄
D e s tro y W n d 函 数
声 明 v ir tua l vo id _fa s tc a ll D e s tro y W nd( vo id ) ;
这 个 函 数 首 先 保 存 控 件 中 的 文 字 释 放 设 备 描 述 表 最 后 调 用
D e s tro y W indow H a nd le 删 除 窗 口 句 柄
D is a b le A lig n 函 数
声 明 vo id _fa s tc a ll D is a b le A lign( vo id);
这 个 函 数 将 暂 时 禁 止 控 件 上 的 子 控 件 重 新 排 列 当 您 正 在 对 Fo rm 进 行 缩 放
时 为 了 避 免 在 缩 放 函 数 中 这 些 子 控 件 重 新 排 列 可 以 先 调 用 D is a b le A lig n 函 数 缩 放 好 后 再 调 用 E n a b le A lig n 函 数 重 新 允 许 排 列 这 样 可 以 加 快 缩 放的 速 度
En a b le A lig n 函 数
声 明 vo id _fa s tc a ll E n a b le A l ign( vo id);
这 个 函 数 允 许 控 件 上 的 子 控 件 重 新 排 列 一 般 与 D is a b le A lig n 函 数 配 合 使 用
F in d N e x t C o n tro l 函 数
声 明 T W in C on tro l* _fa s tc a ll F indN e x t C on tro l( T W in C o n tro l* C u r C on tro l, bool G o F o rw a rd, bool C h e c kT a b S top, bool C h e c kP a re n t) ;
这 个 函 数 返 回 控 件 的 一 个 子 控 件 该 子 控 件 的 Ta b O rd e r顺 序 排 在 C u r C on tro l
参 数 指 定 的 子 控 件 的 后 面 如 果 C u r C on tro l参 数 指 定 的 不 是 控 件 的 子 控 件函 数 返 回 控 件 的 第 一 个 子 控 件 如 果 G o F o rw a rd 参 数 设 为 T ru e 表 示 按Ta b O rd e r 递 增 的 顺 序 查 找 如 果 C h ec k T ab S to p 参 数 为 T ru e 表 示 只 查 找
Ta b S to p 特 性 为 T ru e 的 子 控 件 如 果 C h ec k P a ren t参 数 为 T ru e 表 示 只 查 找 Pa re n t
特 性 为 该 父 控 件 的 子 控 件
Fo c u s e d 函 数
声 明 bool _fa s tc a ll F o c u s e d( vo id);
这 个 函 数 返 回 控 件 是 否 具 有 输 入 焦 点
G e t Ta b O r d er L is t 函 数
声 明 DYNA M IC v o id _ fa s tc a ll G e t T a b O rd e r L is t( C la s s e s :: T L is t* L is t) ;
这 个 函 数 用 于 把 子 控 件 ( 必 须 是 Ta b S to p 特 性 为 T ru e 的 子 控 件 ) 放 在 一 个 列 表中
G e t To p P a re n t H a nd le 函 数
声 明 H W N D _ fas tcall G e t T o p P aren t H an d le( v o id ) ;
这 个 函 数 返 回 它 最 顶 层 的 父 控 件 的 窗 口 句 柄 换 句 话 说 这 个 父 控 件 的 Pa re n t特 性 是 NUL L 处 在 最 顶 层 的 也 有 可 能 是 非 VC L 窗 口 此 时 函数 就 返 回 这 个 窗 口
H a n d le A lloc ate d 函 数
声 明 bool _fa s tc a ll H a nd le A llo c a te d( vo id);
这 个 函 数 返 回 控 件 的 窗 口 句 柄 是 否 已 存 在 注 意 您 也 可 以 用 H a nd le 特 性判 断 控 件 的 窗 口 句 柄 是 否 存 在 但 是 如 果 窗 口 句 柄 不 存 在 访 问 H n a d le 特 性 将 自 动 创 建 窗 口 句 柄
H a nd le N e e de d 函 数
声 明 vo id _fa s tc a ll H a nd le N e e d e d ( vo id);
这 个 函 数 用 于 建 立 控 件 的 窗 口 句 柄 ( 如 果 句 柄 不 存 在 的 话 )
I n se r t C o n tro l 函 数
声 明 vo id _fa s tc a ll In s e r t C o n tro l( T C on tro l* A C on tro l) ;
这 个 函 数 用 于 在 控 件 中 插 入 一 个 A C on tro l 参 数 指 定 的 子 控 件 程 序 示 例 如下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
if ( B u t ton1-> P a re n t = = G rou pB o x1)
{
}
els e
{
}
}
G rou pB o x 1-> R e m o v e C o n tro l( B u t to n 1 ) ; G rou pB o x 2-> Ins e r t C o n tro l( B u tto n 1 ) ;
G rou pB o x 2-> R e m o v e C o n tro l( B u t to n 1 ) ; G rou pB o x 1-> Ins e r t C o n tro l( B u tto n 1 ) ;
I n va lid ate 函 数
声 明 v ir tua l vo id _fa s tc a ll In v a lida te ( vo id);
这 个 函 数 强 制 控 件 重 新 显 示 一 遍 因 为 控 件 的 某 些 区 域 可 能 已 有 变 化
Pa in t To 函 数
声 明 v o id _ fa s tc a ll P a in t T o ( H D C D C , in t X , in t Y ) ;
这 个 函 数 把 控 件 在 指 定 的 设 备 描 述 表 的 指 定 位 置 重 画 DC 参 数 指 定 设 备 描述 表 X 和 Y 参 数 指 定 左 上 角 坐 标
P a le tte C h an ge d 函 数
声 明 DYNA M IC b o o l _ fa s tc a ll P a le tte C h a n g e d ( b o o l F o re g round);
您 可 以 重 载 这 个 函 数 当 W ind ow s 的 系 统 调 色 板 发 生 变 化 时 就 调 用 这 个 函数 重 新 实 现 控 件 及 其 子 控 件 的 调 色 板 有 必 要 的 话 还 要 用 新 的 调 色 板 重画 控 件
在 同 一 个 时 刻 只 有 一 个 窗 口 是 活 动 的 W ind ow s 用 前 景 调 色 板 重 画 活 动 的窗 口 用 背 景 调 色 板 重 画 其 它 非 活 动 的 窗 口 背 景 调 色 板 与 控 件 的 逻 辑 调色 板 大 致 相 似 每 个 控 件 可 以 分 别 实 现 不 同 的 背 景 调 色 板 而 前 景 调 色 板只 能 有 一 个
如 果 F o re G round 参 数 设 为 T ru e 表 示 Fo rm 已 经 被 激 活 正 在 重 新 实 现 前 景调 色 板 如 果 F o re G round 参 数 设 为 Fa ls e 表 示 另 外 一 个 应 用 程 序 或 Fo rm 已经 改 变 了 前 景 调 色 板 凡 是 与 这 个 前 景 调 色 板 相 关 的 控 件 应 当 重 新 实 现 一个 新 的 背 景 调 色 板
如 果 控 件 没 有 建 立 逻 辑 调 色 板 调 用 G e tP a le tte 将 返 回 零 调 用 P a le tte C ha ng e d 也 不 会 重 新 实 现 一 个 新 的 调 色 板 只 是 把 W ind ow s 已 改 变 系 统 调 色 板 的 消 息通 知 子 控 件 如 果 没 有 一 个 子 控 件 建 立 了 逻 辑 调 色 板 P a le t te C ha nge d 函 数就 返 回 Fa ls e
R e a lig n 函 数
声 明 vo id _fa s tc a ll R e a l ign( vo id ) ;
这 个 函 数 强 制 控 件 重 新 排 列 它 的 子 控 件 如 果 每 个 子 控 件 的 A lig n 特 性 都 设为 a l N one 调 用 R ealig n 无 效
R e m o v e C o n tr o l 函 数
声 明 vo id _fa s tc a ll R e m ove C on tro l( T C on tro l* A C on tro l) ;
这 个 函 数 把 A C on tro l参 数 指 定 的 子 控 件 从 C on tro ls 数 组 中 删 除 换 句 话 说就 是 取 消 了 父 子 关 系
R e s e t I m e 函 数
声 明 vo id _fa s tc a ll R e s e t Im e ( vo id);
这 个 函 数 用 于 恢 复 应 用 程 序 启 动 时 的 输 入 法 (IM E ) 前 面 讲 过 输 入 法 只 在控 件 具 有 输 入 焦 点 时 才 是 有 效 的 因 此 当 控 件 失 去 输 入 焦 点 时 就 会 自动 调 用 R e s e t Im e
R e s e t I m e C o m p o s itio n 函 数
声 明 bool _fa s tc a ll R e s e t Im e C o m pos itio n ( in t A c t io n ) ;
这 个 函 数 让 IM E 窗 口 进 行 一 个 由 A c tio n 参 数 指 定 的 任 务 A c tio n 参 数 可 以 设为 以 下 值 C PS_ C A N C E L C P S _ C O M P LE TE C P S _ C ONVE R T
CP S _ RE V E RT
Sc a le B y 函 数
声 明 v o id _ fa s tc a ll S c a le B y ( in t M , in t D ) ;
这 个 函 数 把 控 件 按 M /D 的 比 例 缩 放
S c a le C on tr o ls 函 数
声 明 vo id _fa s tc a ll S c a le C on tro ls ( int M , in t D ) ;
这 个 函 数 把 控 件 的 所 有 子 控 件 按 M /D 的 比 例 缩 放
Sc ro ll B y 函 数
声 明 v o id _ fa s tc a ll S c ro ll B y ( in t D e lta X , in t D e l ta Y ) ;
这 个 函 数 一 般 不 用 因 为 您 可 以 给 控 件 加 上 滚 杆 让 它 自 动 滚 动 如 果 您 不想 用 滚 杆 而 要 自 己 滚 动 可 以 调 用 这 个 函 数 其 中 D e lta X 表 示 水 平 方 向 上滚 动 的 像 素 数 正 数 表 示 向 右 D e lta Y 参 数 表 示 竖 直 方 向 上 滚 动 的 像 素 数正 数 表 示 向 下
Se le c t F ir s t 函 数
声 明 v o id _ fa s tc a ll S e le c t F irs t( v o id ) ;
这 个 函 数 用 于 选 择 控 件 的 第 一 个 子 控 件 如 果 找 到 就 激 活 该 子 控 件
Se le c t N e x t 函 数
声 明 vo id _fa s tc a ll S e le c t N e x t( T W inC on tro l* C u r C on tro l, bool G o F o rw a rd, bool C h e c k - T a b S top);
这 个 函 数 用 于 选 择 C u rC o n tro l 参 数 指 定 的 子 控 件 的 下 一 个 子 控 件
G o F o rw a rd C h ec k T ab S to p 参 数 的 含 义 见 前
Se t B o und s 函 数
声 明 v ir tu a l v o id _ fa s tc a ll S e tB o u n d s ( in t A L e f t, in t A T o p , in t A W id th , in t AH e ig h t) ;
这 个 函 数 用 于 设 置 控 件 的 边 界 矩 形 其 中 AL e f t和 AT o p 指 定 矩 形 的 左 上 角 坐
标 AW id th 和 AH e ig h t分 别 指 定 矩 形 的 宽 度 和 高 度
Se t C h ild O r de r 函 数
声 明 DYNA M IC v o id _ fa s tc a ll S e t C h ild O rd e r ( C la s s e s :: T C o m p o n e n t* C h i ld , in t O rd e r);
这 个 函 数 用 于 改 变 子 控 件 在 C on tro ls 数 组 中 的 顺 序 C h ild 参 数 指 定 子 控 件
O rd e r参 数 指 定 新 的 序 号 其 它 子 控 件 的 顺 序 将 自 动 调 整
Se t F o c u s 函 数
声 明 v ir tua l vo id _fa s tc a ll S e t F oc us ( vo id);
调 用 这 个 函 数 使 控 件 具 有 输 入 焦 点
Sho w C o n tro l 函 数
声 明 v ir tua l vo id _fa s tc a ll S how C o n tro l( T C on tro l* A C on tro l) ;
这 个 函 数 使 A C on tro l 参 数 指 定 的 子 控 件 是 可 见 的 相 当 于 该 子 控 件 调 用
S how
O n E n te r 事 件
声 明 _prope r ty C la s s e s :: T N o tif y E v e nt O n E n te r ;
这 个 事 件 发 生 在 控 件 从 非 活 动 状 态 变 成 活 动 状 态 的 时 候 如 果 是 因 为 切 换Fo rm 或 切 换 应 用 程 序 导 致 Fo rm 或 应 用 程 序 上 的 控 件 被 激 活 不 会 触 发 这 个事 件
对 于 容 器 元 件 如 TP a n e l和 T G roupB ox 来 说 当 容 器 上 的 某 个 子 控 件 被 激 活 时容 器 本 身 也 被 激 活 容 器 的 O n E n te r事 件 发 生 在 子 控 件 的 O n E n te r事 件 之 前
O n E x it 事 件
声 明 _prope r ty C la s s e s :: T N o tif y E v e nt O n E x i t;
这 个 事 件 发 生 在 控 件 从 活 动 状 态 变 成 非 活 动 状 态 的 时 候 如 果 是 因 为 切 换Fo rm 或 切 换 应 用 程 序 导 致 Fo rm 或 应 用 程 序 上 的 控 件 的 输 入 焦 点 被 移 走 不会 触 发 这 个 事 件
对 于 容 器 元 件 来 说 当 输 入 焦 点 从 容 器 的 某 个 子 控 件 移 到 容 器 外 时 容 器本 身 也 失 去 输 入 焦 点 容 器 的 O n E x it事 件 发 生 在 子 控 件 的 O n E x it事 件 之 后
O n K e y D o w n 事 件
声 明 _prope r ty T K e y E v e n t O n K e y D ow n;
其 中 TK e y E v e n t是 这 样 声 明 的
ty p e d e f vo id _ fas tcall (_ clo s u re *T K e y E ven t)( S y s te m :: T O b ject* S e n d er, W o rd & K ey , C las s e s : : T S h ift S ta te
S h ift);
当 用 户 在 有 输 入 焦 点 的 控 件 上 按 下 一 个 键 将 触 发 这 个 事 件 包 括 功 能 键键 组 合 以 及 鼠 标 按 钮 其 中 K e y 参 数 表 示 键 的 虚 拟 码 Sh if t 参 数 请 参 见O n M ous e D ow n 事 件
vo id _fa s tc a l l T F o rm 1 : : F orm K e y D o w n ( T O b je c t *S e n de r, W O R D & K e y, T S h if t S ta te S h ift)
{
if (K e y = = V K _ E S C A P E & & P r in te r( )-> P rin t in g )
{
P rin te r ( ) -> A b o r t( ) ;
M e s s a g e D lg (" P rin tin g a b o rte d " , m t In fo rm a tio n , T M s g D lg B u tto n s ( ) < < m b O K ,0 ) ;
}
}
这 段 程 序 先 判 断 用 户 按 下 的 是 否 为 ES C 键 并 且 是 否 正 在 打 印 如 是 的 话就 终 止 打 印 您 必 须 把 Fo rm 的 K e y P re v ie w 特 性 设 为 T ru e 这 样 O n K e y D o w n 事 件 才 会 被 Fo rm 1 调 用
O n K e y U p 事 件
声 明 _prope r ty T K e y E v e n t O n K e y U p
这 个 事 件 发 生 在 用 户 释 放 了 键 参 数 含 义 见 前 程 序 示 例 如 下
T C o lor F o rm C o lo r ;
vo id _ fa s tc a l l T F orm 1 : : F orm K e y D o w n ( T O b je c t *S e n de r , W O R D & K e y , T S h if t S ta te S h if t)
{
F o rm C o lo r = F o rm 1 -> C o lo r ; F o rm 1-> C o lor = c l A qua ;
}
v o id _ fa s tc a ll T F o rm 1 ::F o rm K e y U p ( T O b je c t * S e n d e r , W O R D & K e y , T S h if t S ta te S h ift)
{
F o rm 1-> C o lor = F o rm C o lo r ;
}
上 述 这 段 程 序 的 思 路 是 当 用 户 按 下 任 意 一 个 键 就 把 Fo rm 的 背 景 颜 色 改为 c l A qua 当 用 户 释 放 这 个 键 就 把 Fo rm 的 背 景 颜 色 恢 复 成 原 来 的 颜 色
O n K e y P re s s 事 件
声 明 _prope r ty T K e y P re s s E ve nt O n K e y P re s s ;
其 中 T K e y P re s s E ve n t是 这 样 声 明 的
ty p e d e f v o id _ fastcall (_ clo s u re * T K e y P re s s E v en t) ( S ys te m : : T O b ject* S e n d e r , ch ar & K e y ) ;
当 用 户 按 下 了 某 个 字 符 键 就 触 发 这 个 事 件 其 中 K e y 参 数 表 示 被 按 下 的 字
符
v o id _ fas tc a l l T F o rm 1 : : F o rm K ey P res s ( T O b je c t * S en d e r , char & K ey )
{
ch ar k e y S tr in g [ 2 5 ] ; K e y S tr ing [ 0] = K e y ;
s trc py (& key S tr in g [ 1 ] , " W a s P re s s e d" ) ;
A p p lic a tio n -> M e s sa g e B o x ( k e y S trin g , " K e y P re s s " , M B _ O K ) ;
}
1 . 1 3 TG ra ph ic Con tr ol
T G ra ph ic C on tro l也 是 从 T C on tro l继 承 下 来 的 它 是 C+ + Bu ild e r 3 中 所 有 非 窗口 类 控 件 的 基 类 非 窗 口 类 控 件 的 特 点 是 没 有 窗 口 句 柄 不 接 受 键 盘 输入 不 能 作 为 其 它 控 件 的 容 器 不 能 用 Ta b 键 来 选 择 典 型 的 非 窗 口 类 控 件有 T B ev el T Im a g e TP a in t B o x T S ha pe T S pe e d B u tton T S p litte r
T C u s to m L ab el T T oo lB u t ton 等
T G ra ph ic C on tro l继 承 了 T C on tro l的 所 有 特 性 方 法 和 事 件 增 加 了 C a nva s 特性 用 于 在 控 件 的 表 面 绘 图 增 加 了 虚 拟 的 Pa in t方 法 用 于 响 应 W M _ P A INT 消息
C a n va s 特 性
声 明 _prope r ty G ra ph ic s :: T C a nva s * C a nv a s ;
这 个 特 性 返 回 控 件 的 画 布 ( C a nva s ) 通 过 这 块 画 布 您 就 可 以 在 控 件 的 表 面绘 图 如 画 直 线 矩 形 椭 圆 填 充 或 输 出 文 字 C a nva s 特 性 是 TC a n v a s 对象 该 对 象 中 定 义 了 众 多 的 特 性 和 方 法 用 于 实 现 各 种 绘 图 功 能 程 序 示
例 如 下
v o id _ fa s tc a ll T F o rm 1 ::B u tto n 1 C lic k ( T O b je c t * S e n d e r )
{
Im a g e 1 -> C a nv a s -> B rus h -> C o lor = c l B la c k;
Im a g e 1 -> C a n v a s -> B ru s h -> S ty le = b s D ia g C ro s s ;
Im a g e 1 -> C a n v a s -> E llip se ( 0 , 0 , Im a g e 1 -> W id th , Im a g e 1 -> H e ig h t) ;
}
Pa in t 方 法
声 明 v ir tu a l v o id _ fa s tc a ll P a in t( v o id ) ;
T G ra ph ic C on tro l 的 派 生 类 应 当 重 载 这 个 函 数 当 非 窗 口 类 控 件 收 到W M _ P A INT 消 息 首 先 要 对 TC a n v a s 对 象 初 始 化 例 如 设 置 画 笔 刷 子 等然 后 调 用 Pa in t画 出 控 件 的 图 像
1 . 1 4 TC us to mC o n t r o l
T C us to m C on tro l是 个 很 有 意 思 的 类 它 是 从 TW in C o n tro l继 承 下 来 的 抽 象 类但 它 又 有 C a nva s 特 性 和 Pa in t方 法 也 就 是 说 T C us to m C on tro l同 时 具 有 窗 口类 控 件 和 非 窗 口 类 控 件 的 特 征 如 果 要 创 建 自 定 义 的 元 件 一 般 是 选T C us to m C on tro l作 为 祖 先 类
C a n va s 特 性
声 明 _prope r ty G ra ph ic s :: T C a nva s * C a nv a s ;
这 个 特 性 就 是 控 件 的 画 布 通 过 这 块 画 布 您 就 可 以 在 控 件 的 表 面 绘 图
Pa in t W in d o w 函 数
声 明 v ir tu a l v o id _ fa s tc a ll P a in tW in d o w ( H D C D C ) ;
当 控 件 收 到 W M _ P A INT 消 息 时 就 会 自 动 调 用 这 个 函 数 P a in t W indow 提 供 了画 布 要 使 用 的 设 备 描 述 表 (D C ) 并 且 调 用 Pa in t 重 画 控 件 的 表 面 最 后 删 除设 备 描 述 表
Pa in t 函 数
声 明 v ir tu a l v o id _ fa s tc a ll P a in t( v o id ) ;
这 个 函 数 是 由 P a in t W indow 调 用 的 用 于 重 画 控 件 的 表 面