Визуальное программирование и MFC

       

Меню без явного создания объекта класса CMenu


Для управления меню, как и для других элементов пользовательского интерфейса, в состав библиотеки MFC включен специальный класс - класс CMenu. Класс CMenu является достаточно “незаметным” классом библиотеки MFC. Приложение может активно работать с меню, но все же в его исходных текстах можно не найти ни одного объекта этого класса.

В приложениях, созданных с помощью MFC AppWizard, меню создается автоматически вместе с панелью управления и панелью состояния. Для этого достаточно указать при создании шаблона документа общий идентификатор этих ресурсов, например:

CMultiDocTemplate* pDocTemplate; // указатель на шаблон pDocTemplate = new CMultiDocTemplate // создание шаблона (IDR_MULTITYPE, RUNTIME_CLASS(CMultiDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CMultiView)); AddDocTemplate(pDocTemplate); // добавить шаблон в список

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

CMainFrame* pMainFrame = new CMainFrame; // создание главного окна if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) // загрузка ресурсов return FALSE; m_pMainWnd = pMainFrame; // соединение главного окна и объекта приложения

В приложениях MFC AppWizard, имеющих однооконный или многооконный интерфейс, меню создается и изменяется самой библиотекой MFC. Несмотря на это, программист может сам управлять меню. Самым простым способом является обработка команд обновления от меню (см. ниже описание класса CCmdUI).

Если приложение создано без использования средств AppWizard, то даже в этом случае процедура создания меню остается очень простой и также может не задействовать объекты класса CMenu напрямую.

В таких приложениях обычно формируется главное окно на основе класса CFrameWnd. Для этого сначала создается объект класса CFrameWnd, а затем вызывается либо метод Create, либо метод LoadFrame, который в свою очередь уже строит само окно вместе с меню.

Метод Create




Это метод создает и инициализирует окно, связанное с объектом CFrameWnd:

BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL );

Обязательно нужно указать только два первых параметра метода Create - имя класса окна (если использовать NULL, то по умолчанию будет использоваться класс, определенный для окон CFrameWnd )и имя окна (его заголовок).

Через параметр lpszMenuName можно задать имя ресурса меню, которое будет создано для данного окна. Например, вот как можно создать окно c меню, шаблон которого определен в ресурсах и имеет идентификатор IDR_MENU (создание окна производится в конструкторе класса окон CMyFrame, наследуемого от CFrameWnd):

CMyFrame::CMyFrame() { Create(NULL, "Окно с меню ",WS_OVERLAPPEDWINDOW, rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU)); }



Метод LoadFrame



Виртуальный метод LoadFrame позволяет динамически создавать меню, пользуясь информацией из файла ресурсов:

virtual BOOL LoadFrame( UINT nIDResource, DWORD dwDefaultStyle= WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CWnd* pParentWnd = NULL, CCreateContext* pContext=NULL);

Параметры этого метода почти идентичны параметрам метода Create, описанного ранее. Исключение составляет параметр nIDResource. Он представляет собой идентификатор, общий для нескольких ресурсов, употребляемых при создании окна (меню, строковый ресурс заголовка окна, пиктограмма и таблица клавиш акселерации):

CMyFrame::CMyFrame() { LoadFrame(IDR_MENU); }


Содержание раздела