Главная » C++, C++ Builder » Рисуем элементы C++ Builder

0

Наконец-то настало время заняться самой прорисовкой элементов на экране. Как вы помните, мы добавляли метод DrawItem как обработчик события DrawItem в списке для  этой  работы.  Сам список не волнует, что вы рисуете и как вы это делаете. Вместо этого список занимается управлением выборкой элементов,  связью  определенных  пользователем  (программистом) объектов с элементами списка и обработкой выбора с помощью клавиатуры от конечного пользователя. С точки зрения программирования под Windows список является замечательным примером объектно-ориентированного дизайна системы.

Вот  полный  код  обработчик  события  DrawItem.  Добавьте  его  в  обложку  метода  DrawItem,

которую CBuilder сгенерировал в исходном файле Unit1.cpp:

void __fastcall TForm1::DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State)

{

Graphics::TBitmap *pic = (Graphics::TBitmap *) ListBox1->Items->Objects[Index];

if ( pic )

{

ListBox1->Canvas->Draw(Rect.Left,  Rect.Top, pic); Rect.Left += pic->Width + 5;

}

// Если пользователь выбрал шрифт, использовать его

if ( FpFont != NULL )

ListBox1->Canvas->Font = FpFont;

// Установить выбранный пользователем цвет

ListBox1->Canvas->Brush->Color = FcColor;

ListBox1->Canvas->TextRect(Rect, Rect.Left,  Rect.Top,

ListBox1->Items->Strings[ Index ].c_str() );

}

Первый шаг — нарисовать растровое изображение в левой части области, отведенной для элемента списка. Областью управляет список, а нам она передается в виде параметра функции Rect. Параметр функции Control — управляющий элемент, для которого мы рисуем. Мы уже и так знаем, что это за объект (у нас в форме только один список), так что мы можем использовать свойство Canvas нашего объекта. Класс TControl не содержит свойства Canvas, так что нам пришлось бы приводить объект Control к объекту типа TListBox, которым он, собственно, и является, перед тем, как мы смогли бы его использовать. Так что этот шаг просто опустили.

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

Если пользователь выбрал шрифт в форме для использования в списке, то мы передаем его в свойство Canvas. Точно также и цвет элемента устанавливается во внутреннее значение FcColor. И, наконец, вызывается метод TextRect, который прорисовывает текст во внутренней  области списка. Заметьте использование свойства Strings для получения текста элемента перед его прорисовкой. Объект Canvas автоматически будет использовать нужные шрифт и цвет, которые мы установили, в методе TextRect, так что это все, что необходимо для прорисовки элемента.

Уточняем детали

Осталось всего парочка деталей, с которыми нужно покончить перед тем, как мы сможем скомпилировать и запустить приложение. Во-первых, нужно добавить данные в список с самого начала. Чтобы с этим разобраться, создайте обработчик события FormCreate и добавьте в него код:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

SetListBoxItems();

}

И, наконец, добавьте деструктор для класса формы. Здесь мы делаем последнюю подчистку в классе, после чего форма исчезает. Нам нужно освободить память, выделенную под растровые рисунки (bitmaps) в конструкторе класса. Вот полная реализация деструктора класса, которую вам нужно внести в исходный файл Unit1.cpp:

__fastcall  TForm1::~TForm1(void)

{

// Удалить из памяти растровые рисунки

delete Fbmp1; delete Fbmp2;

}

Скомпилируйте и запустите приложение. Вы увидите то, что указано  на  рис.  4.11.  Выберите новый шрифт, выбрав команду Change &Font из меню и сделайте его больше, чем предыдущий. Нажмите на OK в окне диалога выбора шрифта и проследите изменения в изображении. Повторите тест, используя новый цвет из окна диалога выбора цвета  (выбрав  команду меню Change &Color). Когда вы закончите тестирование, сядьте спокойно и поразитесь простоте ручной прорисовки списков в CBuilder.

Рис. 4.11. Новый список с ручной прорисовкой в действии

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии