Ниже пример кода демонстрирует, как можно нарисовать пользовательский текст в ответ на сообщение WM_DRAWITEM
, отправленное в родительское окно элемента управления ComboBox (это должна быть форма для работы образца, в противном случае элементы управления подклассами или полное рисование элементовнеобходим элемент управления).
Чтобы получить это сообщение, установите для свойства Style
элемента управления значение 'csOwnerDrawFixed', но не устанавливайте обработчик для события OnDrawItem
, чтобы рисунок по умолчанию применялсяВсе остальные случаи, в которые мы вмешиваемся, рисуют.
Образец устанавливает текст, когда ItemIndex
равен -1, но в противном случае его можно адаптировать / настроить.Обратите внимание, что код рисования не является полным или точным, пример демонстрирует, как это можно сделать:
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
[..]
private
procedure WMDrawItem(var Msg: TWMDrawItem); message WM_DRAWITEM;
end;
[...]
procedure TForm1.WMDrawItem(var Msg: TWMDrawItem);
var
Font: HFONT;
begin
inherited;
if (Msg.Ctl = ComboBox1.Handle) and (Msg.DrawItemStruct.itemID = $FFFFFFFF) and
((Msg.DrawItemStruct.itemAction and ODA_DRAWENTIRE) = ODA_DRAWENTIRE) then begin
Font := SelectObject(Msg.DrawItemStruct.hDC, ComboBox1.Canvas.Font.Handle);
SelectObject(Msg.DrawItemStruct.hDC, GetStockObject(DC_BRUSH));
if (Msg.DrawItemStruct.itemState and ODS_SELECTED) = ODS_SELECTED then begin
SetDCBrushColor(Msg.DrawItemStruct.hDC, ColorToRGB(clHighlight));
SetBkColor(Msg.DrawItemStruct.hDC, ColorToRGB(clHighlight));
SetTextColor(Msg.DrawItemStruct.hDC, ColorToRGB(clHighlightText));
end else begin
SetDCBrushColor(Msg.DrawItemStruct.hDC, ColorToRGB(clWindow));
SetBkColor(Msg.DrawItemStruct.hDC, ColorToRGB(clWindow));
SetTextColor(Msg.DrawItemStruct.hDC, ColorToRGB(clWindowText));
end;
FillRect(Msg.DrawItemStruct.hDC, Msg.DrawItemStruct.rcItem, 0);
TextOut(Msg.DrawItemStruct.hDC, 4, 4, '_no_selected_item_', 18);
SelectObject(Msg.DrawItemStruct.hDC, Font);
end;
end;