获取一个处理程序函数到一个特定的弹出菜单

前言 本文展示了在打 开特定的弹出菜单时,如何轻松有效地调用handler函数。 这个问题 使用MFC时,你需要在打开弹出菜单时从框架中得到一个回调函数。框架确实发送了这种回调,您可以通过:

ON_WM_INITMENUPOPUP()

轻松获得它 导致:

OnInitMenuPopup()

但是请注意,这个处理程序是为当前窗口中的每个弹出菜单调用的。如果您想为所有菜单做一些通用的操作,这很好,但是如果您需要对一个特定的弹出菜单进行一些特殊处理呢?然后,您需要知道哪个弹出菜单项单击后打开了这个菜单。OnInitMenuPopup()回调不告诉你谁是打开的弹出菜单的“父菜单”;它只告诉你将要打开的弹出菜单是哪一个。那么我们要做什么呢? 解决方案 设计 嗯,我认为这个问题的最佳解决方案是“标记”弹出菜单项,然后,当回调被调用时,我们将搜索这个标记。如果我们找到它-我们已经找到我们的弹出菜单项。否则——哦,好吧。什么也不做。 实现 让我们创建一个handler函数,它将在打开弹出菜单时被调用。很快我们就会看到我们是如何做到这一点的;但首先,让我们先定义它。它可以是一个全局函数,也可以是某个类中的一个方法。我们必须考虑的唯一一件事是,调用者(例如,生成对处理程序CMainFrame的调用的人)必须知道(通过包含)这个类 无论你在哪里初始化你的GUI设置(或者我可以说,你的控制…例如:CMainFrame::OnCreate()),将“标记”添加到特定的弹出菜单中。在这个特定的例子中,我添加了一个新的弹出菜单项(在运行时)到一个临时的位置(这不是本文的重点…),并给它起了一个临时的名字,“尼康d70”(我的相机…)。然后,使用MENUINFO结构体标记这个菜单(我们标记弹出菜单本身,而不是打开它的菜单项!!)这个结构具有dwMenuData成员,我们可以使用它来实现此目的。这个成员是一个DWORD,所以您可以使用一个常量作为标记,或者分配一个字符串并将指针传递给它。这里我使用了简单的常数c_nCode(在我的代码的其他地方声明了).

CMenu* pPopupMenu = AddPopupMenu(this, 2, 4, "Nikon D70s");
MENUINFO MenuInfo;
MenuInfo.cbSize = sizeof(MENUINFO);
MenuInfo.fMask = MIM_MENUDATA;
MenuInfo.dwMenuData = c_nCode;
//mark the popup menu:
pPopupMenu->SetMenuInfo( &MenuInfo );

注意,“尼康d70”是项目,点击它打开弹出菜单。我们标记弹出菜单,而不是项目,因为在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);
   }
}

就是这样! 注意,我们可以用不同的“代码”(或字符串)标记不同的弹出菜单,然后,在CMainFrame::OnInitMenuPopup中,我们将不得不检查这个并委托给不同的处理程序。 最后一句,MENUINFO 在我们结束之前,还有最后一件事:您可能会遇到一个很好的障碍,当编译器向您大喊错误:

error C2065: 'MENUINFO' : undeclared identifier

时 嗯,问题不在于“包含”,因为包含windows.h就足够了,而且您可能已经在stdafx.h中这样做了。那么问题是什么呢?嗯,MFC版本是这次的问题。把:

#define WINVER 0x500

在stdafx.h文件的顶部。这将解决这个问题。 本文转载于:http://www.diyabc.com/frontweb/news370.html

原文地址:https://www.cnblogs.com/Dincat/p/13443896.html