
Я работал над подобной задачей в проекте, поэтому рад поделиться своим опытом с вами․ Чтобы обеспечить доступность команды ″Правка -> Копировать″ после выбора ″Правка -> Выделить″, вам понадобится изменить основное меню и добавить плавающее меню․Сначала давайте рассмотрим изменения, которые необходимо внести в основное меню․ Вам нужно установить флаг MF_BYPOSITION для пунктов меню ″Выделить″ и ″Копировать″, чтобы вы могли получать информацию о них с помощью GetMenuItemInfo․ Вы также должны установить флаг MF_ENABLED, чтобы обеспечить доступность команд после выбора ″Выделить″․
Вот как будет выглядеть код для изменения основного меню⁚
c
HMENU hMainMenu GetMenu(hWnd);
HMENU hEditMenu GetSubMenu(hMainMenu, 1); // Правка меню
// Сначала устанавливаем флаги для команды ″Выделить″
MENUITEMINFO menuItemInfo;
menuItemInfo․cbSize sizeof(MENUITEMINFO);
menuItemInfo․fMask MIIM_STATE | MIIM_ID;
GetMenuItemInfo(hEditMenu, 0, TRUE, nmenuItemInfo);
menuItemInfo․fState | MF_BYCOMMAND | MF_ENABLED;
SetMenuItemInfo(hEditMenu, 0, TRUE, nmenuItemInfo);
// Затем устанавливаем флаги для команды ″Копировать″
GetMenuItemInfo(hEditMenu, 1, TRUE, nmenuItemInfo);
menuItemInfo․fState | MF_BYCOMMAND | MF_ENABLED;
SetMenuItemInfo(hEditMenu, 1, TRUE, nmenuItemInfo);
Теперь приступим к созданию плавающего меню․ Вам нужно обработать сообщение WM_CREATE окна и вызвать функцию CreatePopupMenu, чтобы создать плавающее меню․ Затем вы должны добавить пункты меню ″Выделить″ и ″Копировать″ с помощью функции AppendMenu․ Не забудьте также установить флаги MF_ENABLED для доступности команд․c
// Обработка сообщения WM_CREATE окна
case WM_CREATE⁚
{
HMENU hPopupMenu CreatePopupMenu;
AppendMenu(hPopupMenu, MF_STRING | MF_ENABLED, ID_SELECT, ″Выделить″);
AppendMenu(hPopupMenu, MF_STRING | MF_ENABLED, ID_COPY, ″Копировать″);
// Привязываем плавающее меню к главному окну
SetMenu(hWnd, hPopupMenu);
break;
}
Теперь, чтобы обеспечить соответствие состояния команд в плавающем меню и основном меню, вам нужно обрабатывать сообщение WM_INITMENUPOPUP и вызывать GetMenuItemInfo․ Вы также должны установить состояние команд в плавающем меню с помощью функции SetMenuItemInfo․c
// Обработка сообщения WM_INITMENUPOPUP
case WM_INITMENUPOPUP⁚
{
HMENU hPopupMenu GetMenu(hWnd);
HMENU hEditMenu GetSubMenu(hPopupMenu, 0); // Плавающее меню
// Устанавливаем состояние команд в плавающем меню
MENUITEMINFO menuItemInfo;
menuItemInfo․cbSize sizeof(MENUITEMINFO);
menuItemInfo․fMask MIIM_STATE;
// Получаем информацию о команде ″Выделить″ из основного меню
GetMenuItemInfo(hEditMenu, ID_SELECT, FALSE, nmenuItemInfo);
// Устанавливаем состояние команды ″Выделить″ в плавающем меню
SetMenuItemInfo(hPopupMenu, ID_SELECT, FALSE, nmenuItemInfo);
// Получаем информацию о команде ″Копировать″ из основного меню
GetMenuItemInfo(hEditMenu, ID_COPY, FALSE, nmenuItemInfo);
// Устанавливаем состояние команды ″Копировать″ в плавающем меню
SetMenuItemInfo(hPopupMenuID_COPY, FALSE, nmenuItemInfo);
break;
}
Вот и все! Теперь после выбора ″Правка -> Выделить″ в основном меню, команда ″Правка -> Копировать″ станет доступной․ При щелчке правой кнопкой мыши в главном окне также будет отображаться плавающее меню с командами ″Выделить″ и ″Копировать″, и их состояние будет соответствовать состоянию команд в основном меню․
Я надеюсь, что эта статья была полезна для вас! Если у вас возникнут вопросы, не стесняйтесь задавать их․ Удачи в программировании!