Как я могу отключить и серый пункт меню верхнего уровня, используя MFC - PullRequest
4 голосов
/ 02 декабря 2009

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

Я сделал это, установив Popup = False в свойствах диалогов и назначив идентификатор сообщения, но моя проблема не в том, чтобы правильно отключить элемент, если для элемента нет смысла нажимать кнопку (в зависимости от внутреннего состояния). сохраняется в диалоге)

Я уже узнал, как отключить любые элементы всплывающего родительского меню из http://www.microsoft.com/msj/0299/c/c0299.aspx,, но это не совсем то, что я хочу

Я также узнал, как добавить маршрутизацию команд меню в диалоги из статьи базы знаний msdn KB242577.

Это прекрасно работает для пунктов подменю, но не для меню верхнего уровня.

В настоящее время я использую следующую функцию для отключения

void CYourDlg::EnableMenuItem(UINT nCommand, BOOL bEnable)
{
   CMenu* pMenu = GetMenu();
   pMenu->EnableMenuItem(nCommand, bEnable ? 0 : MF_DISABLED | MF_GRAYED);
}

Эта половина работает, если вы покидаете alt-tab из приложения, она отображается как отключенная, в противном случае это не так.

Есть ли способ сделать область недействительной программно?

Я думаю, что может быть вовлечено сообщение, не относящееся к области клиента.

Ответы [ 2 ]

5 голосов
/ 03 декабря 2009

Я не пробовал, но в обычном окне (не в диалоге) CWnd :: DrawMenuBar должен делать то, что вы хотите. Он также может работать с диалоговыми приложениями.

void CYourDlg::EnableMenuItem(UINT nCommand, BOOL bEnable)
{
   CMenu* pMenu = GetMenu();
   pMenu->EnableMenuItem(nCommand, bEnable ? 0 : MF_DISABLED | MF_GRAYED);
   DrawMenuBar();
}
1 голос
/ 03 декабря 2009

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

...