Theo Buys Ответов: 1

Как получить доступ к обработчикам cmainframe onupdate из модального диалогового окна?


Чтобы использовать мою программу с сенсорным экраном планшета, я создал альтернативу меню. В модальное диалоговое окно у меня есть член CMenu, который загружает главное меню из ресурса.
В диалоговом окне я могу заполнить кнопки пунктами меню, используя элементы класса CMenu. Это работает, но мне нравится обращаться к обработчикам обновлений в CMainframe, чтобы установить статус пункта меню из CCmdUI, как это:

void CMainFrame::OnUpdateViewInstant(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable();
	pCmdUI->SetCheck(m_wndInstantBar.IsVisible());
}


Я не хочу копировать их как членов диалога, чтобы избежать кошмара обслуживания.

Возможна ли такая маршрутизация?


Что я уже пробовал:

CCmdUI CmdUI;
...
CmdUI.DoUpdate(AfxGetMainWnd (), FALSE);

Jochen Arndt

Это не сработает, потому что обработчики обновлений вызываются только для фреймовых окон, а не для других типов окон, таких как диалоги.

Аналогичное поведение можно реализовать и для диалогов. Видеть
https://support.microsoft.com/en-us/help/242577/you-cannot-change-the-state-of-a-menu-item-from-its-command-user-interface-handler-if-the-menu-is-attached-to-a-dialog-box-in-visual-c
Но это все равно требует реализации обработчиков дважды.

1 Ответов

Рейтинг:
2

KarstenK

Вы можете использовать API PostThreadMessage. Вы находите в этом какое-то объяснение статья.

В сообщении вы должны указать необходимые данные в качестве параметра или иметь некоторые общие данные (глобальную модель), чтобы иметь фактические данные.

Рассмотрите возможность использования немодального диалогового окна если это правильное решение для вас. Обычно диалог означает, что фокус приложения и пользователя находится в диалоговых окнах, а все внешнее не используется.