Опубликован: 13.07.2012 | Уровень: специалист | Доступ: платный
Лекция 15:

Элементы управления. Компоненты меню

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Аннотация: В этой лекции вы познакомитесь с классами, необходимыми для создания главного и контекстного меню приложения.

Цель лекции: Научиться создавать и использовать главное и контекстное меню в своих программах

Непременным атрибутом современного профессионально выглядящего приложения является меню. Оно представляет собой ограниченную область с набором пунктов, выбирая которые, пользователь вызывает определённые команды приложения. Каждой команде присваивается уникальный идентификационный номер, по которому к ней можно обращаться однозначно.

Основными типами меню являются:

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

Меню верхнего уровня является результатом совместной работы нескольких классов компонентов: MenuBarComponent, который создаёт полосу под заголовком окна и отвечает за отображение команд, которые (вместе с их обработчиками) создаёт MenuBarModel, а также PopupMenu, объекты которого образуют выпадающие меню и подменю.

Класс PopupMenu создаёт также и контекстное меню.

Конструктор MenuBarComponent в качестве параметра принимает указатель на объект MenuBarModel: MenuBarComponent::MenuBarComponent(MenuBarModel* model). В случае, если мы создаём меню главного окна приложения (а на практике именно так и происходит), то удобнее воспользоваться методом класса DocumentWindow void DocumentWindow::setMenuBar(MenuBarModel* menuBarModel, int menuBarHeight = 0), который также принимает в качестве параметра указатель на объект MenuBarModel, который и формирует внешний вид меню. Второй принимаемый параметр — это ширина меню; в случае, если он принимает значение 0, то ширина полосы меню будет установлена по умолчанию.

Если функция setMenuBar принимает нулевое значение, любое существующее меню будет удалено из главного окна и тогда мы можем добавить объект MenuBarComponent с помощью метода void DocumentWindow::setMenuBarComponent(Component* newMenuBarComponent). Получить текущее меню можно с помощью функции-члена класса DocumentWindow Component* DocumentWindow::getMenuBarComponent() const.

Рассмотрим создание меню верхнего уровня и контекстного меню на примере простого приложения ( рис. 15.1).

Для начала создадим основу нашего меню — её модель. Пусть наши меню, как верхнего уровня, так и контекстное, включают три команды: "Новый", "Открыть" и "Выход". При этом реально работать (осуществлять выход из программы) будет только последняя; при щелчке по первым двум будет выводиться информационное сообщение.

Приложение, демонстрирующее работу меню.

Рис. 15.1. Приложение, демонстрирующее работу меню.

В качестве модели меню будет выступать класс компонента содержимого, который мы унаследуем от класса MenuBarModel ( пример 15.1).

#ifndef _TCentralComponent_h_
#define _TCentralComponent_h_
//------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//------------------------------------------
// Класс компонента содержимого.
// Наследует класс модели меню
class TCentralComponent  : public Component,
        public MenuBarModel
{
public:
  TCentralComponent();
  ~TCentralComponent();

  // Идентификаторы команд меню
  enum TMenuOptions
  {
    FileNew = 1,
    FileOpen = 2,
    FileQuit = 3
  };

  void paint(Graphics&);
  void resized();
  // Функции, наследуемые от MenuBarModel
  const StringArray getMenuBarNames();
  void menuItemSelected(int, int);
  const PopupMenu getMenuForIndex(int, const String&);
  
  // Вызывает контекстное меню
  void mouseDown(const MouseEvent&);

private:
  // Ярлык для вывода сообщений
  Label* pMessagesLabel;

  // Изображения - пиктограммы меню
  Image ImageNew_png;
  Image ImageOpen_png;
  Image ImageExit_png;

  // Предотвращает создание копии конструктора и оператора =
  TCentralComponent(const TCentralComponent&);
  const TCentralComponent& operator= (const TCentralComponent&);
};
//---------------------------------------------
#endif
Листинг 15.1. Объявление класса компонента содержимого TCentralComponent (файл TCentralComponent.h)

Класс MenuBarModel включает три чистые виртуальные функции (см. пример 15.1), которые должны быть переопределены в классе компонента содержимого.

Метод virtual const StringArray MenuBarModel::getMenuBarNames() возвращает список основных пунктов меню, отображаемых на её полосе. В наше программе это только один — пункт "Файл" (рисунок 15.1 , пример 15.2).

const StringArray TCentralComponent::getMenuBarNames()
{
    // Создаются основные пункты меню
    StringArray sMenuNames;
    sMenuNames.add(tr("Файл"));
    return sMenuNames;
}
Листинг 15.2. Реализация метода getMenuBarNames класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия