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

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

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >

Диалоги выбора файлов и директорий

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

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

Для отображения виджета FilenameComponent мы используем "обёртку" - объект класса DialogWindow.

Рассмотрим использование компонента на примере программы, в которой пользователь с помощью диалогового окна выбирает тот или иной файл, который сохраняется в переменной File ObtainedFile, и имя которого отображается в окне программы ( рис. 17.4).

Программа, демонстрирующая работу  FilenameComponent

Рис. 17.4. Программа, демонстрирующая работу FilenameComponent

Рассмотрим реализацию компонента содержимого нашего примера ( пример 17.2).

#include "TCentralComponent.h"
//------------------------------------------
#define tr(s) String::fromUTF8(s)
//------------------------------------------
TCentralComponent::TCentralComponent() : Component("Central Component"),
            pNameLabel(0),
            pChooseButton(0)
{
  // Ярлык для показа имени открытого файла
  pNameLabel = new Label(L"Name Label", tr("Выберите файл..."));
  pNameLabel->setFont(Font(15.0000f, Font::bold));
  pNameLabel->setJustificationType(Justification::centred);
  pNameLabel->setEditable(false, false, false);
  pNameLabel->setColour(Label::textColourId, Colours::black);
  pNameLabel->setColour(Label::backgroundColourId, Colours::azure);
  pNameLabel->setColour(Label::outlineColourId, Colours::black);
  addAndMakeVisible(pNameLabel);

  // Кнопка для вызова диалога открытия файла
  pChooseButton = new TextButton(L"Choose Button");
  pChooseButton->setButtonText(tr("Выбрать..."));
  pChooseButton->addListener(this);
  addAndMakeVisible(pChooseButton);

  setSize (400, 150);
}
//-----------------------------------------------
TCentralComponent::~TCentralComponent()
{
  // Удаляем дочерние виджеты
  // и обнуляем их указатели
  deleteAllChildren();
}
//------------------------------------------------
void TCentralComponent::paint(Graphics& Canvas)
{
  Canvas.fillAll(Colours::azure);
}
//------------------------------------------------
void TCentralComponent::resized()
{
  pNameLabel->setBounds(10, 10, getWidth() - 20, 25);
  pChooseButton->setBounds(proportionOfWidth(0.5000f) - ((150) / 2), 
            proportionOfHeight(0.5000f) - ((25) / 2), 
            150, 25);
}
//-------------------------------------------------
void TCentralComponent::buttonClicked(Button* pButton)
{
  if(pButton == pChooseButton)
  {
    // Создаём компонент для выбора файла
    FilenameComponent* pFileNameDialog = new FilenameComponent(
              String::empty,
              ObtainedFile,
              true,
              false,
              false,
              String::empty,
              String::empty,
              tr("Выберите файл...")
              );
    // Задаём его размер (иначе его не будет видно)
    pFileNameDialog->setSize(250, 25);

    // Создаём "обёртку" для показа диалога...
    DialogWindow::showModalDialog(tr("Выбор файла"),
            pFileNameDialog,
            NULL,
            Colours::azure,
            true,
            false,
            false);
 
    // Когда файл открыт...
    ObtainedFile = pFileNameDialog->getCurrentFile();
    // проверяем, существует ли он
    if(!(ObtainedFile == File::nonexistent)) 
    {
      // Выводим на ярлык название файла
      pNameLabel->setText(ObtainedFile.getFileName(), false);
    }
    else
    {
      pNameLabel->setText(tr("Файл не выбран!"), false);
    }

    if(pFileNameDialog) delete pFileNameDialog;
  }
}
//--------------------------------------------------------------
Листинг 17.2. Реализация класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
< Лекция 16 || Лекция 17: 1234 || Лекция 18 >