Как поместить картинки в Combo Box.
Автор: Allan Carlton
Делается это при помощи стиля ownerdraw, который
присутствует в TComboBox. Нас интересуют два свойства
этого стиля:
- csOwnerDrawFixed - используется, если все битмапы имеют
одинаковую высоту
- csOwnerDrawVariable - используется для битмапов с разной
высотой
После того как стиль будет установлен на один
из вышеперечисленных, то можно воспользоваться
событием onDrawItem. Это событие возникает каждый раз,
когда приложению необходимо нарисовать пункт в
выпадающем списке (combo box). Событие определяется
следующим образом:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState)
Control |
Элемент управления, содержащий
пункт списка |
Index |
Номер элемента списка |
Rect |
прямоугольник, в котором будет
отображён элемент списка |
State |
Состояние элемента: выбран,
заблокирован или имеет фокус (odSelected, OdDisabled или
OdFocused) |
Если выпадающему списку был присвоен стиль
csOwnerDrawFixed, то всё, что надо сделать, это написать
процедуру, которая будет рисовать битмап и текст
в событии onDrawItem.
Для выпадающего списка со стилем csOwnerDrawVariable
необходимо пройти ещё одну дополнительную
стадию. Заключается эта стадия в создании
обработчика для события onMeasureItem. Это событие
вызывается перед DrawItem, для того, чтобы Вы могли
установить фактическую высоту для каждого
элемента списка. Вот его определение:
procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
Control |
Элемент управления, содержащий
пункт списка |
Index |
Номер элемента списка |
Height |
Собственно высота элемента
списка с номером Index |
От теории к практике
- Создайте новое приложение
- Разместите на форме combobox и imagelist (если Вы
используете delphi 1, то Вам прийдётся хранить
битмапы каким-то другим способом)
- В Object Inspector установите следующие свойства:
Компонент |
Свойство |
Установите в |
Описние |
ComboBox1 |
Style |
csOwnerDrawFixed |
Чтобы мы могли контролировать
рисованием элементов. |
ComboBox1 |
Items |
Здесь можно добавить любые строки,
которые будут отображаться рядом с битмапами. |
Чтобы каждый элемент имел
описание к картинке. |
ImageList1 |
Используйте редактор списка картинок (ImageList
Editor) |
Добавьте битмапы в том порядке, в
котором они будут отображаться в combobox, а так же
проверьте, чтобы они были одного размера.
Прозрачный цвет можно установить здесь же. |
Это картинки, которые появятся в
выпадающем списке |
- В заключение необходимо добавить следующий код
для события onDrawItem:
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;
|