本文展示了在打 开特定的弹出菜单时,如何轻松有效地调用handler函数。 这个问题 使用MFC时,你需要在打开弹出菜单时从框架中得到一个回调函数,您可以通过 ON_WM_INITMENUPOPUP() 轻松获得到 OnInitMenuPopup()
但是请注意,这个处理程序是为当前窗口中的每个弹出菜单调用的。如果您想为所有菜单做一些通用的操作,这很好。但是如果你需要对一个特定的弹出菜单进行一些特殊处理呢? 你就需要知道哪个弹出菜单才是你要找的。那么我们要做什么呢? 最简单的解决方案是“标记”弹出菜单,然后当回调被调用时,我们将搜索这个标记。如果能匹配上,则就是要找的菜单,否则什么也不做。
CMenu* pPopupMenu = AddPopupMenu(this, 2, 4, "Nikon D70s"); MENUINFO MenuInfo; MenuInfo.cbSize = sizeof(MENUINFO); MenuInfo.fMask = MIM_MENUDATA; //允许获取/设置dwMenuData成员. MenuInfo.dwMenuData = c_nCode; //做个标识 //mark the popup menu: pPopupMenu->SetMenuInfo( &MenuInfo );
现在,我们需要实现OnInitMenuPopup()回调。这个回调函数在每次打开弹出菜单时(严格来讲是打弹出前)被调用。在OnInitMenuPopup()中,我们得到的是指向菜单的指针,而不是指向菜单项目的指针。 所以现在就可以检查这个弹出菜单是不是我们在初始化时标记的那个菜单了。
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { MENUINFO MenuInfo; MenuInfo.cbSize = sizeof(MENUINFO); MenuInfo.fMask = MIM_MENUDATA; MenuInfo.dwMenuData = 0; VERIFY( pPopupMenu->GetMenuInfo( &MenuInfo ) ); if(MenuInfo.dwMenuData == c_nCode) //比较标识 { //call the handler!!! OnMarkedPopupMenu(pPopupMenu); } }