CMFCMenuBar и TestStack.White win.MenuBar имеет значение null

Я пытаюсь использовать TestStack.White для автоматизации приложения MFC (для целей тестирования пользовательского интерфейса)

При использовании TestStack.White с приложением MFC, написанным с помощью CMFCMenuBar (более поздняя версия MFC Docking framework), я заметил, что код, подобный следующему, не работает из-за того, что 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....) из меню Window?

Кто-нибудь еще видел эту проблему или нашел обходной путь?

заранее спасибо

Павел


person MyDeveloperDay    schedule 05.04.2016    source источник


Ответы (1)


Да, меню пакета функций 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().

person sergiol    schedule 23.05.2016