Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 7:

Меню в приложениях MFC

Аннотация: Стили меню. Меню как ресурс. Добавление ресурса меню. Привязка ресурса меню к ресурсу главного окна. Привязка к меню функциональных возможностей. Создание диалога AboutBox. Создание макета диалогового окна About. Создание управляющего класса. Динамические меню. Создание контекстных меню. Построение областей чувствительности. Отладочный обработчик сообщения WM_CONTEXTMENU. Создание ресурсов-заготовок контекстных меню. Построение комбинированного обработчика. Командные клавиши - акселераторы.
Файлы к данной лабораторной работе, Вы можете скачать здесь.

Цель работы

  1. Создать меню для приложения
  2. Добавить меню в главное диалоговое окно приложения
  3. Вызывать функции приложения из меню
  4. Создать контекстное (всплывающее) меню
  5. Создать комбинированный обработчик (вручную)
  6. Задать акселераторы (ускоряющие, горячие клавиши) быстрого вызова опций меню

Проектировщики компьютерных программ изобрели графический интерфейс пользователя ( GUI - Graphical User Interface ), чтобы облегчить взаимодействие с компьютерными системами и приложениями. Важной частью этого интерфейса является меню.

Стили меню

  1. Раскрывающиеся (опускающиеся) меню. В таких меню все категории перечисляются в верхней строке окна приложения. При выборе одной из категорий выпадает список элементов (опций), которые можно выбрать, чтобы вызвать различные функции приложения
  2. Каскадные меню, которые открывают подменю справа. Опции меню, которые имеют подменю, принято помечать треугольником. Некоторые опции заканчиваются многоточием и при нажатии на них появляется диалоговое окно для более тонкой настройки запроса. Проектировщики меню не задали никакого предела на количество подменю, но если уровней каскадирования больше двух, такое меню считается неудобным в работе
  3. Контекстные (всплывающие) меню появляется под курсором при нажатии правой кнопкой мыши и свободно плавает в рабочей области приложения. Оно называется контекстным потому, что его содержание обычно зависит от выбранного объекта или области рабочего пространства, где находится курсор или указатель мыши

Хотя никаких стандартов разработки меню не существует, разработчиками приложений при проектировании меню накоплен богатый опыт, позволяющий облегчить работу будущего пользователя. Его необходимо придерживаться, чтобы не вынуждать потенциального пользователя нашего приложения срочно получать второе высшее только для того, чтобы правильно воспользоваться произведенным детищем.

Меню как ресурс

Различные составляющие приложений Windows, включая макет диалогового окна, меню, панели инструментов, изображения, текстовые строки, командные клавиши, управляющие элементы и т.д. рассматриваются как ресурсы. Проектировщик приложения на визуальном уровне указывает среде IDE содержимое текстов, размеры, идентификаторы ресурсов, типы ресурсов, а среда в это время заносит эти сведения в файл ресурсов на специальном языке - описания ресурсов. Ресурсы - это как видимые фишки в казино взамен пока еще невидимых денег. В приложениях ресурсы превращаются в объекты только после их компиляции.

Меню можно создавать заранее, как ресурс, с помощью редактора меню и такие меню называются статическими. Но чаще всего необходимо в приложении обеспечить управление составом меню в зависимости от состояния приложения. Некоторые пункты меню нужно скрыть, некоторые новые - показать, некоторые заблокировать или разблокировать. Такие действия позволяет выполнить MFC -класс CMenu. Более того, с помощью этого класса можно вообще программно создать меню с нуля, задав значения соответствующих свойств класса. Такая технология создания меню программно, без использования ресурсов, называется динамическим меню.

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

Создание заготовки приложения

  • Создайте новый проект MFC App C++ под названием Menu на основе диалога
    Таблица настройки мастера создания заготовки приложения
    Свойство проекта Значение
    Вкладка Application Type
    Application Type Dialog Based
    Resource language: Английский (США)
    Project style: MFC standard
    Use of MFC: Use MFC in a static library
    Вкладка User Interface Features
    Main frame styles: System menu
    Dialog title: Menu
    Вкладка Advanced Features
    Все сбросить!
  • После создания мастером формы удалите из диалога все элементы управления
  • Русифицируйте ресурс диалогового окна с идентификатором IDD_MENU_DIALOG
  • Измените заголовок диалогового окна, указав фамилию, номер и название лабораторной работы

Заменим иконку приложения на любую иную по выбору. Для этого сделайте следующее:

  • Найдите в панели Resource View узел Icon. В нем хранится ресурс с идентификатором IDR_MAINFRAME. Это стандартное имя для иконки приложения
  • Вызовите для узла Icon контекстное меню (или выделите его и через категорию Project главного меню) выполните команду Add Resource
  • В появившемся диалоговом окне выполните кнопку Import
  • Настройте фильтр на расширение *.ico, перейдите в каталог Icons с готовыми иконками и загрузите ресурс новой иконки
  • Закройте панель с графическим редактором иконок, удалите ресурс IDR_MAINFRAME, а сгенерированный идентификатор IDI_ICON1 новой иконки переименуйте в IDR_MAINFRAME
  • Полностью перестройте приложение ( Build/Rebuild Solution ) и убедитесь, что новая иконка появилась

