CMFCMenuBar和TestStack.White win.MenuBar为空

CMFCMenuBar和TestStack.White win.MenuBar为空,mfc,white-framework,Mfc,White Framework,我正在尝试使用TestStack.White自动化MFC应用程序(用于UI测试) 当将TestStack.White与使用CMFCMenuBar(后来的停靠框架MFC)编写的MFC应用程序一起使用时,我注意到下面的代码由于window.MenuBar为null而失败 var menu = window.MenuBar.MenuItem("Window"); menu.Click(); 我知道我可以通过以下方法克服这个问题 TestStack.White.UIItems.MenuItems.Me

我正在尝试使用TestStack.White自动化MFC应用程序(用于UI测试)

当将TestStack.White与使用CMFCMenuBar(后来的停靠框架MFC)编写的MFC应用程序一起使用时,我注意到下面的代码由于window.MenuBar为null而失败

var menu = window.MenuBar.MenuItem("Window");
menu.Click();
我知道我可以通过以下方法克服这个问题

TestStack.White.UIItems.MenuItems.Menu windowMenu = win.Get<TestStack.White.UIItems.MenuItems.Menu(SearchCriteria.ByText("Window"));
windowMenu.Click();

TestStack.White.UIItems.MenuItems.Menu windowMenu=win.Get是的,MFC功能包菜单实际上是一个带有按钮的工具栏。与旧式菜单相比,它使用不同的过程来实现

CFrameWndEx
派生类中,要获取菜单栏,可以执行以下操作:

CMFCMenuBar *pMenuBar= m_Impl.GetMenuBar();
CMenu* pMenu= pMenuBar->GetMenu();
那就要看怎么处理了。例如,如果要获取构成菜单栏的CMenu对象,可以执行以下操作:

CMFCMenuBar *pMenuBar= m_Impl.GetMenuBar();
CMenu* pMenu= pMenuBar->GetMenu();
如果要删除某些菜单,可以执行以下操作(注意顺序相反):

通过
YourCFrameWndExDerivedClass::GetMenu()
无法以典型方式获取菜单,因为这些新的MFC功能包类在初始化主框架时故意执行
SetMenu(NULL)
,如调用堆栈中所示:


我不能完全确定,但我认为您也无法像在旧式菜单中那样覆盖YourCFrameWndExDerivedClass::OnInitMenu()
。但是您仍然可以使用
YourCFrameWndExDerivedClass::OnInitMenuPopup()
override

是的,MFC功能包菜单实际上是一个带有按钮的工具栏。与旧式菜单相比,它使用不同的过程来实现

CFrameWndEx
派生类中,要获取菜单栏,可以执行以下操作:

CMFCMenuBar *pMenuBar= m_Impl.GetMenuBar();
CMenu* pMenu= pMenuBar->GetMenu();
那就要看怎么处理了。例如,如果要获取构成菜单栏的CMenu对象,可以执行以下操作:

CMFCMenuBar *pMenuBar= m_Impl.GetMenuBar();
CMenu* pMenu= pMenuBar->GetMenu();
如果要删除某些菜单,可以执行以下操作(注意顺序相反):

通过
YourCFrameWndExDerivedClass::GetMenu()
无法以典型方式获取菜单,因为这些新的MFC功能包类在初始化主框架时故意执行
SetMenu(NULL)
,如调用堆栈中所示:

我不能完全确定,但我认为您也无法像在旧式菜单中那样覆盖YourCFrameWndExDerivedClass::OnInitMenu()。但是您仍然可以使用
YourCFrameWndExDerivedClass::OnInitMenuPopup()
override