- получать размер итема вот так
#pas
PControl(Sender).Canvas.TextExtent('W').cy
- передавать в менеджер Sender - тоже не хорошо. При таком интерфейсе невозможно будет использовать их применительно к невизуальным контролам. Выводимый текст надо передавать в качестве одного из параметров.
- если хочется снабдить DrawManager знанием о рисуемых слева от текста картинок(т.е. константой SHIFT_PICTURE), то IconManager должен всетаки вставляться не в элемент, а в него.
Нужно всетаки постараться проникнуться идеей менеджеров(да и встраиваемых объектов вообще) и понять, что они(менеджеры) абсолютно ничего не должны знать о том, кто и зачем их будет использовать. У интерфейса отрисовки должна быть только одна функция:
#pas
function(DC: HDC; const Rect: TRect; row,col:integer; const text: string; ItemState: TDrawState; Flags:cardinal): Boolean
DC - контекст устройства вывода
Rect - координаты области вывода
row,col - номер строки и номер колонки выводимых данных
text - собственно данные
ItemState - состояние текущего пункта
Flags - прочие флаги.
ну не получается ни в какую обойтись существующим интерфейсом сделай флаги - FLG_LISTBOX, FLG_COMBOBOX, FLG_TRANSPARENT... еще какие-то... Хочется учесть отступ от левого края - ну добавь в интерфейс более общие прави, а не затачивайся под один конкретный случай:
#pas
function(DC: HDC; const DrawRect, DataRect: TRect; row,col:integer; const text: string; ItemState: TDrawState; Flags:cardinal): Boolean
DataRect - область вывода данных
В IconsManager тоже самое. Я правда не совсем понял смысловую значимость параметра Rect, который в метод отрисовки меняется по всем четырем направлениям....
------------ Дoбавленo:
Глюки с отрисовкой кстате появлялись при Transparent = True. Правда мигание зато пропадает в таком режиме...