利 用MFC 的 消 息 映 像 实 现 动 态 菜 单[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 showman 的 blog

---- 当 我 们 提 到 动 态 菜 单 的 实 现 时, 我 们 通 常 的 做 法 是 使 用getmenu() 函 数 获 取 一 个cmenu 类 指 针, 然 后 调 用cmenu 类 方 法appendmenu, insertmenu, modifymenu, removemenu 等。 本 文 介 绍 一 种 更 加 简 洁 的 方 法, 它 利 用mfc 的 消 息 映 像 机 制 及ccmdui 类 方 法 来 实 现。

---- 首 先, 我 们 简 要 说 说vc 中mfc 的 消 息 映 像。 每 个windows 程 序 员 大 概 都 对 以 前 使 用 的 窗 口 函 数windowproc 记 忆 犹 新, 当 我 们 面 对 各 种 消 息 时, 我 们 别 无 他 方, 只 能 使 用 庞 大 而 机 械 的switch-case 语 句 来 实 现 不 同 的 分 支 选 择。 在vc5.0 中 使 用v4.2 版 的mfc 基 本 类 库, 你 将 告 别switch-case 语 句, 代 之 以 透 明 的 消 息 映 像。 要 在 一 个 类 中 使 用 消 息 映 像, 在 类 声 明 中, 必 须 显 式 的 加 入 宏declare_message_map:

class cmyclass: public cbaseclass
    {
            declare_message_map()
    }

---- 在 类 实 现 中, 必 须 使 用 两 个 宏begin_message_map 和end_message_map,begin_message_map 带 两 个 参 数: 当 前 类 和 直 接 父 类:

---- begin_message_map(cmyclass, cbaseclass)
---- // 消 息 映 像 项

---- on_command(id_app_about, onappabout)

---- // 消 息 映 像 项
---- end_message_map()

---- 消 息 映 像 项 使 用 下 列 基 本 语 法:
---- on_messagename(id, classmethod)

---- messagename 是 需 要 处 理 的 消 息,id 是 发 送 消 息 的 标 识 符, 而classmethod 为 处 理 此 消 息 的 类 方 法 名。messagename 是mfc 预 定 义 的, 可 分 为 以 下 三 种:

---- 命 令 消 息
---- 子 窗 口 通 知 消 息
---- windows 消 息

---- 共 一 百 多 个, 用 户 不 必 记 住 它 们, 因 为 消 息 映 像 可 以 很 简 单 的 利 用classwizard 加 入。 处 理 一 个 消 息 的 类 方 法classmethod 必 须 在 类 定 义 中 声 明, 且 有 实 现 代 码。 其 原 型 为:

---- afx_msg return_type classmethod(paras table)

---- 类ccmdui 专 门( 且 仅 仅) 与on_update_command_ui 消 息 映 像 宏 配 套 使 用, 用 于 管 理 菜 单( 还 有 工 具 栏 按 扭 等) 的 实 时 状 态, 如 是 否 变 灰, 是 否 加 选 中 标 记 等。

---- on_update_command_ui 消 息 映 像 宏 原 型 为:

---- on_update_command_ui(menu_item_id, menu_proc)

---- on_update_command_ui 消 息 映 像 宏 将 一 个 菜 单 项( 命 令 项) 和 一 个 更 新 处 理 过 程 联 结, 从 而 在 适 当 的 时 机 自 动 调 用 此 更 新 处 理 过 程 来 完 成 对 菜 单 项 状 态 的 更 新。

---- menu_item_id 为 菜 单 项 的id 号,menu_proc 为 此 菜 单 项 的 更 新 处 理 函 数, 原 型 为:

---- afx_msg void menu_proc (ccmdui* pcmdui)

---- 它 带 有 一 个ccmdui 类 指 针, 使 用 它 可 调 用ccmdui 的 类 方 法。 与 菜 单 有 关 的 类 方 法 有:

enable(bool)                 使菜单项有效或无效
settext(lpctstr)                 设置菜单项的文本
setcheck(int)                    加上或去掉选中标记“x”
setradio(bool)               加上或去掉选中标记“.”

---- menuproc 被 调 用 的 时 机 有 以 下 几 种 情 况:

---- 用 鼠 标 选 中 包 含 该 菜 单 项 的 菜 单 条
---- 用 热 键 选 中 包 含 该 菜 单 项 的 菜 单 条

本文关键:.net, vc++,java,mfc
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top