2017-01-04 9 views
2

Я пытаюсь отключить пункты главного меню. в приложении MDI, это работает:В SDI: где отключить меню, код ok в MDI

CWnd *pW=AfxGetMainWnd(); 
CMenu * pMenu=pW->GetMenu(); 
pMenu->EnableMenuItem(5, MF_BYPOSITION | MF_GRAYED | MF_DISABLED); 

Не в SDI. Скорее всего, я помещаю его в неправильное место. CMainFrame? Вид? Какая специальная подпрограмма? Я попробовал конструкторы, но никаких изменений в пользовательском интерфейсе.

Любая помощь приветствуется, я ударяю головой и искал многочисленные веб-сайты (и здесь), но не нашел правильного направления.

большое спасибо

ответ

1

Вы не хотите, чтобы непосредственно включить/отключить пункты меню при MFC, будь то SDI или MDI.

Вместо этого, когда вы добавляете элемент в меню, вы добавляете для него два обработчика событий. Один будет для «КОМАНДЫ», другой для «UPDATE_COMMAND_UI».

enter image description here

COMMAND обработчик фактически выполняет команду для этого пункта меню.

Обработчик UPDATE_COMMAND_UI (косвенно) включает/отключает запись в меню, возвращая true/false, чтобы указать, должно ли оно быть включено.

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

0

вы можете сделать это с помощью мастера класса, чтобы добавить функцию, которая обрабатывает Включение/отключение пунктов меню с помощью UPDATE_COMMAND_UI:

void CMyAdoMfcView::OnUpdateAddnew(CCmdUI* pCmdUI) 
{ 
    // TODO: Add your command update UI handler code here 
    pCmdUI->Enable(true); 
} 

в моем коде я включил пункт меню AddNew.

+0

Я думаю, что оба ответа относятся к тому, когда я хочу отключить субтитры. Если я хочу отключить файлы-> Создать, я использую UPDATE_COMMAND_UI. Но я хочу отключить полный пункт меню файлов. Кажется, я получил свое решение из книги Паэтцольда. Только проблема: если я делаю это не в том месте, меню может быть повторно подключено позже – opto