Как поместить картинки в Combo Box?

Материал из DRKB

Как поместить картинки в Combo Box?[править | править код]

Делается это при помощи стиля ownerdraw, который присутствует в TComboBox. Нас интересуют два свойства этого стиля:

csOwnerDrawFixed - используется, если все битмапы имеют одинаковую высоту csOwnerDrawVariable - используется для битмапов с разной высотой После того как стиль будет установлен на один из вышеперечисленных, то можно воспользоваться событием onDrawItem. Это событие возникает каждый раз, когда приложению необходимо нарисовать пункт в выпадающем списке (combo box). Событие определяется следующим образом:


 procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; 
 Rect: TRect; State: TOwnerDrawState) 

Если выпадающему списку был присвоен стиль csOwnerDrawFixed, то всё, что надо сделать, это написать процедуру, которая будет рисовать битмап и текст в событии onDrawItem.

Для выпадающего списка со стилем csOwnerDrawVariable необходимо пройти ещё одну дополнительную стадию. Заключается эта стадия в создании обработчика для события onMeasureItem. Это событие вызывается перед DrawItem, для того, чтобы Вы могли установить фактическую высоту для каждого элемента списка. Вот его определение:

 procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); 
  • Создайте новое приложение
  • Разместите на форме TComboBox и TImageList (если Вы используете delphi 1, то Вам придётся хранить битмапы каким-то другим способом)


procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  (* Заполняем прямоугольник *)
  ComboBox1.Canvas.FillRect(Rect);  

  (* Рисуем сам битмап *)
  ImageList1.Draw(ComboBox1.Canvas, Rect.Left, Rect.Top, Index);

  (* Пишем текст после картинки *)
  ComboBox1.Canvas.TextOut(Rect.Left + ImageList1.Width + 2, Rect.Top, ComboBox1.Items[Index]);
end;


Source: Взято из http://forum.sources.ru
ID: 01157