Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 461 / 9 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 15:

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

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >

Поскольку контекстное меню вызывается нажатием правой кнопки мыши, а метод mouseDown вызывается, когда пользователь нажимает любую кнопку, мы предусмотрели соответствующее условие выполнения: мы вызываем публичное свойство класса MouseEvent const ModifierKeys MouseEvent::mods, которое представляет собой ключевой модификатор, ассоциированный с этим событием. Метод bool ModifierKeys::isPopupMenu() const throw() класса ModifierKeys позволяет узнать, было ли это событие связано с вызовом пользователем контекстного меню. Для подобной проверки рекомендуется вызывать именно этот метод, а не bool ModifierKeys::isRightButtonDown() const throw(), информирующий о нажатии правой кнопки мыши, исходя из соображений совместимости с Mac OS X, где контекстное меню вызывается как нажатием на клавишу <CTRL>, так и правой кнопкой мыши.

После этого создаётся контекстное меню, в которое добавляются пункты уже знакомым по меню верхнего уровня способом.

Показ контекстного меню осуществляет уже упоминавшаяся выше функция int PopupMenu::show(int itemIdThatMustBeVisible = 0, int minimumWidth = 0, int maximumNumColumns = 0, int standardItemHeight = 0, ModalComponentManager::Callback * callback = 0). Она принимает следующие параметры:

  • int itemIdThatMustBeVisible — идентификатор пункта меню, который должен отображаться в нём при первом запуске (быть обязательно видимым). Если меню содержит слишком много пунктов, то оно будет прокручено до этого пункта;
  • int minimumWidth — минимальная ширина меню в пикселях;
  • int maximumNumColumns — число столбцов для упорядочения пунктов меню, если они не помещаются в одном вертикальном. Если параметр принимает значение 0, то будет установлено число столбцов по умолчанию (обычно около 7);
  • int standardItemHeight — если значение параметра не равно нулю, оно используется для задания стандартной высоты элементов меню;
  • ModalComponentManager::Callback * callback — если значение параметра не равно нулю, меню будет запущено асинхронно.

В нашем примере мы оставили все параметры принятыми по умолчанию.

В дальнейшем в зависимости от идентификатора команды мы вызываем тот или иной её обработчик ( пример 15.5).

Внешний вид программы с вызванным контекстным меню представлен на рисунке 15.2 .

Работа программы с вызванным контекстным меню

Рис. 15.2. Работа программы с вызванным контекстным меню

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

Работа программы, демонстрирующей совместное использование компонентов меню и  ApplicationCommandManager

Рис. 15.3. Работа программы, демонстрирующей совместное использование компонентов меню и ApplicationCommandManager

В качестве основы для нового примера возьмём ранее написанный проект программы, иллюстрирующей использование меню.

Объект класса ApplicationCommandManager хранит список команд, которые может выполнять программа, и вызывает их по мере необходимости. С помощью ApplicationCommandManager можно организовать совместное реагирование на общие команды меню, кнопок панели инструментов и других компонентов управления, подобно действиям (класс QAction) библиотеки Qt.

Объявим объект класса ApplicationCommandManager в качестве открытого члена класса главного окна нашей программы TMainForm ( пример 15.6

#ifndef _TMainForm_h_
#define _TMainForm_h_
//--------------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//--------------------------------------------------
class TCentralComponent;
//--------------------------------------------------
class TMainForm : public DocumentWindow
{
public:
  TMainForm();
  ~TMainForm();

  void closeButtonPressed();
  
  // Менеджер команд приложения
  ApplicationCommandManager CommandManager;
  
private:
  // Компонент содержимого
  TCentralComponent* pCentralComponent;
};
//----------------------------------------
#endif
Листинг 15.6. Объявление класса главного окна приложения TMainForm (файл TMainForm.h)

Приёмником для команд, посылаемых ApplicationCommandManager, является ApplicationCommandTarget. Именно от этого класса целесообразно унаследовать компонент содержимого. Для того, чтобы установить соединение между менеджером команд и их приёмником, следует вызвать метод void ApplicationCommandManager::registerAllCommandsForTarget(ApplicationCommandTarget* target) ( пример 15.7).

#include "TMainForm.h"
//-------------------------------------------------
#include "TCentralComponent.h"
//-------------------------------------------------
TMainForm::TMainForm() : DocumentWindow(
    JUCEApplication::getInstance()->getApplicationName(),
    Colours::azure,
    DocumentWindow::allButtons)
{
  centreWithSize(700, 400);
  setResizable(true, false);
  setVisible(true);

  // Динамически создаём экземпляр класса нашего компонента
  pCentralComponent = new TCentralComponent(this);
  // Устанавливаем его в качестве компонента содержимого
  setContentOwned(pCentralComponent, true);
  
  // Регистрируем все созданные команды компонента содержимого
  CommandManager.registerAllCommandsForTarget(pCentralComponent);
  // Регистрируем все текущие команды приложения
  CommandManager.registerAllCommandsForTarget(JUCEApplication::getInstance());

  setMenuBar(pCentralComponent);
}
//-------------------------------------------------
TMainForm::~TMainForm()
{
    setMenuBar(NULL);
}
//-------------------------------------------------
void TMainForm::closeButtonPressed()
{
    JUCEApplication::getInstance()->systemRequestedQuit();
}
//-------------------------------------------------
Листинг 15.7. Реализация класса главного окна приложения TMainForm (файл TMainForm.cpp)
< Лекция 14 || Лекция 15: 12345 || Лекция 16 >