CMFCMenuBar和TestStack.White win.MenuBar为null

时间:2016-04-05 09:50:32

标签: mfc white

我正在尝试使用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 ....)

有没有其他人看过这个问题或找到了解决方法?

提前致谢

1 个答案:

答案 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),正如您在调用堆栈中看到的那样:

enter image description here

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