当我们考察上面这个具有嵌套结构的菜单时,我们面临这样一个问题:菜单项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。
以下我们给出一个实际的编程范例。由于篇幅关系,我们仅仅给出一些关键的语句,其余的则一并略去。
在头文件的类声明中:
BOOL m_bItemOne, m_bItemTwo, m_bPopupOne, m_bPopupTwo; //用于决定各个菜单项的状态 protected: afx_msg void OnUpdateMenuitemOne(CCmdUI* pCmdUI); afx_msg void OnUpdateMenuitemTwo(CCmdUI* pCmdUI); afx_msg void OnUpdatePopupOne(CCmdUI* pCmdUI); afx_msg void OnUpdatePopupTwo(CCmdUI* pCmdUI); //各菜单项的更新函数 DECLARE_MESSAGE_MAP() |
在源文件中:
BEGIN_MESSAGE_MAP(CMyDoc, CDocument) ON_UPDATE_COMMAND_UI (ID_ITEM_ONE, OnUpdateMenuitemOne) ON_UPDATE_COMMAND_UI (ID_ITEM_TWO, OnUpdateMenuitemTwo) ON_UPDATE_COMMAND_UI (ID_POPUP_ONE, OnUpdatePopupOne) ON_UPDATE_COMMAND_UI (ID_ POPUP_TWO, OnUpdatePopupTwo) END_MESSAGE_MAP()
void CMyApp::OnUpdatetMenuitemOne (CCmdUI* pCmdUI) { pCmdUI->Enable(m_bItemOne); if(m_bItemOne) pCmdUI->SetText("Item One"); else pCmdUI->SetText("Item One is now disabled"); }
void CMyApp::OnUpdatetMenuitemTwo (CCmdUI* pCmdUI) { pCmdUI->Enable(m_bItemTwo); if(m_bItemTwo) pCmdUI->SetText("Item Two"); else pCmdUI->SetText("Item Two is now disabled"); }
void CMyApp::OnUpdatePopupOne(CCmdUI* pCmdUI) { if (pCmdUI->m_pSubMenu != NULL) { BOOL b_Popup = m_bPopupOne || m_bPopupTwo; pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex, MF_BYPOSITION | (bEnable ? MF_ENABLED : (MF_DISABLED | MF_GRAYED))); return; } pCmdUI->Enable(m_bPopupOne); }
void CMyApp::OnUpdatePopupTwo(CCmdUI* pCmdUI) { pCmdUI->Enable(m_bPopupTwo); } |
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |