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

Стандартные диалоги

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >
Аннотация: В этой лекции мы научимся использовать информационные окна (класс AlertWindow), а также создавать заготовки диалоговых окон и отображать их с помощью класса-обёртки DialogWindow.

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

В приложениях с графическим интерфейсом часто приходится выполнять действия, связанные либо с показом пользователю какой-либо информации, либо с выбором последним каких-либо параметров (выбор файлов и папок, цветов палитры и т.п.), что реализуется с помощью диалоговых окон. В законченном приложении их желательно проектировать самому, обеспечивая единство стиля всех окон программы. Именно поэтому в Juce подавляющее большинство компонентов, реализующих стандартные диалоги, представлено не законченными окнами, а их заготовками. Комбинацией подобных заготовок создаются компоненты, которые показываются пользователю с помощью объекта специального класса — DialogWindow.

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

В данной главе на простых примерах мы рассмотрим как использование диалоговых окон, созданных с помощью AlertWindow, так и с помощью классов-заготовок.

Вызов диалоговых окон с сообщениями

Простейшим диалоговым окном является окно сообщения с закрывающей кнопкой (рисунок 17.1 ). Как уже упоминалось, оно создаётся вызовом метода static void JUCE_CALLTYPE AlertWindow::showMessageBox(AlertIconType iconType, const String& title, const String & message, const String& buttonText = String::empty, Component* associatedComponent = 0), где iconType — тип отображаемой пиктограммы, title — заголовок диалога, message — его сообщение, buttonText — надпись, отображаемая на закрывающей кнопке, а associatedComponentуказатель на компонент, с которым будет ассоциировано диалоговое окно. Если указатель равен нулю, то окно будет позиционировано в центре вызывающего компонента.

Вид пиктограммы, отображаемой на диалоге, задаётся перечислимым типом enum AlertWindow::AlertIconType, идентификатором которого являются:

  • NoIcon — диалог не содержит пиктограммы;
  • QuestionIcon — пиктограмма представлена знаком вопроса;
  • WarningIcon — пиктограмма представлена восклицательным знаком;
  • InfoIcon — пиктограмма представлена буквой "i".

Пример использования метода showMessageBox приведён в листинге 9.4.

Для отображения диалога с двумя кнопками (например, "да" и "нет", "принять", "отменить" и т.п.) используется метод static bool JUCE_CALLTYPE AlertWindow::showOkCancelBox(AlertIconType iconType, const String& title, const String& message, const String& button1Text = String::empty, const String& button2Text = String::empty, Component* associatedComponent = 0). Параметры метода аналогичны вышеописанным; button1Text и button2Text — как понятно, это надписи, отображаемые первой и второй кнопками, соответственно.

Метод возвращает истину в случае, если была нажата первая кнопка, и ложь — если вторая.

Рассмотрим использование этого метода на примере шуточной программы "Примета", знакомой многим из школьного курса информатики.

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

Программа "Примета"

Рис. 17.1. Программа "Примета"

Реализация компонента содержимого программы приведена в листинге 17.1 ; логика её работы определена обработчиком нажатия на кнопку buttonClicked.

#include "TCentralComponent.h"
//--------------------------------------------
#define tr(s) String::fromUTF8(s)
//--------------------------------------------
TCentralComponent::TCentralComponent() : Component("Central Component"),
            pInfoLabel(0),
            pQuestionButton(0)
{
  // Ярлык для вывода информационного сообщения
  pInfoLabel = new Label(L"Info Label", 
            tr("Нажмите на кнопку, чтобы начать..."));
  pInfoLabel->setFont(Font(15.0000f, Font::bold));
  pInfoLabel->setJustificationType(Justification::centred);
  pInfoLabel->setEditable(false, false, false);
  pInfoLabel->setColour(Label::textColourId, Colours::black);
  pInfoLabel->setColour(Label::backgroundColourId, Colours::azure);
  pInfoLabel->setColour(Label::outlineColourId, Colours::black);
  addAndMakeVisible(pInfoLabel);

  // Кнопка вызова диалогового окна
  pQuestionButton = new TextButton(L"Question Button");
  pQuestionButton->setButtonText(tr("Задать вопрос..."));
  pQuestionButton->addListener(this);
  addAndMakeVisible(pQuestionButton);

  setSize (400, 150);
}
//------------------------------------------
TCentralComponent::~TCentralComponent()
{
  // Удаляем дочерние виджеты
  // и обнуляем их указатели
  deleteAllChildren();
}
//------------------------------------------
void TCentralComponent::paint(Graphics& Canvas)
{
  Canvas.fillAll(Colours::azure);
}
//-----------------------------------------
void TCentralComponent::resized()
{
  pInfoLabel->setBounds(10, 10, getWidth() - 20, 25);
  pQuestionButton->setBounds(proportionOfWidth(0.5000f) - ((150) / 2),
          proportionOfHeight(0.5000f) - ((25) / 2), 
          150, 25);
}
//------------------------------------------
void TCentralComponent::buttonClicked(Button* pButton)
{
  if(pButton == pQuestionButton)
  {
    // Сообщение пользователю
    String sMessage = String::empty;
    
    // Задаём вопрос - вызываем диалоговое окно
    bool bAnswer = AlertWindow::showOkCancelBox(AlertWindow::QuestionIcon, 
            tr("Примета"), 
            tr("Верите ли Вы в приметы?"), 
            tr("Да"), 
            tr("Нет"), 0);
    
    // Если да... 
    if(bAnswer)
    {
      // формируем сообщение, которое будет выводиться красным цветом
      sMessage = tr("Верить в приметы - плохая примета!");
      pInfoLabel->setColour(Label::textColourId, Colours::red);
    }
    // Если нет...
    else
    {
      // формируем сообщение, которое будет выводиться синим цветом
      sMessage = tr("Поздравляю, Вы - очень разумный человек!");
      pInfoLabel->setColour(Label::textColourId, Colours::blue);
    }
    
    // Показываем сообщение
    pInfoLabel->setText(sMessage, false);
  }
}
//-----------------------------------------------------
Листинг 17.1. Реализация класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Внешний вид программы после нажатия на кнопку приведён на рисунке 17.2.

Программа "Примета" (показано диалоговое окно с двумя кнопками)

Рис. 17.2. Программа "Примета" (показано диалоговое окно с двумя кнопками)

Для отображения диалогового окна с тремя кнопками (например, "да", "нет", "отменить") используется метод static int JUCE_CALLTYPE AlertWindow::showYesNoCancelBox(AlertIconType iconType, const String& title, const String& message, const String& button1Text = String::empty, const String& button2Text = String::empty, const String& button3Text = String::empty, Component* associatedComponent = 0). Параметры button1Text, button2Text и button3Text — это надписи, отображаемые первой, второй и третьей кнопками, соответственно.

Метод возвращает следующие значения:

  • 0 — если была нажата третья кнопка (обычно используется как кнопка "Отменить");
  • 1— если была нажата первая кнопка (обычно используется как кнопка "Да");
  • 2 — если была нажата вторая кнопка (обычно используется как кнопка "Нет").

Например, следующий код

int iAnswer = AlertWindow::showYesNoCancelBox(AlertWindow::QuestionIcon, 
            tr("Выбор"),
            tr("Внести запись в базу данных?"), 
            tr("Да"), 
            tr("Нет"), 
            tr("Отменить"), 0);

покажет диалог с вышеперечисленными кнопками (рисунок 17.3 ).

Диалоговое окно с тремя кнопками

Рис. 17.3. Диалоговое окно с тремя кнопками
< Лекция 16 || Лекция 17: 1234 || Лекция 18 >