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

Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты выбора из списков

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >

В простейшем (как рассматриваемый) случае, необходимо переопределить лишь две чистые виртуальные функции, наследуемые от ListBoxModel:

  • virtual int ListBoxModel::getNumRows() — возвращает число элементов списка.
  • virtual void ListBoxModel::paintListBoxItem(int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) — рисует строку номером rowNumber, с шириной width и высотой height. Как понятно из названия, флаг rowIsSelected показывает, является ли строка выделенной (выбранной).

Реализация класса представлена в листинге 9.2 .

#include "TListBox.h"
//-----------------------------------------------------
#define tr(s) String::fromUTF8(s)
//--------------------------------------------------
TListBox::TListBox(const String& sName, ListBoxModel* pModel) 
  : ListBox(sName, pModel)
{
  // Установливаем класс в качестве собственной модели
  setModel(this);
  setOutlineThickness(1);

  // Разрешаем множественное выделение элементов списка
  setMultipleSelectionEnabled(true);
  
  // Разрешаем выбор элемента наведением мыши
  // setMouseMoveSelectsRows(true);

  setSize(400, 200);
}
//----------------------------------------------------
TListBox::~TListBox()
{
}
//----------------------------------------------------
int TListBox::getNumRows()
{
  // В списке - 4 строки
  return 4;
}
//---------------------------------------------------
void TListBox::paintListBoxItem(int iRowNumber, Graphics& Painter, int iWidth,
                                int iHeight, bool bIsRowSelected)
{
  // Если строка выбрана, закрашиваем её голубым цветом
  if(bIsRowSelected)
  {
    Painter.fillAll(Colours::lightblue);
  }

  // Цвет надписи - чёрный
  Painter.setColour(Colours::black);
  // Размер шрифта - 75% от высоты строки
  Painter.setFont(iHeight * 0.7f);

  // Рисуем текст строки с заданными параметрами, исходя из её номера
  Painter.drawText(tr("Элемент ") + String(iRowNumber + 1), 
            5, 0, iWidth, iHeight, 
          Justification::centredLeft, true);
}
//--------------------------------------------------------
Листинг 9.2. Реализация класса TListBox (файл TListBox.cpp)

В конструкторе класса мы устанавливаем его в качестве собственной модели и разрешаем множественное выделение элементов списка.

Переопределяем функцию getNumRows(). В простейшем (рассматриваемом) случае возвращаемое целое — это число строк списка для отображения.

Обратите внимание, что, хотя класс ListBox унаследован от класса Component, нет необходимости переопределять функции paint и resized. Прорисовка элементов списка осуществляется исключительно в методе paintListBoxItem. Вначале мы проверяем, был ли выбран элемент пользователем и, если да, закрашиваем его голубым цветом. Затем задаём цвет выведения надписи (чёрный) и размер её шрифта, исходя из высоты элемента списка. После чего рисуем надпись с помощью уже знакомой нам функции drawText.

Внешний вид работающей программы представлен на рисунке 9.1 .

Работа программы, включающей простейший список без разделения данных и их представления

Рис. 9.1. Работа программы, включающей простейший список без разделения данных и их представления
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >