Можно ли отключить пункт меню в строке меню и / или динамически отобразить его? - PullRequest
2 голосов
/ 21 марта 2020

Вот новое Вид меню, которое я добавил в свое программное обеспечение:

View Menu

Мой редактор (a CDialog) имеет два режима. Это Вид меню является приложением только к одному из режимов.

В данный момент я просто отключаю пункты меню следующим образом:

CMenu* pMenu = GetMenu();
if (pMenu != nullptr)
{
    pMenu->EnableMenuItem(ID_VIEW_REFRESH, MF_BYCOMMAND | MF_GRAYED);
    CMenu* pViewMenu = pMenu->GetSubMenu(3);
    if (pViewMenu != nullptr)
        pViewMenu->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED);
}

Это прекрасно работает. Но есть ли способ:

  • Отключить актуальный пункт меню Просмотр в строке меню?
  • При необходимости удалить / добавить меню?

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

POPUP "View"
BEGIN
    MENUITEM "Refresh\tF5",                 ID_VIEW_REFRESH, INACTIVE
    POPUP "Zoom", GRAYED
    BEGIN
        MENUITEM "Zoom In\tCTRL +",             ID_ZOOMLEVEL_ZOOMIN
        MENUITEM "Zoom Out\tCTRL -",            ID_ZOOMLEVEL_ZOOMOUT
        MENUITEM SEPARATOR
        MENUITEM "400%",                        ID_ZOOMLEVEL_400
        MENUITEM "300%",                        ID_ZOOMLEVEL_300
        MENUITEM "250%",                        ID_ZOOMLEVEL_250
        MENUITEM "200%",                        ID_ZOOMLEVEL_200
        MENUITEM "175%",                        ID_ZOOMLEVEL_175
        MENUITEM "150%",                        ID_ZOOMLEVEL_150
        MENUITEM "125%",                        ID_ZOOMLEVEL_125
        MENUITEM "100%\tCTRL + 0",              ID_ZOOMLEVEL_100
        MENUITEM "75%",                         ID_ZOOMLEVEL_75
        MENUITEM "50%",                         ID_ZOOMLEVEL_50
        MENUITEM SEPARATOR
        MENUITEM "Custom...",                   ID_ZOOM_CUSTOM
    END
END

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Предположим, ваше меню называется IDR_MAINFRAME:

enter image description here

Создайте mainFrame и добавьте IDR_MAINFRAME меню:

CMainFrame* pFrame = new CMainFrame;  
pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL);

Вы должны получить главное меню следующим образом:

CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);

Теперь вы можете выбрать определенный элемент c:

menu.EnableMenuItem (1,  MF_BYPOSITION|MF_DISABLED|MF_GRAYED); 
pFrame->SetMenu(&menu);  

См. Результат ниже:

enter image description here

Обратите внимание, что Edition - это главное меню (аналогично меню View) для моего приложения.
Включение вашего меню (View menu ) динамически вызывайте EnableMenuItem второй раз, например:

menu.EnableMenuItem (1,  MF_BYPOSITION);   

Надеюсь, это поможет вам.

Обновление

Мне также пришлось использовать этот код, чтобы получить строку меню обновить визуально:

DrawMenuBar();

С этим кодом меню визуально не обновлялось до тех пор, пока на текст меню не была наведена мышь.

1 голос
/ 21 марта 2020

Конечно, чтобы отключить элемент, извлеките дескриптор меню, используя GetMenu, затем используйте API EnableMenuItem и укажите MF_BYPOSITION вместо MF_BYCOMMAND.

Или вы можете использовать ресурс MENUEX и назначить идентификатор для элементов всплывающего меню ( к сожалению, редактор ресурсов не может сохранять ресурсы MENUEX, он может их читать, но всегда сохраняет как MENU). Если вы хотите изменить на MENUEX, поместите его в файл .rc2 проекта MF C.

...