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

Элементы управления. Элементы управления для установки значений

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

Конструктор полосы выполнения ProgressBar::ProgressBar(double& progress) в качестве параметра принимает переменную, изменения которой отслеживаются в ходе выполнения программы. Если переменной присваивается новое значение, то полоса выполнения автоматически перерисовывает сама себя для его отображения. Обратите внимание, что диапазон значений, принимаемых переменной должен находиться в пределах от 0 до 1. В качестве параметра конструктора создаваемой полосы выполнения мы передаём упоминавшуюся переменную dProgress, которую предварительно инициализируем нулём.

Полоса состояния может отображать или не отображать процент выполнения той или иной операции (фактически — прироста или убыли значения переменной — параметра конструктора). Для того, чтобы задать отображение процента выполнения в виде числа, рисуемого на поверхности полосы выполнения, мы вызываем метод void ProgressBar::setPercentageDisplay(bool shouldDisplayPercentage), где shouldDisplayPercentage — флаг включения / отключения отображения процента выполнения в виде числа.

Затем мы создаём ползунок, которому задаём начальные параметры: горизонтальный стиль, диапазон от 0 до 100 с шагом 0,1 пример 13.2

Как уже упоминалось, каждому ползунку может быть ассоциировано текстовое поле, отображающее его текущее значение. Задать параметры отображения этого поля можно с помощью метода void Slider::setTextBoxStyle(TextEntryBoxPosition newPosition, bool isReadOnly, int textEntryBoxWidth, int textEntryBoxHeight), где newPosition — положение поля относительно ползунка, isReadOnly — флаг того, может ли пользователь вводить в поле новое текущее значение ползунка, а textEntryBoxWidth и textEntryBoxHeight — его размеры.

Позиция поля ввода ползунка задаётся идентификаторами перечислимого типа TextEntryBoxPosition:

  • NoTextBox — поле отсутствует;
  • TextBoxLeft — расположено слева от ползунка;
  • TextBoxRight — расположено справа от ползунка;
  • TextBoxAbove — расположено сверху от ползунка;
  • TextBoxBelow — расположено снизу от ползунка.

Мы сделали поле ввода нашего ползунка доступным для чтения и расположили его внизу от ползунка.

Пользователь может на этапе выполнения менять его стиль, выбирая его в выпадающем списке pStyleComboBox, а также изменять позицию текстового поля, отмечая соответствующую радиокнопку ( пример 13.3, рис. 13.2).

void TCentralComponent::comboBoxChanged(ComboBox* pBox)
{
  // Устанавливаем для ползунка стиль, выбранный
  // пользователем в выпадающем списке
  switch(pBox->getSelectedItemIndex())
  {
    case 0:
    {
    pSlider->setSliderStyle(Slider::LinearHorizontal);
    break;
    }
    case 1:
    {
    pSlider->setSliderStyle(Slider::LinearVertical);
    break;
    }
    case 2:
    {
    pSlider->setSliderStyle(Slider::LinearBar);
    break;
    }
    case 3:
    {
    pSlider->setSliderStyle(Slider::Rotary);
    break;
    }
    case 4:
    {
    pSlider->setSliderStyle(Slider::IncDecButtons);
    break;
    }
    default:
    {
    pSlider->setSliderStyle(Slider::LinearHorizontal);
    }

  }
}
//---------------------------------------------------------------------
void TCentralComponent::buttonClicked(Button* pButton)
{
  // Устанавливаем для текстового поля ползунка позицию,
  // отмеченную пользователем
  if(pButton == pAboveRadioButton)
  {
    pSlider->setTextBoxStyle(Slider::TextBoxAbove , false, 80, 20);
  }
  else if(pButton == pBelowRadioButton)
  {
    pSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 80, 20);
  }
  else if(pButton == pLeftRadioButton)
  {
    pSlider->setTextBoxStyle(Slider::TextBoxLeft, false, 80, 20);
  }
  else if(pButton == pRightRadioButton)
  {
    pSlider->setTextBoxStyle(Slider::TextBoxRight, false, 80, 20);
  }
}
Листинг 13.3. Реализация методов comboBoxChanged и buttonClicked класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Логика работы программы представлена реализацией метода sliderValueChanged нашего класса пример 13.4.

void TCentralComponent::sliderValueChanged(Slider* pSlider)
{
    // Если пользователь двигает ползунок,
    // отображаем это в виде изменения
    // полосы выполнения
    dProgress = (pSlider->getValue()) / 100.0;
}
Листинг 13.4. Реализация метода sliderValueChanged класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

При изменении пользователем положения ползунка, что и приводит к вызову метода, мы присваиваем переменной dProgress новое значение, что и приводит к изменению полосы выполнения. Поскольку значения отслеживаемой ею переменной должны колебаться в пределах от 0 до 1, мы делим текущее значение ползунка на 100.

Класс ScrollBar отвечает за создание полосы прокрутки — важной составляющей пользовательского интерфейса. С её помощью отображаются текстовые или графические данные, превышающие отведённую для них область просмотра. Используя указатель текущего положения полосы прокрутки, можно перемещать данные в видимую область.

Отдельно полосы прокрутки используются очень редко. Удобнее создать объект класса Viewport (область просмотра) и подключить к нему дочерний компонент, положение которого относительно области просмотра необходимо изменять, методом void Viewport::setViewedComponent(Component* newViewedComponent). Кроме того, многие компоненты (например, TextEditor) включают уже готовые полосы прокрутки, по умолчанию появляющиеся, когда содержимое компонента выходит за пределы области просмотра.

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

Положение полосы прокрутки задаётся методом void ScrollBar::setOrientation(bool shouldBeVertical). В случае, если параметр функции принимает значение true, то направление полосы прокрутки будет вертикальным; в противном случае — горизонтальным.

Узнать текущее положение полосы прокрутки позволяет метод bool ScrollBar::isVertical() const throw ().

Задать диапазон значений, на которые может быть смещена головка полосы прокрутки позволяет метод void ScrollBar::setRangeLimits(double minimum, double maximum), где принимаемые параметры — минимальное и максимальное значения смещения, соответственно. Получить минимальное и максимальное значение текущего диапазона позволяют методы double ScrollBar::getMinimumRangeLimit() const throw() и double ScrollBar::getMaximumRangeLimit() const throw().

Задать новое положение головки полосы прокрутки можно с помощью метода void ScrollBar::setCurrentRangeStart(double newStart).

Краткие итоги

В этой лекции мы научились создавать и использовать в своих программах различного рода ползунки с помощью одного класса, Slider. Внешний вид ползунка устанавливается идентификаторами перечислимого типа SlyderStyle.

Упражнение

Создайте платформ-независимый проект с помощью Introjucer на основе листингов лекции. Соберите программу, включающую окно с изменяемыми размерами для Вашей среды разработки. Поэкспериментируйте с внешним видом окна.

Дополнительные материалы

Архив с исходными текстами примера Вы можете скачать здесь.

< Лекция 12 || Лекция 13: 123 || Лекция 14 >