VC++5.0 编 程 的 几 个 使 用 技 巧      ---- 在VC++5.0 编 程 中, 对 话 框 的 使 用 是 很 普 遍 的。 利 用ClassWiazrd 在 对 话 框 中 生 成 各 种 控 件 非 常 方 便。 以 下 介 绍 几 个 对 话 框 中 控 件 的 使 用 技 巧。 类 似 方 法 同 样 可 以 在 VC++4.x 中 使 用。 ---- 1、 组 合 框(ComboBox) ---- 当 用 资 源 编 辑 器 在 一 个 对 话 框 中 生 成 组 合 框 控 件 时 , 可 以 看 到 组 合 框 两 侧 的 控 制 点 是 实 心, 而 上 下 四 周 的 控 制 点 是 虚 心 的, 即 组 合 框 水 平 方 向 的 大 小 可 以 通 过 拖 动 组 合 框 控 件 两 侧 的 实 心 控 制 点 改 变, 垂 直 方 向 的 大 小 则 不 能 改 变。 为 了 改 变 垂 直 方 向 的 大 小, 可 以 用 鼠 标 单 击 组 合 框 控 件 的 下 拉 箭 头, 可 以 看 到 控 件 的 上 下 的 控 制 点 变 成 实 心, 此 时 可 以 拖 动 该 控 制 点 将 组 合 框 的 高 度 改 变。 当 运 行 程 序 时, 按 下 下 拉 箭 头,Windows 利 用 该 高 度 重 置 组 合 框 的 大 小。 ---- 如 果 组 合 框 中 各 列 表 项 是 固 定 的, 则 可 以 预 先 将 这 些 项 写 进 组 合 框。 方 法 是: 打 开 资 源 编 辑 器, 从 组 合 框 的 属 性(Proprities) 对 话 框 中 选 择Data 标 签, 在"Enter listbox Items" 列 表 框 中 填 加 各 列 表 项, 注 意 加 完 一 项 换 行 时, 必 须 用 Ctrl+Enter 组 合 键。 如 果 希 望 以 输 入 的 次 序 来 显 示 各 项, 则 不 要 选 择Styles 标 签 的Sort 项。 填 加 完 列 表 项 后, 利 用 上 述 方 法 改 变 组 合 框 的 高 度( 否 则 程 序 运 行 后, 单 击 组 合 框 下 拉 箭 头 列 表 框 不 出 现), 这 样, 运 行 程 序 后, 单 击 组 合 框 的 下 拉 箭 头 可 以 看 到 各 列 表 项 已 加 入 到 组 合 框 的 列 表 框 中。 ---- 2、 微 调 控 件(Spin) ---- 一 般 来 说, 微 调 控 件 与 获 取 数 值 输 入 的 编 辑 控 件 组 合 成 伙 伴 关 系 使 用, 利 用 微 调 控 件 的 上 下 箭 头 增 加 或 减 少 编 辑 控 件 中 数 值 的 大 小。 要 将 微 调 控 件 与 编 辑 控 件 组 合 成 一 对 伙 伴 关 系, 需 要 以 下 几 个 步 骤: 首 先, 要 将 微 调 控 件 与 编 辑 控 件 的Tab Order 值 设 置 为 连 续 值, 且 编 辑 控 件 的 在 前, 微 调 控 件 的 在 后, 即 如 果 编 辑 控 件 的Tab Order 值 是1, 则 微 调 控 件 的Tab Order 值 应 该 是2。 设 置Tab Order 值 可 以 从LayOut 菜 单 中 选 择Tab Order 菜 单 项, 然 后 用 鼠 标 先 后 单 击 编 辑 控 件 和 微 调 控 件, 即 可 使 两 者 的Tab Order 值 为 先 后 次 序。 其 次, 打 开 微 调 控 件 的 属 性(Proprities) 对 话 框, 选 择 Styles 标 签, 选 择Auto buddy 和Set buddy integer 选 项; 如 果 要 将 微 调 控 件 放 在 编 辑 控 件 的 右 边, 则 在Alignment 列 表 框 中 选 择"Right" 项。 最 后, 在 第 一 次 显 示 微 调 控 件 和 编 辑 控 件 的 初 始 化 函 数 中 应 设 置 微 调 按 钮 的 数 值 范 围, 否 则, 按 微 调 按 钮 的 向 上 箭 头 数 值 反 而 变 小, 按 向 下 箭 头 数 值 反 而 变 大。 假 设 定 义 微 调 控 件 的Control 成 员 对 象 名 为m_MySpin, 则 设 置 微 调 按 钮 的 数 值 范 围 的 语 句 为:m_MySpin.SetRange ( MinValue,MaxValue )。 ---- 3、 改 变 控 件 标 题 的 颜 色 ---- 对 话 框 中 的 控 件 在 运 行 时 可 以 根 据 一 定 的 条 件 动 态 改 变 其 标 题 颜 色。 当 对 话 框 中 的 控 件 的 标 题 需 要 重 新 着 色 时,Windows 向 该 控 件 的 父 窗 口 发 送 一 条WM_CTLCOLOR 消 息 以 获 得 该 控 件 的 颜 色,CWnd 对 象 通 过 重 置 虚 拟 方 法OnCtlColor 处 理WM_CTLCOLOR 消 息, 在 该 方 法 中 根 据 一 定 的 条 件 设 置 控 件 的 新 的 颜 色, 返 回 一 个HBRUSH, 就 可 以 用 它 来 重 新 绘 制 控 件。 ---- 例 如: 一 个 对 话 框 中 有10 个Static 控 件, 其 标 题 分 别 表 示10 个 信 号 的 名 称。 程 序 运 行 时, 这 些 名 称 用 黑 色( 默 认 值) 显 示, 当 某 种 条 件 发 生 时, 某 些 标 题 改 用 红 色 显 示, 表 示 信 号 发 生 异 常; 当 条 件 不 出 现 时, 名 称 又 恢 复 黑 色 显 示。 ---- 要 实 现 以 上 设 想, 首 先, 设 置10 个Static 控 件 的ID 号 为 顺 序 相 连, 并 取 其 符 号 名 为ID_Static1 至ID_Statis10 ; 其 次, 在 对 话 框 的OnPaint 函 数 中 加 入 显 示10 个Static 控 件 标 题 的 代 码; 最 后, 用ClassWizard 在 控 件 的 父 窗 口( 对 话 框) 中 加 入 CWnd::OnCtrlColor 方 法, 在OnCtrlColor 方 法 中 加 入 以 下 代 码( 黑 体 显 示, 其 余 为 程 序 自 动 生 成): HBRUSH CRgbsSwitch::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here int i ; for ( i = IDC_STATIC1 ; i <= IDC_STATIC10 ; i++ ) if (( pWnd->GetDlgCtrlID() == i ) && (满足某些条件 ) ) pDC- >SetTextColor( RGB( 255, 0, 0 )) ; // TODO: Return a different brush if the default is not desired return hbr; } ---- 这 样, 当 程 序 运 行 时, 根 据 某 些 条 件 的 成 立 与 否, 控 件 标 题 显 示 颜 色 相 应 改 变。 ---- 4、 多 个 控 件 使 用 同 一 消 息 处 理 函 数 ---- 假 如 在 一 个 对 话 框 中, 有 多 个 控 件, 对 它 们 的 某 个 操 作, 响 应 的 事 件 基 本 一 致, 如 果 为 每 一 个 控 件 编 写 一 个 消 息 处 理 函 数, 则 程 序 就 不 简 洁 了。VC++ 提 供 了 宏 指 令 ON_CONCTRL_RANGE, 可 允 许 多 个 控 件 使 用 同 一 消 息 处 理 函 数。 其 作 法 是: ---- ⑴ 在 该 类 的.cpp 程 序 的 消 息 映 射 块 中, 使 用 ON_CONCTRL_RANGE 宏 指 令 将 消 息 映 射 到 消 息 处 理 函 数 中( 黑 体 所 示): BEGIN_MESSAGE_MAP(CMyApp, CWinApp) //{{AFX_MSG_MAP(CMyApp) ... ON_CONCTRL_RANGE(NotifyCode,FirstControlID, LastControlID,ClassMethod) //}}AFX_MSG_MAP END_MESSAGE_MAP( ) ---- 此 处,NotifyCode 指 响 应 的 消 息;FirstControlID 和 LastControlID 分 别 是 控 件 的 起 始、 终 止ID 号( 必 须 是 连 续 的 );ClassMethod 是 响 应 的 消 息 函 数。 ---- ⑵ 然 后 在 该 类 的 头 文 件 的AFX_MSG 块 中 说 明 消 息 处 理 函 数( 黑 体 所 示): // Generated message-map functions protected: //{{AFX_MSG(CMyView) ... //}}AFX_MSG afx_msg void ClassMethod( UINT nID ); DECLARE_MESSAGE_MAP() ---- ⑶ 在 该 类 的.cpp 程 序 中 最 后 加 入 消 息 处 理 函 数 的 代 码。 ---- 注 意: 以 上 各 步 需 要 自 己 去 做, 因 为ClassWizard 不 支 持 这 些 自 定 义 消 息。 ---- 例 如: 在 一 对 话 框 中, 有10 个 按 钮, 用 鼠 标 左 键 单 击 按 钮 时, 弹 出 一 个 消 息 框, 显 示" 这 是 按 钮XX",XX 为1 至10 序 号。 所 以 这 里 每 个 按 钮 响 应 的 事 件 基 本 一 致, 仅 按 钮 序 号 不 同。 可 以 按 照 以 上 方 法 实 现: ---- ⑴ 将10 个 按 钮 的ID 号 置 为 连 续, 其 符 号 名 为IDC_BUTTON1 至IDC_BUTTON10 ; ---- ⑵ 在 该 类 的.cpp 程 序 中 先 加 入 消 息 宏 指 令:ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked); ---- BN_CLICKED 是 响 应 鼠 标 左 键 按 下 的 消 息。 ---- ⑶ 在 头 文 件 中 说 明 消 息 函 数 原 型: afx_msg void OnButtonClicked (UINT nID ); ---- ⑷ 在 该 类 的.cpp 程 序 中 加 入 消 息 处 理 函 数 代 码: void CMyDialog::OnButtonClicked( UINT nID ) { int nButton = nID - IDC_BUTTON1; ASSERT( nButton >= 0 && nButton <10 ); // add your message handler code here CString csTemp ; csTemp.Format("%s%d", " 这 是 按 钮:", nButton+1 ) ; MessageBox ( csTemp, " 提 示", MB_OK); }