Вопросы и Ответы
2. Как вставить растровое изображение в компонент ListBox?
Для этого необходимо установить в инспекторе объектов поле Style в lbOwnerDrawFixed, при фиксированной высоте строки, или в lbOwnerDrawVariable, при переменной, и установить собственный обработчик события для OnDrawItem. В этом обработчике и надо рисовать растровое изображение.
Рисуются изображения размером 32*16 (размер стандартного глифа для Delphi). Очень полезно при поиске нужного изображения для кнопок!
Установить в инспекторе объектов для ListBox поле ItemHeight = 19, а поле Color = clBtnFace.
............
{
Загрузить список файлов в ListBox1 при нажатии на
кнопку Load (например)} ListBox1.Clear;{чистим список} end;
............ {Отобразить
изображения и имена файлов в ListBox} Bitmap
: TBitmap; begin
WITH
(Control AS TListBox).Canvas DO BEGIN FillRect(Rect);
BMPRect
:= Bounds(Rect.Left+2, Rect.Top+2, (Rect.Bottom-Rect.Top-2)*2, Rect.Bottom-Rect.Top-2); END;
END;
end;
............ Данный пример работает
медленно, но оптимизация, для ускорения, вызвала
бы трудность в понимании общего принципа его
работы.
procedure TForm1.bLoadClick(Sender: TObject);
VAR S : String;
begin
S := '*.bmp'#0; {задаем
шаблон}
ListBox1.Perform(LB_DIR, DDL_ReadWrite,
Longint(@S[1])); {заполняем список}
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: DrawState);
VAR
Offset : Integer;
BMPRect: TRect;
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile(ListBox1.Items[Index]);
Offset := 0;
IF Bitmap <> NIL THEN BEGIN
{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;
TextOut(Rect.Left+Offset, Rect.Top,
ListBox1.Items[Index]);
Bitmap.Free;
...предыдущая страница следующая...
оглавление