Можно создать меню для окна и без использования методов LoadFrame или Create класса CFrameWnd. Для этого необходимо создать объект класса CMenu и вызвать для него несколько методов.
Объект класса CMenu не является меню, он только представляет существующее меню типа HMENU. Можно создать объект класса как локальный, а после использования удалить (на меню как таковое это не повлияет).
После объявления объекта класса CMenu можно загрузить меню из ресурсов приложения при помощи метода LoadMenu. Этот метод загружает меню, заданное именем или идентификатором ресурса, и связывает его с соответствующим объектом класса CMenu.
После того, как меню “загружено”, его можно подключить к окну, воспользовавшись методом SetMenu, входящим в класс CWnd. Если необходимо просто удалить текущее меню, используемое окном, то методу SetMenu следует передать значение NULL.
После установки меню методом SetMenu и до того, как соответствующий объект CMenu будет удален, необходимо вызвать метод Detach класса CMenu. Этот разорвет связь между меню и соответствующим объектом класса CMenu, после чего последний может быть удален.
Следует отметить, что если до установки нового меню окно уже имело меню, надо удалить его, воспользовавшись методом DestroyMenu класса CМenu.
Если с меню, подлежащим удалению, не связан объект класса CMenu, можно обратиться к методу Attach класса CMenu, который устанавливает связь между меню типа и объектом класса CMenu.
Для определения идентификатора меню типа известного окна можно воспользоваться методом GetMenu класса CWnd. Этот метод возвращает указатель на объект типа CMenu. Теперь для получения идентификатора меню можно обратиться к элементу данных m_hMenu, входящему в класс CMenu.
Рассмотрим фрагмент программы (в реализации класса CMyFrame, наследуемого от CFrameWnd), в котором происходит замена старого меню на новое:
void CMyFrame::OnChangeMenu() { // удаление старого меню // получаем указатель на текущее меню окна CMenu *pMenu=this->GetMenu(); // связываем меню HMENU с объектом menuCurrent CMenu menuCurrent.Attach(pMenu->m_hMenu); // удаляем меню и все связанные с ним ресурсы процесса menuCurrent.DestroyMenu();
// установление нового меню // загружаем меню IDR_MENU CMenu menuNew=LoadMenu(IDR_MENU); // устанавливаем загруженное меню this->SetMenu(&menuNew); // разрываем связь меню с объектом menuNew menuNew.Detach(); }
Класс CMenu помимо методов создания меню содержит и методы управления меню. Используя эти методы, можно добавлять к меню новые строки, изменять и удалять их. Специальные методы класса CMenu позволяют выделять некоторые строки меню и создавать элементы меню, содержащие не только текст, но и изображение.
При выборе пользователем пункта меню окну приходит соответствующее сообщение. Для его обработки следует предусмотреть специальные методы класса окна, при этом в таблицу сообщения класса окна необходимо добавить соответствующие макрокоманды типа ON_COMMAND.