Как вставить растровое изображение в компонент ListBox?

Для этого необходимо установить в инспекторе объектов поле 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. + 2,

  (Rect.Bottom - Rect. - 2) * 2, Rect.Bottom - Rect. - 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. + 1) * 2;

  end;

  TextOut(Rect.Left + Offset, Rect., 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.,Bit);

 cc.TextOut(Rect.Left,Rect.,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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...