我正在尝试使用TestStack.White自动化MFC应用程序(用于UI测试)
当使用带有CMFCMenuBar(后来的Docking框架MFC)编写的MFC应用程序的TestStack.White时,我注意到由于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();
但我真正想做的是获取ChildMenus以便我可以检查窗口菜单中打开的窗口列表,但windowMenu.ChildMenus是空的
我很确定这是因为菜单实际上是工具栏/工具栏(可停靠)
有没有人知道如何从窗口菜单中获取菜单项(Tile,Cascale,Window1 ....)
有没有其他人看过这个问题或找到了解决方法?
提前致谢
保
答案 0 :(得分:0)
是的,MFC功能包菜单实际上是一个带按钮的工具栏。与旧式菜单相比,它使用不同的流程来实现。
在CFrameWndEx
派生类中,要获取菜单栏,您可以执行以下操作:
CMFCMenuBar *pMenuBar= m_Impl.GetMenuBar();
然后它取决于如何处理它。例如,如果要获取构成菜单栏的CMenu对象,则可以执行以下操作:
CMenu* pMenu= pMenuBar->GetMenu();
如果你想删除一些菜单,你可以这样做(注意相反的顺序):
pMenuBar->RemoveButton(4);
pMenuBar->RemoveButton(3);
您无法通过YourCFrameWndExDerivedClass::GetMenu()
以典型的方式获取菜单,因为这些新的MFC Feature Pack类在初始化主框架时有意执行SetMenu(NULL)
,正如您在调用堆栈中看到的那样:
我不是很确定,但我认为您也无法像旧式菜单中那样覆盖YourCFrameWndExDerivedClass::OnInitMenu()
。但您仍然可以使用YourCFrameWndExDerivedClass::OnInitMenuPopup()
覆盖。