Шаг 247 - Использование каскадных меню

Каскадное меню - это меню, при выборе которого выпадают дополнительные пункты меню.

247_1.gif (2999 b)

Создаем новый проект с помощью 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.

247_2.gif (2455 b)

Пункты меню неактивные, так как нет обработчика. Но нам надо побеспокоиться еще и о удалении из памяти динамической переменной cmMenu:

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	cmNew=NULL;
}

CMainFrame::~CMainFrame()
{
	if (cmNew!=NULL) delete cmNew;
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.