Россия |
Стандартные диалоги
Цель лекции: Научиться создавать и использовать диалоговые окна различного назначения
В приложениях с графическим интерфейсом часто приходится выполнять действия, связанные либо с показом пользователю какой-либо информации, либо с выбором последним каких-либо параметров (выбор файлов и папок, цветов палитры и т.п.), что реализуется с помощью диалоговых окон. В законченном приложении их желательно проектировать самому, обеспечивая единство стиля всех окон программы. Именно поэтому в 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 ; логика её работы определена обработчиком нажатия на кнопку 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.
Для отображения диалогового окна с тремя кнопками (например, "да", "нет", "отменить") используется метод 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 ).