Каскадное меню - это меню, при выборе которого выпадают дополнительные пункты меню.
Создаем новый проект с помощью MFC App Wizard с именем Test Cascade как SDI и сразу жмем Finish. Итак, мы хотим добавить к меню View каскадное меню. Для этого в меню View создадим пункт меню Test и привяжем к нему функцию обработки.
void CMainFrame::OnViewTest() { // TODO: Add your command handler code here }
Дальше нам надо получить указатель на пункт меню View в классе меню CMenu, как мы делали ранее.
void CMainFrame::OnViewTest() { CMenu* cm; CMenu* cmSub; cm=GetMenu(); ASSERT (cm != NULL); cmSub=cm->GetSubMenu(2); ASSERT (cmSub !=NULL); }
Теперь будем добавлять каскадное меню. Первое - это надо создать идентификаторы в ресурсах, так как пункты меню связаны с идентификаторами.
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by Test Cascade.rc // ...... #define ID_VIEW_TEST 32772 #define ID_POPUP1 32774 #define ID_POPUP2 32775 // Next default values for new objects ......
Теперь нам нужно объявить указатель в классе на класс CMenu:
class CMainFrame : public CFrameWnd { ...... // Implementation public: CMenu* cmNew; ......
Дальше по выбору пункта меню Test создать этот класс и добавить в него пункты меню. После чего созданный класс меню добавить к существующему меню.
void CMainFrame::OnViewTest() { CMenu* cm; CMenu* cmSub; cm=GetMenu(); ASSERT (cm != NULL); cmSub=cm->GetSubMenu(2); ASSERT (cmSub !=NULL); cmNew = new CMenu; cmNew->CreatePopupMenu(); cmNew->AppendMenu(MF_STRING,ID_POPUP1,"Popup1"); cmNew->AppendMenu(MF_STRING,ID_POPUP2,"Popup2"); cmSub->AppendMenu(MF_STRING | MF_POPUP,(UINT)cmNew->m_hMenu,"Popup"); }
Обратите внимание на последнюю строчку. Мы добавляем к нашему меню указатель на новое меню, но со стилем MF_POPUP. На рисунке ниже приведен результат работы программы при выборе меню Test.
Пункты меню неактивные, так как нет обработчика. Но нам надо побеспокоиться еще и о удалении из памяти динамической переменной cmMenu:
CMainFrame::CMainFrame() { // TODO: add member initialization code here cmNew=NULL; } CMainFrame::~CMainFrame() { if (cmNew!=NULL) delete cmNew; }