Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизПерекрыть CustomDrawItem в TreeView Найти похожие ветки
← →
Islander (2004-04-07 23:20) [0]Здравствуйте!
Разрабатываю компонент-наследник от TTreeView. Стоит задача - раскрашивать ноды в разные цвета.
И тут встала проблема: не могу перекрыть событие OnCustomDrawItem. Полазив по наследникам нашел функцию
function CustomDrawItem(Node: TTreeNode; State: TCustomDrawState;
Stage: TCustomDrawStage; var PaintImages: Boolean): Boolean; override;
Нормально ее перекрыл и скомпилировал. Только есть проблема: она не выполняется. Ставлю брейку - заходов в эту функцию нет.
Никто не может подсказать, как это лечить?
← →
Camypau (2004-04-07 23:33) [1]не совсем понял конечно.
можно было просто это событие обработать и раскрасить или даже не его а onAdvancedCustomDraw
и (не помню это только в листвью или тут то же есть) свойство OwnerDraw в тру установить
без него ты туда не попадёшь в энтот кодец
← →
Islander (2004-04-07 23:39) [2]1) В TreeView можно OwnerDraw не включать
2) Обработать можно, но не красиво. Я же компоненту пишу и расраска нод должна быть именно в ней.
← →
Camypau (2004-04-07 23:50) [3]понял.
но всё же по моему надо перекрывать не событие, а процедуру отрисовки
поищи код if assigned(CustomDrawItem)
по моему (я всё ж не уверен) customdraw дополнительная процедура отрисовки, а не основная и она не производит основную отрисовку, а работает только когда нужно дополнительно отрисовать что то, если у компонента конечно задана процедура обработчик
если что не так, извини :)
← →
Islander (2004-04-07 23:55) [4]Так я и перекрываю функцию отрисовки...
← →
Игорь Шевченко © (2004-04-08 00:25) [5]
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var Rect : TRect;
begin
with Sender.Canvas do begin
if cdsHot in State then
Font.Style := Font.Style + [fsUnderline]
else
Font.Style := Font.Style - [fsUnderline];
if ([cdsHot, cdsSelected] * State <> []) then begin
Font.Color := clBlack;
if cdsHot in State then begin
Brush.Color := RGB(100,200,255);
end else begin
Brush.Color := clWhite;
end;
end else begin
if cdsSelected in State then
Font.Color := clBlack
else
Font.Color := clBlack;
Brush.Color := clWhite;
end;
Rect := Node.DisplayRect(true);
Rect.Right := Sender.BoundsRect.Right;
FillRect (Rect);
end;
end;
Вроде, нормально работает....
← →
Islander (2004-04-08 00:30) [6]Спасибо, но это не то.
Мне нужно такую прорисовку осуществить В КЛАССЕ-НАСЛЕДНИКЕ TTREEVIEW...
← →
Camypau (2004-04-08 00:44) [7]короче ща попробовал такой класс создать и...
не работало как у тя ,
но после того как создал обработчик oncustomdrawitem у дерева класса наследника, то метод вызвался (причём процедура пустая).
значить наверно надо смотреть выше в обработчике
CNNotify где он и вызывается потом CustomDrawitem в смысле.
наверно он там проверяет есть ли обработчики отрисовки или нет
и в зависимости от этого вызывает или не вызывает customdrawitem
← →
Islander (2004-04-08 01:12) [8]Да, точно, вот теперь функция сработала... Но все равно, ставить даже пустой обработчик - нецивильно. Где бы еще напильничком попилить? :) Можно ли как то сделать Assigned OnCustomDrawItem из компоненты-наследника?
← →
Mantic0re © (2004-04-08 10:37) [9]Писал компоненту, наследник от TCustomTreeView, где не только цвет но и сами ноды перерисовывал капитально (компонент схож с делфийским ObjectInspector"ом)..
Сначала тоже заморачивался с CN_NOTIFY..
Но потом просто в конструкторе присвоил OnAdvancedCustomDrawItem свой обработчик,
и рисовал в Stage = cdPrePaint, с DefaultDraw = False.
Все работает ок.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c