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

Ввод и отображение текстовой информации

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Практически все методы класса TextEditor, использованные в примере, были рассмотрены нами ранее. Незнакома только функция void TextEditor::setTextToShowWhenEmpty(const String& text, const Colour& colourToUse), которая отображает текст text (в нашем случае это надпись "Text Editor") цветом colourToUse в том случае, если компонент пуст, т.е. не содержит другого текста.

При запуске демонстрационной программы текст в виджете pTextEditor отображается шрифтом Sans-Serif, установленным в системе по умолчанию. Пользователь может выбирать в выпадающем списке гарнитуру шрифта, которым будет отображаться текст в поле pTextEditor ( пример 8.4).

void TCentralComponent::comboBoxChanged(ComboBox* pComboBox)
{
  // Изменён выпадающий список гарнитуры шрифта
  if(pComboBox == pFontSelectionBox)
  {
    // Устанавливаем в качестве шрифта текста поля ввода
    // шрифт, выбранный пользователем из списка
    Font CurrentFont;
    CurrentFont.setTypefaceName(pFontSelectionBox->getText());
    CurrentFont.setHeight(20);
    // Задаём шрифт для отображения текста
    pTextEditor->applyFontToAllText(CurrentFont);
  }
}
Листинг 8.4. Реализация метода comboBoxChanged класса TCentralComponent (файл TCentralComponent.cpp

В примере для задания свойств текста мы использовали метод void TextEditor::applyFontToAllText(const Font& newFont), который применяет характеристики шрифта newFont ко всему содержимому поля ввода.

Однако на практике гораздо чаще требуется, чтобы различные части текста отображались разными шрифтами. В этом случае можно воспользоваться методом void TextEditor::setFont(const Font& newFont), который применяет свойства шрифта newFont только к вновь добавляемому тексту (как вводимому пользователем, так и добавляемому программно).

Реализация обработчика событий щелчка по кнопке компонента содержимого представлена в листинге 8.5 ; она понятна без каких-либо дополнительных комментариев.

void TCentralComponent::buttonClicked(Button* pButton)
{
  // Если нажата кнопка "Очистить"...
  if(pButton == pClearButton)
  {
    // Очистить поле ввода
    pTextEditor->clear();
  }
  // Если нажата кнопка "Добавить текст"...
  else if(pButton == pAppendTextButton)
  {
    // Вставить текст за курсором
    pTextEditor->insertTextAtCaret(pAppendTextEdit->getText());
    pTextEditor->insertTextAtCaret("\n");
  }
  // Если нажата кнопка "Заменить текст"...
  else if(pButton == pSetTextButton)
  {
    // Сделать замену
    pTextEditor->setText(pAppendTextEdit->getText());
    pTextEditor->insertTextAtCaret("\n");
  }
  // ...
} 
Листинг 8.5. Часть реализации метода buttonClicked класса TCentralComponent (файл TCentralComponent.cpp)

Вторая секция нашей программы демонстрирует работу с режимами редактирования ярлыка Label* pLabel: только чтение, изменение текста по одинарному и двойному щелчкам мыши. Переход к тому или иному режиму редактирования будет осуществляться тремя переключателями (радиокнопками): ToggleButton* pReadOnlyButton, ToggleButton* pEditByOneClickButton и ToggleButton* pEditByDoubleClickButton, соответственно. Радиокнопки графически организованы в группу посредством рамки GroupComponent* pLabelGroup ( рис. 8.1). Подчеркнём, что объединение радиокнопок в одну группу произошло лишь графически, т.е. они рисуются на поверхности компонента pLabelGroup, однако действуют независимо друг от друга. Для того, чтобы они начали действовать согласованно, т.е. в каждый момент могла быть включена только одна из трёх радиокнопок, их необходимо отнести в одну группу посредством наследуемого метода void Button::setRadioGroupId(int newGroupId), где newGroupIdидентификатор группы, целое число, отличное от нуля. Переключатели с одинаковыми идентификаторами действуют как единая группа радиокнопок ( пример 8.6).

  // Ярлык с возможностью ввода текста
  pLabel = new Label("Label", "Label");
  pLabel->setFont(Font(15.0000f, Font::bold));
  pLabel->setJustificationType(Justification::centred);
  // Запрет на редактирование
  pLabel->setEditable(false, false, false);
  // Цвет текста надписи
  pLabel->setColour(Label::textColourId, Colour(0xff0f1465));
  // Цвет рамки
  pLabel->setColour(Label::outlineColourId, Colour(0xf6615e5e));
  pLabel->setColour(Label::backgroundColourId, Colour(0x0));
  addAndMakeVisible(pLabel);

  pLabelGroup = new GroupComponent();
  pLabelGroup->setText(tr("Редактирование"));
  addAndMakeVisible(pLabelGroup);

  // Радиокнопка - запрет на редактирование ярлыка
  pReadOnlyButton = new ToggleButton("ReadOnlyButton");
  pReadOnlyButton->setButtonText(tr("Только чтение"));
  // Устанавливаем в качестве слушателя кнопки
  // сам компонент-контейнер
  pReadOnlyButton->addListener(this);
  // Радиокнопка отмечена
  pReadOnlyButton->setToggleState(true, false);
  pReadOnlyButton->setRadioGroupId(1234);
  addAndMakeVisible(pReadOnlyButton);

  // Радиокнопка - редактирование ярлыка по щелчку
  pEditByOneClickButton = new ToggleButton("EditByOneClickButton");
  pEditByOneClickButton->setButtonText(tr("Одним щелчком"));
  pEditByOneClickButton->addListener(this);
  // Радиокнопка не отмечена
  pEditByOneClickButton->setToggleState(false, false);
  pEditByOneClickButton->setRadioGroupId(1234);
  addAndMakeVisible(pEditByOneClickButton);

  // Радиокнопка - редактирование ярлыка по двойному щелчку
  pEditByDoubleClickButton = new ToggleButton("EditByDoubleClickButton");
  pEditByDoubleClickButton->setButtonText(tr("Двойным щелчком"));
  pEditByDoubleClickButton->addListener(this);
  pEditByDoubleClickButton->setToggleState(false, false);
  pEditByDoubleClickButton->setRadioGroupId(1234);
  addAndMakeVisible(pEditByDoubleClickButton);
Листинг 8.6. Часть реализации конструктора класса TCentralComponent (2-я секция демонстрационной программы ввода и отображения текстовой информации, файл TCentralComponent.cpp)
< Лекция 7 || Лекция 8: 1234 || Лекция 9 >