Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Использование OwnerDraw

Если у вас когда-нибудь возникало желание поместить изображение в списке, здесь описано, как это сделать. Данная техника может также применяться для других визуальных компонентов, которые поддерживают "прорисовку владельцем", что задается в свойсте Style. Прорисовка владельцем означает, что вместо стандартной прорисовки Windows для визуального компонента используется подпрограмма его владельца, обычно формы. Используя OwnerDraw, можно, например, изменить цвет отдельных ячеек в сетке (Grid), поместить рисунок в ComboBox, ListBox, TabSet и других компонентов, которые содержат список.

Чтобы использовать OwnerDraw, нужно, во-первых, задать свойство Style соответствующего компонента, во-вторых - добавить графический объект в список, и в-третьих - написать процедуру для прорисовки элементов списка.

В зависимости от того, различается ли размер изображения для каждого элемента списка, или нет, в свойстве Style задается значение OwnerDrawVarible или OwnerDrawFixed соответственно (точное значение зависит от компонента; для ListBox это lbOwnerDrawVarible и lbOwnerDrawFixed). Для простоты установим свойство равным lbOwnerDrawFixed.

Теперь мы должны загрузить растр, который будет отображаться в списке. Поместите компонент TImage на форму и загрузите в него нужную картинку. Эту картинку нужно будет ассоциировать со строками списка. Если только вы не собираетесь изменять способ прорисовки во время работы программы, то удобнее всего это сделать в обработчике события OnCreate формы-владельца компонента. Ниже показан пример обработчика события OnCreate, в котором происходит ассоциирование изображения со строками ListBox.

procedure TFMForm.FormCreate(Sender: TObject);



const



StrArray : array [0..3] of string =



('Строка 1', 'Строка 2', 'Строка 3', 'Строка 4');



var



Index: Integer;



begin



for Index := 0 to 3 do { добавляем строки из массива }



lbListBox.Items.AddObject(StrArray[Index], Image.Picture.Graphic);



end;
В данном обработчике в список lbListBox добавляются строки, предварительно записанные в виде массива. Конечно, можно использовать любой другой способ хранения строк, например в виде ресурса.
Теперь мы должны написать процедуру для прорисовки элементов списка, так как после установки свойства Style Windows больше не делает это за нас. Эта процедура должна вызываться в ответ на событие OnDrawItem компонента lbListBox. Ниже приведен пример процедуры.

procedure TfmForm.lbListBoxDrawItem(Control: TWinControl; Index: Integer;



Rect: TRect; State: TOwnerDrawState);



var



Bitmap: TBitmap;



Offset: Integer;



begin



with (Control as TListBox).Canvas do begin



FillRect(Rect);



Offset := 2;



Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]);



if Bitmap <> nil then begin



BrushCopy(Bounds(Rect.Left + 2, Rect.Top, Bitmap.Width, Bitmap.Height),



Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed);



Offset := Bitmap.width + 6;



end;



TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index])



end;



end;
Обратите внимание, что значение переменной Bitmap проверяется, чтобы избежать исключения в случае, если со строкой не ассоциировано изображение.






<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS