龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用MFC的消息映像实现动态菜单(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
它带有一个CCmdUI 类指针,使用它可调用CCmdUI 的类方法。与菜单有关的类方法有: Enable(BOOL) 使菜单项有效或无效 SetText(LPCTSTR) 设置菜单项的文本 SetCheck(
  它带有一个CCmdUI 类指针,使用它可调用CCmdUI 的类方法。与菜单有关的类方法有:

  Enable(BOOL) 使菜单项有效或无效

  SetText(LPCTSTR) 设置菜单项的文本

  SetCheck(int) 加上或去掉选中标记“X”

  SetRadio(BOOL) 加上或去掉选中标记“.”

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

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

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

  用快捷键选中与该菜单项在同一菜单条下的任一菜单项

  我们以下面菜单结构为例:

Test menu
Item One ID_ITEM_ONE Ctrl+1
Item Two ID_ITEM_TWO Ctrl+2
Popup Popup One ID_POPUP_ONE Ctrl+3
Popup Two ID_POPUP_TWO Ctrl+4

  当用鼠标左键点按Test menu 菜单条或按Alt+t 或按Ctrl+1/2/3/4 时,四个菜单项的更新处理过程MenuProc 都将被调用。

  当我们考察上面这个具有嵌套结构的菜单时,我们面临这样一个问题:菜单项Item One/Item Two 的更新函数和Popup One/Popup Two 的更新函数形式上是否一致?当Popup One 和Popup Two 都变灰时Popup 是否自动变灰?

  根据MFC 的内部机制,仅仅弹出菜单的第一项应附加一些代码,其余项的形式基本是一致的。也就是说在上例中,除菜单项Popup One 外,其他菜单项更新函数的代码基本一致,即根据条件,简单调用CCmdUI 类方法即可。菜单项Popup One 由于是弹出式菜单Popup 的第一项,它的更新函数在以下两种情况下都会被调用:

  当弹出式菜单(Popup)的菜单项(Popup One 和Popup Two)要被绘出时

  当此弹出式菜单即Popup 本身要被绘出时

  第一种情况很好理解,正如我们选中Test menu 而Item One 和Item Two 的更新函数会自动执行一样。第二种情况其实也很自然,因为Popup 和Item One/Item Two 不一样,它没有ID 号,不能添加消息映像项,那么它的状态如何更新呢?于是它的第一项的更新函数被调用,为了区分是不同的调用,它将CCmdUI 的类成员变量m_pSubMenu 设置为不同的值。在第一种情况下,m_pSubMenu 等于NULL, 第二种情况下,m_pSubMenu 不等于NULL。

  以下我们给出一个实际的编程范例。由于篇幅关系,我们仅仅给出一些关键的语句,其余的则一并略去。

精彩图集

赞助商链接