Разработка кроссплатформенных приложений с использованием Juce

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

Разбить на страницы
Показывать лекцию целиком

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

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

Для создания первых двух виджетов в Juce используется один класс — ).

(рис 13.1) Различные стили объектов класса Slider в демонстрационном приложении Juce

Конструктор класса Slider::Slider(const String componentName = String::empty) создаёт ползунок, пользовательский интерфейс (стиль, а также границы и шаг устанавливаемых значений) которого должны быть обязательно заданы программистом.

Стиль объекта класса Slider устанавливается идентификаторами перечислимого типа SlyderStyle:

  • LinearHorizontal — традиционный горизонтальный ползунок;
  • LinearVertical — традиционный вертикальный ползунок;
  • LinearBar — полоса с заливкой, которую можно протягивать мышью, и надписью поверх неё;
  • Rotary — установщик (круговой регулятор), похожий на регулятор громкости радиоприёмника, головку которого можно перемещать с помощью мыши;
  • RotaryHorizontalDrag — установщик (круговой регулятор), похожий на регулятор громкости радиоприёмника, головку которого можно перемещать с помощью мыши слева направо;
  • RotaryVerticalDrag — установщик (круговой регулятор), похожий на регулятор громкости радиоприёмника, головку которого можно перемещать с помощью мыши вверх и вниз;
  • IncDecButtons — пара кнопок, нажатие на которые инкрементируют / декрементируют текущее значение ползунка на величину, заданную параметром newInterval метода void Slider::setRange(double newMinimum, double newMaximum, double newInterval = 0);
  • TwoValueHorizontal — горизонтальный ползунок с двумя головками вместо одной, которые могут показывать минимальное и максимальное значения параметра;
  • TwoValueVertical — вертикальный ползунок с двумя головками вместо одной, которые могут показывать минимальное и максимальное значения параметра;
  • ThreeValueHorizontal — горизонтальный ползунок с тремя головками вместо одной, которые могут показывать минимальное и максимальное значения параметра, а также текущее, находящееся где-то между ними;
  • ).
  • Для того, чтобы присвоить ползунку тот или иной стиль, необходимо передать идентификатор SlyderStyle в качестве параметра в метод void Slider::setSliderStyle(SliderStyle newStyle).

    Для установки границ и шага изменения значения ползунка используется уже упоминавшийся метод void Slider::setRange(double newMinimum, double newMaximum, double newInterval = 0), где newMinimum, newMaximum и newInterval — минимальное, максимальное значения и шаг, соответственно. Если параметр newInterval не равен нулю, то приращение его значения будет вычисляться как newMinimum + (newInterval * i), где i — приращение.

    Установить текущее значение ползунка можно с помощью метода void Slider::setValue(double newValue, bool sendUpdateMessage = true, bool sendMessageSynchronously = false), где newValue — устанавливаемое значение, а sendUpdateMessage и sendMessageSynchronously — флаги того, следует ли отправлять сообщения слушателям ползунка об изменении его значения и следует ли осуществлять их вызов синхронно (в случае, если слушателей несколько).

    Для получения текущего значения ползунка можно вызвать метод double Slider::getValue() const. Если он не был вызван, то начальное значение ползунка будет установлено на ноль.

    Отслеживать изменения позволяет слушатель ползунка, SliderListener, включающий одну чистую виртуальную функцию, virtual void Slider::Listener::sliderValueChanged(Slider* slider), которая должна быть переопределена.

    Рассмотрим это на примере. Приложение, представленное на рисунке 13.2 , содержит ползунок pSlider и полосу выполнения pProgressBar, состояние которой зависит от текущего значения ползунка.

    (рис 13.2) Приложение, демонстрирующее работу ползунка

    Кроме того, компонент содержимого нашей программы включает выпадающий список для выбора пользователем стиля ползунка и 4 радиокнопки для выбора местоположения поля ввода, отображающего текущее значение ползунка .

    #ifndef _TCentralComponent_h_
    #define _TCentralComponent_h_
    //---------------------------------------
    #include "../JuceLibraryCode/JuceHeader.h"
    //---------------------------------------
    // Класс компонента содержимого, наследует слушатели ползунка,
    // выпадающего списка и кнопки.
    class TCentralComponent  : public Component,
              public SliderListener,
              public ComboBoxListener,
              public ButtonListener
    {
    public:
      TCentralComponent();
      ~TCentralComponent();
    
      void paint(Graphics);
      void resized();
      // Обработчик изменения позиции ползунка
      void sliderValueChanged(Slider*);
      void comboBoxChanged(ComboBox*);
      void buttonClicked(Button*);
    
    private:
      // Выполнение...
      double dProgress;
    
      // Полоса выполнения
      ProgressBar* pProgressBar;
      // Ползунок
      Slider* pSlider;
      Label* pStyleLabel;
      // Выадающий сисок со значениями стиля ползунка
      ComboBox* pStyleComboBox;
      GroupComponent* pTextGroup;
      // Радиокнопки для выбора положения
      // поля ввода ползунка
      ToggleButton* pAboveRadioButton;
      ToggleButton* pBelowRadioButton;
      ToggleButton* pLeftRadioButton;
      ToggleButton* pRightRadioButton;
    
      // Предотвращает создание копии конструктора и оператора =
      TCentralComponent(const TCentralComponent);
      const TCentralComponent operator= (const TCentralComponent);
    };
    //--------------------------------------------
    #endif
    

    В качестве закрытого члена класса TCentralComponent мы объявили переменную double dProgress. Именно на её изменение и будет отображать полоса выполнения pProgressBar.

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

    #include "TCentralComponent.h"
    //--------------------------------
    #define tr(s) String::fromUTF8(s)
    //------------------------------
    TCentralComponent::TCentralComponent() : Component ("Central Component"),
        pProgressBar(0), pSlider(0),
        pStyleLabel(0),
        pStyleComboBox(0),
        pTextGroup(0),
        pAboveRadioButton(0),
        pBelowRadioButton(0),
        pLeftRadioButton(0),
        pRightRadioButton(0)
    {
      // Ползунок ещё не двигали - выполнение ноль
      dProgress = 0.0;
      
      // Создаём полосу выполнения, которая будет отображать
      // изменение переменной dProgress
      pProgressBar = new ProgressBar(dProgress);
      // Отображать процент выполнения в виде текста
      pProgressBar->setPercentageDisplay(true);
      addAndMakeVisible(pProgressBar);
    
      // Создаём ползунок
      pSlider = new Slider(L"Slider");
      // Границы значений - от 0 до 100,
      // шаг - 0,1.
      pSlider->setRange(0, 100, 0.1);
      // Стиль - обычный горизонтальный ползунок
      pSlider->setSliderStyle(Slider::LinearHorizontal);
      // Текстовое поле ползунка расположено внизу, доступно для ввода значений,
        // размеры - 80 на 20.
      pSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 80, 20);
      pSlider->addListener(this);
      addAndMakeVisible(pSlider);
    
      pStyleLabel = new Label (L"Style Label", tr("Стиль:"));
      pStyleLabel->setFont(Font(15.0000f, Font::plain));
      pStyleLabel->setJustificationType(Justification::centredLeft);
      pStyleLabel->setEditable(false, false, false);
      pStyleLabel->setColour(Label::textColourId, Colours::black);
      pStyleLabel->setColour(Label::backgroundColourId, Colours::azure);
      addAndMakeVisible(pStyleLabel);
    
      // Выпадающий список со значениями стилей ползунка
      pStyleComboBox = new ComboBox(L"Style Combo Box");
      pStyleComboBox->setEditableText(false);
      pStyleComboBox->setJustificationType(Justification::centredLeft);
      pStyleComboBox->setTextWhenNothingSelected(String::empty);
      pStyleComboBox->addListener(this);
      addAndMakeVisible(pStyleComboBox);
    
      // Добавляем стили...
      pStyleComboBox->addItem(L"LinearHorizontal", 1);
      pStyleComboBox->addItem(L"LinearVertical", 2);
      pStyleComboBox->addItem(L"LinearBar", 3);
      pStyleComboBox->addItem(L"Rotary", 4);
       pStyleComboBox->addItem(L"IncDecButtons", 5);
    
      // Выбран первый элемент списка
      pStyleComboBox->setSelectedItemIndex(0, false);
    
      pTextGroup = new GroupComponent (L"Text Group", tr("Положение текста"));
      addAndMakeVisible(pTextGroup);
    
      // Радиокнопки для выбора положения текстового поля ползунка
      pAboveRadioButton = new ToggleButton(L"Above RadioButton");
      pAboveRadioButton->setButtonText(tr("Сверху"));
      pAboveRadioButton->setRadioGroupId(1234);
      pAboveRadioButton->addListener(this);
      addAndMakeVisible(pAboveRadioButton);
    
      pBelowRadioButton = new ToggleButton(L"Below RadioButton");
      pBelowRadioButton->setButtonText(tr("Снизу"));
      pBelowRadioButton->setRadioGroupId(1234);
      pBelowRadioButton->setToggleState(true, true);
      pBelowRadioButton->addListener(this);
      addAndMakeVisible(pBelowRadioButton);
    
      pLeftRadioButton = new ToggleButton(L"Left RadioButton");
      pLeftRadioButton->setButtonText(tr("Слева"));
      pLeftRadioButton->setRadioGroupId(1234);
      pLeftRadioButton->addListener(this);
      addAndMakeVisible(pLeftRadioButton);
    
      pRightRadioButton = new ToggleButton(L"Right RadioButton");
      pRightRadioButton->setButtonText(tr("Справа"));
      pRightRadioButton->setRadioGroupId(1234);
      pRightRadioButton->addListener(this);
      addAndMakeVisible(pRightRadioButton);
    
      setSize(400, 400);
    }
    //----------------------------------------
    

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

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

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

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

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

  • NoTextBox — поле отсутствует;
  • TextBoxLeft — расположено слева от ползунка;
  • TextBoxRight — расположено справа от ползунка;
  • TextBoxAbove — расположено сверху от ползунка;
  • TextBoxBelow — расположено снизу от ползунка.
  • Мы сделали поле ввода нашего ползунка доступным для чтения и расположили его внизу от ползунка.

    Пользователь может на этапе выполнения менять его стиль, выбирая его в выпадающем списке , рис 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);
      }
    }
    

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

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

    При изменении пользователем положения ползунка, что и приводит к вызову метода, мы присваиваем переменной 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 на основе листингов лекции. Соберите программу, включающую окно с изменяемыми размерами для Вашей среды разработки. Поэкспериментируйте с внешним видом окна.

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

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

    Страницы:

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

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

    Для создания первых двух виджетов в Juce используется один класс — ).

    (рис 13.1) Различные стили объектов класса Slider в демонстрационном приложении Juce

    Конструктор класса Slider::Slider(const String componentName = String::empty) создаёт ползунок, пользовательский интерфейс (стиль, а также границы и шаг устанавливаемых значений) которого должны быть обязательно заданы программистом.

    Стиль объекта класса Slider устанавливается идентификаторами перечислимого типа SlyderStyle:

  • LinearHorizontal — традиционный горизонтальный ползунок;
  • LinearVertical — традиционный вертикальный ползунок;
  • LinearBar — полоса с заливкой, которую можно протягивать мышью, и надписью поверх неё;
  • Rotary — установщик (круговой регулятор), похожий на регулятор громкости радиоприёмника, головку которого можно перемещать с помощью мыши;
  • RotaryHorizontalDrag — установщик (круговой регулятор), похожий на регулятор громкости радиоприёмника, головку которого можно перемещать с помощью мыши слева направо;
  • RotaryVerticalDrag — установщик (круговой регулятор), похожий на регулятор громкости радиоприёмника, головку которого можно перемещать с помощью мыши вверх и вниз;
  • IncDecButtons — пара кнопок, нажатие на которые инкрементируют / декрементируют текущее значение ползунка на величину, заданную параметром newInterval метода void Slider::setRange(double newMinimum, double newMaximum, double newInterval = 0);
  • TwoValueHorizontal — горизонтальный ползунок с двумя головками вместо одной, которые могут показывать минимальное и максимальное значения параметра;
  • TwoValueVertical — вертикальный ползунок с двумя головками вместо одной, которые могут показывать минимальное и максимальное значения параметра;
  • ThreeValueHorizontal — горизонтальный ползунок с тремя головками вместо одной, которые могут показывать минимальное и максимальное значения параметра, а также текущее, находящееся где-то между ними;
  • ).
  • Для того, чтобы присвоить ползунку тот или иной стиль, необходимо передать идентификатор SlyderStyle в качестве параметра в метод void Slider::setSliderStyle(SliderStyle newStyle).

    Для установки границ и шага изменения значения ползунка используется уже упоминавшийся метод void Slider::setRange(double newMinimum, double newMaximum, double newInterval = 0), где newMinimum, newMaximum и newInterval — минимальное, максимальное значения и шаг, соответственно. Если параметр newInterval не равен нулю, то приращение его значения будет вычисляться как newMinimum + (newInterval * i), где i — приращение.

    Установить текущее значение ползунка можно с помощью метода void Slider::setValue(double newValue, bool sendUpdateMessage = true, bool sendMessageSynchronously = false), где newValue — устанавливаемое значение, а sendUpdateMessage и sendMessageSynchronously — флаги того, следует ли отправлять сообщения слушателям ползунка об изменении его значения и следует ли осуществлять их вызов синхронно (в случае, если слушателей несколько).

    Для получения текущего значения ползунка можно вызвать метод double Slider::getValue() const. Если он не был вызван, то начальное значение ползунка будет установлено на ноль.

    Отслеживать изменения позволяет слушатель ползунка, SliderListener, включающий одну чистую виртуальную функцию, virtual void Slider::Listener::sliderValueChanged(Slider* slider), которая должна быть переопределена.

    Рассмотрим это на примере. Приложение, представленное на рисунке 13.2 , содержит ползунок pSlider и полосу выполнения pProgressBar, состояние которой зависит от текущего значения ползунка.

    (рис 13.2) Приложение, демонстрирующее работу ползунка

    Кроме того, компонент содержимого нашей программы включает выпадающий список для выбора пользователем стиля ползунка и 4 радиокнопки для выбора местоположения поля ввода, отображающего текущее значение ползунка .

    #ifndef _TCentralComponent_h_
    #define _TCentralComponent_h_
    //---------------------------------------
    #include "../JuceLibraryCode/JuceHeader.h"
    //---------------------------------------
    // Класс компонента содержимого, наследует слушатели ползунка,
    // выпадающего списка и кнопки.
    class TCentralComponent  : public Component,
              public SliderListener,
              public ComboBoxListener,
              public ButtonListener
    {
    public:
      TCentralComponent();
      ~TCentralComponent();
    
      void paint(Graphics);
      void resized();
      // Обработчик изменения позиции ползунка
      void sliderValueChanged(Slider*);
      void comboBoxChanged(ComboBox*);
      void buttonClicked(Button*);
    
    private:
      // Выполнение...
      double dProgress;
    
      // Полоса выполнения
      ProgressBar* pProgressBar;
      // Ползунок
      Slider* pSlider;
      Label* pStyleLabel;
      // Выадающий сисок со значениями стиля ползунка
      ComboBox* pStyleComboBox;
      GroupComponent* pTextGroup;
      // Радиокнопки для выбора положения
      // поля ввода ползунка
      ToggleButton* pAboveRadioButton;
      ToggleButton* pBelowRadioButton;
      ToggleButton* pLeftRadioButton;
      ToggleButton* pRightRadioButton;
    
      // Предотвращает создание копии конструктора и оператора =
      TCentralComponent(const TCentralComponent);
      const TCentralComponent operator= (const TCentralComponent);
    };
    //--------------------------------------------
    #endif
    

    В качестве закрытого члена класса TCentralComponent мы объявили переменную double dProgress. Именно на её изменение и будет отображать полоса выполнения pProgressBar.

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

    #include "TCentralComponent.h"
    //--------------------------------
    #define tr(s) String::fromUTF8(s)
    //------------------------------
    TCentralComponent::TCentralComponent() : Component ("Central Component"),
        pProgressBar(0), pSlider(0),
        pStyleLabel(0),
        pStyleComboBox(0),
        pTextGroup(0),
        pAboveRadioButton(0),
        pBelowRadioButton(0),
        pLeftRadioButton(0),
        pRightRadioButton(0)
    {
      // Ползунок ещё не двигали - выполнение ноль
      dProgress = 0.0;
      
      // Создаём полосу выполнения, которая будет отображать
      // изменение переменной dProgress
      pProgressBar = new ProgressBar(dProgress);
      // Отображать процент выполнения в виде текста
      pProgressBar->setPercentageDisplay(true);
      addAndMakeVisible(pProgressBar);
    
      // Создаём ползунок
      pSlider = new Slider(L"Slider");
      // Границы значений - от 0 до 100,
      // шаг - 0,1.
      pSlider->setRange(0, 100, 0.1);
      // Стиль - обычный горизонтальный ползунок
      pSlider->setSliderStyle(Slider::LinearHorizontal);
      // Текстовое поле ползунка расположено внизу, доступно для ввода значений,
        // размеры - 80 на 20.
      pSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 80, 20);
      pSlider->addListener(this);
      addAndMakeVisible(pSlider);
    
      pStyleLabel = new Label (L"Style Label", tr("Стиль:"));
      pStyleLabel->setFont(Font(15.0000f, Font::plain));
      pStyleLabel->setJustificationType(Justification::centredLeft);
      pStyleLabel->setEditable(false, false, false);
      pStyleLabel->setColour(Label::textColourId, Colours::black);
      pStyleLabel->setColour(Label::backgroundColourId, Colours::azure);
      addAndMakeVisible(pStyleLabel);
    
      // Выпадающий список со значениями стилей ползунка
      pStyleComboBox = new ComboBox(L"Style Combo Box");
      pStyleComboBox->setEditableText(false);
      pStyleComboBox->setJustificationType(Justification::centredLeft);
      pStyleComboBox->setTextWhenNothingSelected(String::empty);
      pStyleComboBox->addListener(this);
      addAndMakeVisible(pStyleComboBox);
    
      // Добавляем стили...
      pStyleComboBox->addItem(L"LinearHorizontal", 1);
      pStyleComboBox->addItem(L"LinearVertical", 2);
      pStyleComboBox->addItem(L"LinearBar", 3);
      pStyleComboBox->addItem(L"Rotary", 4);
       pStyleComboBox->addItem(L"IncDecButtons", 5);
    
      // Выбран первый элемент списка
      pStyleComboBox->setSelectedItemIndex(0, false);
    
      pTextGroup = new GroupComponent (L"Text Group", tr("Положение текста"));
      addAndMakeVisible(pTextGroup);
    
      // Радиокнопки для выбора положения текстового поля ползунка
      pAboveRadioButton = new ToggleButton(L"Above RadioButton");
      pAboveRadioButton->setButtonText(tr("Сверху"));
      pAboveRadioButton->setRadioGroupId(1234);
      pAboveRadioButton->addListener(this);
      addAndMakeVisible(pAboveRadioButton);
    
      pBelowRadioButton = new ToggleButton(L"Below RadioButton");
      pBelowRadioButton->setButtonText(tr("Снизу"));
      pBelowRadioButton->setRadioGroupId(1234);
      pBelowRadioButton->setToggleState(true, true);
      pBelowRadioButton->addListener(this);
      addAndMakeVisible(pBelowRadioButton);
    
      pLeftRadioButton = new ToggleButton(L"Left RadioButton");
      pLeftRadioButton->setButtonText(tr("Слева"));
      pLeftRadioButton->setRadioGroupId(1234);
      pLeftRadioButton->addListener(this);
      addAndMakeVisible(pLeftRadioButton);
    
      pRightRadioButton = new ToggleButton(L"Right RadioButton");
      pRightRadioButton->setButtonText(tr("Справа"));
      pRightRadioButton->setRadioGroupId(1234);
      pRightRadioButton->addListener(this);
      addAndMakeVisible(pRightRadioButton);
    
      setSize(400, 400);
    }
    //----------------------------------------
    

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

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

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

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

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

  • NoTextBox — поле отсутствует;
  • TextBoxLeft — расположено слева от ползунка;
  • TextBoxRight — расположено справа от ползунка;
  • TextBoxAbove — расположено сверху от ползунка;
  • TextBoxBelow — расположено снизу от ползунка.
  • Мы сделали поле ввода нашего ползунка доступным для чтения и расположили его внизу от ползунка.

    Пользователь может на этапе выполнения менять его стиль, выбирая его в выпадающем списке , рис 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);
      }
    }
    

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

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

    При изменении пользователем положения ползунка, что и приводит к вызову метода, мы присваиваем переменной 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 на основе листингов лекции. Соберите программу, включающую окно с изменяемыми размерами для Вашей среды разработки. Поэкспериментируйте с внешним видом окна.

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

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

    Вернуться к учебному плану