Убедитесь, также, в том, что файл .ico оболочка скопировала в каталог res проекта.

  • Добавьте к приложению одну кнопку E&xit (Выход) с идентификатором ресурса IDC_EXIT и поместите в ее обработчик вместо традиционного OnOK() следующий код
    Обработчик кнопки завершения приложения
    void CMenuDlg::OnBnClickedExit()
    {
    	PostMessage(WM_QUIT); // Посылаем сообщение напрямую
    }

Добавление ресурса меню

После того, как базовая заготовка создана мастером, нужно добавить и настроить в нее меню.

  • Откройте панель Resource View, выделите верхний узел дерева ресурсов, идентичный имени проекта, в контекстном меню (или главном меню Project оболочки) выполните опцию Add Resource (Добавить ресурс)
  • В диалоговом окне Add Resource дважды щелкните по ресурсу Menu

В области редактирования оболочки запустится дизайнер ресурса меню. Первое место в меню подсвечено.


Меню готово для проектирования. При задании пунктов меню вводится текст, который увидят пользователи приложения. Никакие свойства пункта не будут доступны, пока не ввести название пункта в соответствующую позицию (панель Properties будет пустой). Элементы строки меню верхнего уровня (категории) не выполняют никаких функций, кроме как раскрываются, поэтому им не нужно присваивать идентификаторы ресурсов (это же справедливо и для сепараторов).

Пункты меню можно вводить сразу в подсвеченную синим маркером область или вначале активизировать поле редактирования пункта. Горизонтальные разделители ( сепараторы ) вставляются клавишей "минус". По пунктам меню дизайнера можно передвигаться стрелками. При выходе за пределы крайних пунктов автоматически создается пустой шаблон нового пункта, который в окончательном варианте не участвует. Ненужные пункты можно удалить клавишей Delete.

Дизайнер меню поддерживается и главным меню оболочки и своим контекстным меню. Откаты редактирования дизайнер поддерживает не все, поэтому если произвести некоторое ошибочное действие, то восстанавливать первоначальный вариант нужно вручную.

Дизайнер меню автоматически формирует идентификатор ресурса пункта меню по его названию. Идентификаторы должны состоять из знаков подчеркивания, цифр и букв латинского алфавита. Если пункты меню вводить сразу на русском, то идентификаторы дизайнер будет генерировать из цифр, далеких от мнемонического смысла закрепленной за пунктом задачи. Поэтому возможны два варианта:

  1. Сразу вчерне присвоить пунктам названия по-английски для автоматической генерации понятных по смыслу имен идентификаторов, а затем все переписать по-русски. Здесь следует учесть, что автоматическая генерация идентификатора пункта происходит только один раз при первом заполнении названия пункта. При всех последующих изменениях названия первоначально сгенерированное имя идентификатора автоматически уже не изменяется (ну и ладно, изменим вручную).
  2. Писать названия пунктов сразу по-русски, затем редактировать идентификаторы ресурсов этих пунктов. Редактировать идентификаторы и названия пунктов после их создания можно через панель Properties или прямо в дизайнере меню, включив или выключив режим Edit IDs (Редактировать идентификаторы).
  3. Разработайте ресурс меню приложения в соответствии с таблицей
    Схема ресурса меню
    ID Название ID Название
    Пусто &File Пусто &Help
    ID_FILE_HELLO &Hello ID_HELP_ABOUT &About
    Пусто ---------Separator---------
    ID_FILE_EXIT E&xit
  4. Исправьте идентификатор ресурса меню с IDR_MENU1 на IDR_MENU. Для этого выделите в панели Resource View ресурс IDR_MENU1 и в панели Properties внесите изменения
  5. Таким образом мы разработали ресурс меню, который дизайнер по визуальному представлению описал в файле ресурсов Menu.rc
  6. Запустите приложение и убедитесь, что данное меню в окне приложения не появилось. Компилятор не знает, что этот ресурс приложению необходим, мы его об этом никак не известили

Привязка ресурса меню к ресурсу главного окна

Чтобы меню появилось, этот ресурс нужно связать с каким-то диалоговым окном. Но поскольку обычно из всех диалоговых окон только для главного создают меню, то привяжем меню к главному окну (тем более, что у нас всего пока одно окно и есть, и то главное!).

  • В панели Resource View откройте дизайнер диалоговых окон для ресурса IDD_MENU_DIALOG
  • Выделите только саму форму (нам нужны только ее свойства) и в панели Properties в свойстве Menu установите идентификатор IDR_MENU только что созданного нами меню
  • Запустите приложение и убедитесь, что меню появилось, раскрывается, но ничего не делает
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .