Для этого необходимо установить в инспекторе объектов поле Style
в lbOwnerDrawFixed, при фиксированной высоте строки, или в lbOwnerDrawVariable,
при переменной, и установить собственный обработчик события для
OnDrawItem. В этом обработчике и надо рисовать растровое изображение.
Пример:
Рисуются изображения размером 32*16 (размер стандартного глифа
для Delphi). Очень полезно при поиске нужного изображения для
кнопок!
Установить в инспекторе объектов для ListBox поле ItemHeight =
19, а поле Color = clBtnFace.
{ Загрузить список файлов в ListBox1 при нажатии на кнопку Load
(например)}
procedure TForm1.bLoadClick(Sender: TObject);
VAR S : String;
begin
ListBox1.Clear; {чистим список}
S := '*.bmp'#0; {задаем шаблон}
ListBox1.Perform(LB_DIR, DDL_ReadWrite, Longint(@S[1])); {заполняем
список}
end;
{Отобразить
изображения и имена файлов в ListBox}
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index:
Integer;
Rect: TRect; State: DrawState);
var
Bitmap: TBitmap;
Offset: Integer;
BMPRect: TRect;
begin
with (Control as TListBox).Canvas do
begin
FillRect(Rect);
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile(ListBox1.Items[Index]);
Offset := 0;
if Bitmap <> nil then
begin
BMPRect := Bounds(Rect.Left + 2, Rect.Top + 2,
(Rect.Bottom - Rect.Top - 2) * 2, Rect.Bottom - Rect.Top - 2);
{StretchDraw(BMPRect, Bitmap); Можно просто нарисовать, но лучше
сначала убрать фон}
BrushCopy(BMPRect, Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height),
Bitmap.Canvas.Pixels[0, Bitmap.Height - 1]);
Offset := (Rect.Bottom - Rect.Top + 1) * 2;
end;
TextOut(Rect.Left + Offset, Rect.Top, ListBox1.Items[Index]);
Bitmap.Free;
end;
end;
Данный
пример работает медленно, но оптимизация, для ускорения, вызвала
бы трудность в понимании общего принципа его работы.
Взято
из http://forum.sources.ru
Сначала
создайте bmp-файл, который вы будете помещать около каждого элемента
списка, в примере это 'c:\file.bmp'. Для создания файла можете
воспользоваться специальной графической утилитой ImageEditor,
которая входит в пакет Delphi. Желательно, чтобы размер файлы
был 16х16. После этого вынесите на форму компонент TListBox. Его
свойство Style установите в lbOwnerDrawVariable - это позволит
нам прорисовывать каждый элемент списка самостоятельно.
Далее
объявляем переменную:
var
Bit: TBitmap;
После этого задаём обработчику события OnDrawItem следующий вид:
procedure
TForm1.ListBox1DrawItem(Control: TWinControl; index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
cc: TCanvas;
begin
cc:=(Control as TListBox).Canvas;
cc.FillRect(rect);
cc.Draw(Rect.Left+Rect.Right-16,Rect.Top,Bit);
cc.TextOut(Rect.Left,Rect.Top,ListBox1.Items[index]);
end;
а обработчику события OnMeasureItem такой:
procedure
TForm1.ListBox1MeasureItem(Control: TWinControl;
index: Integer; var Height: Integer);
begin
Height := 16;
end;
По созданию окна создаёт Bitmap и загружаем в него данные из файла:
procedure
TForm1.FormCreate(Sender: TObject);
begin
Bit := TBitmap.Create;
Bit.LoadFromFile('c:\file.bmp');
end;
По уничтожению окна - уничтожаем Bitmap
procedure
TForm1.FormDestroy(Sender: TObject);
begin
Bit.Destroy;
end;
Взято с http://delphiworld.narod.ru