Внешний вид сайта:

Использование графики в ListBox

У класса TListBox (и TComboBox тоже) есть свойство Style, определяющее порядок рисования объекта. По-умолчанию оно установлено в lbStandard и за внешний вид объекта отвечает Windows. Если установить это значение в lbOwnerDrawFixed или lbOwnerDrawVariable, то можно несколько разнообразить внешний вид объекта.

Разбираться лучше всего на конкретном примере, так что попробуем создать ListBox, который отображал имена графических файлов какой-нибудь директории вместе с картинками.

Чтобы заполнить ListBox, надо написать следующее (чтобы каждый файл не прописывать, можно просто послать сообщение):

procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
begin
  s:='c:\windows\*.bmp'#0;
  ListBox1.Perform(LB_DIR, DDL_READWRITE, Longint(@s[1]));
end;

Здесь мы указали ListBox’у, какие файлы требуется отображать. Устанавливаем свойство Style нужно установить в lbOwnerDrawFixed и создать обработчик события OnDrawItem:

procedure TForm1.ListBox1DrawItem(Control: TWinControl;
    index: integer; rect: TRect; state: TOwnerDrawState);
var
  bitmap: TBitmap;
  offset: integer;
  bmprect : TRect;
begin
  with (Control as TListBox).Canvas do
  begin
    {очищаем прямоугольник}
    FillRect(rect);
    {считываем картинку}
    bitmap:= TBitmap.Create;
    bitmap.LoadFromFile('c:\windows\' + 
        ListBox1.Items[index]);
    if bitmap <> nil then begin
      {вычисляем квадрат для показа картинки}
      bmprect:= Bounds(rect.Left + 2, rect.Top + 2,
      rect.Bottom - rect.Top - 2, rect.Bottom - rect.Top - 2);
      {рисуем картинку}
      StretchDraw(bmprect, bitmap);
      offset := rect.Bottom - rect.Top + 6;
    end;
    {выводим текст}
    TextOut(rect.Left + offset, rect.Top, 
        ListBox1.Items[index]);
    {не забыть освободить!}
    bitmap.Free;
  end;
end;

Чтобы картинки получились побольше, значение свойства ItemHeight можно увеличить.

Комментарии

Нет комментариев. Ваш будет первым!