Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.08;
Скачать: CL | DM;

Вниз

Беда с этим TTreeView. Помогите кто-нибудь советом.   Найти похожие ветки 

 
Song ©   (2002-06-25 14:30) [0]

Первоначальная задача была такая:

Есть TTreeView и например подитем такой:

Год постройки здания: 1989

Требовалось 1989 сделать жирным и другим цветом.
Воспользовался событием onAdvancedCustomDrawItem, рисуя на Sender.Canvas совместными усилиями с Игорем Шевченко (огромная благодарность ему!) это всё решилось, НО, у TTreeView при использовании вышеназванного события при DefaultDraw:=False не рисуются линии, показывающие иерархию и боксы с крестиком (они правда не нужны потому что узлы не могут содержать информацию, которую можно было бы выделять жирынм шрифтом).
Воспользовался TPen.Style=dsDot или dsDash, всё не подходит: длина штриха слишком большая. Как сделать длину штриха маленькую, такую как в при DefaultDrawing:=True или как рисуется при TCanvas.DrawFocusRect() ???

Посмотреть скриншот, который хорошо демонстрирует проблему можно здесь:
http://coolsong.narod.ru/12.bmp

(Участки которые отичаются от веток нарисованных при DefaultDrawing:=True хорошо заметны, они нарисованы через TCanvas.Pen.Style:=dsDot}

Как рисую я:

procedure TForm5.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
Var NodeRect:TRect;
begin
IF not Assigned(Node) then Exit;
With Node Do
With Sender.Canvas Do
Begin
DefaultDraw:=False;
NodeRect:=DisplayRect(True);
Pen.Style:=psDot;
MoveTo(NodeRect.Left,NodeRect.Top-(NodeRect.Top-NodeRect.Bottom) div 2);
LineTo(NodeRect.Left-((NodeRect.Left-Parent.DisplayRect(True).Left) div 2),NodeRect.Top-(NodeRect.Top-NodeRect.Bottom) div 2);
MoveTo(NodeRect.Left-((NodeRect.Left-Parent.DisplayRect(True).Left) div 2),NodeRect.Bottom);
LineTo(NodeRect.Left-((NodeRect.Left-Parent.DisplayRect(True).Left) div 2),NodeRect.Top);
End;
End;


Это часть кода не вся, убраны некоторые проверки и рисование текста на канвасе, оставлено только рисование линий. Заодно может знает многоуважаемый ALL более лучший способ рисовании или оптимизацию этого куска "перевернутой буквы T" т.е.

|---

Спасибо заранее.


 
Кулюкин Олег ©   (2002-06-25 15:42) [1]

CustomDraw из демосов.
Все дерево отрисовывается ручками.


 
Song ©   (2002-06-25 15:45) [2]

2Кулюкин Олег © (25.06.02 15:42)
Это понятно. Всё и так отисовывается ручками. Проблема чтобы сделать пунктиную линию, соеднияющую ветви не отличающуюся от стандартной.


 
Song ©   (2002-06-25 16:02) [3]

Так или иначе проблема решена.
Расскажу как.

Сначала я сделал как мне посоветовал MBo.
Я использовал LineDDA() где использовал Call-Back ф-ию: одну для горизонтальных, другую - для вертикальных линий.
В тело call-back ф-ии вставил IF Odd(X) then... - для горизонтальной и IF Odd(y) then ... соответстсвенно для вертикальной линий. Соединяющие итемы линии стали рисоваться, но те участки где использовался DefaultDraw:=False отличались визуально немного от нарисованных "родным" обработчиком. Дабы не быть голословным, посмотрите скриншот: http://coolsong.narod.ru/13.bmp
Однако кроме этой проблемы осталась другая: нужен был отдельный алгоритм для соединения итемов верхних уровней.

Выход из ситуации подсказал Игорь Шевченко. Заключался он в следующем:
Посмотрим на событие TTreeView.onAdvancedCustomDrawItem:

procedure TForm5.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
Begin
IF not Assigned(Node) or (Stage<>cdPostPaint) then Exit;
NodeRect:=Node.DisplayRect(True);
FillRect(NodeRect);
...
DefaultDraw:=Stage=cdPrePaint;
End;


За место точек должен содержаться код, по которому будут отрисовываться необходимые элементы дерева вручную.
Опять же чтобы не быть голословным, посмотрите на скриншот:
http://coolsong.narod.ru/14.bmp
Буду рад, если эта информация поможет кому-либо при работе с TTreeView.


 
Кулюкин Олег ©   (2002-06-25 16:40) [4]

У меня есть готовое дерево, отрисовываемое ручками.
Могу намылить.
Тоже использовал LineDDA, иначе не смог :)



Страницы: 1 вся ветка

Текущий архив: 2002.07.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
3-23446
Siv_Soft
2002-06-14 12:49
2002.07.08
Использование fetch


3-23459
sst
2002-06-14 13:32
2002.07.08
Перестановка строк в БД


14-23740
ev
2002-06-01 20:17
2002.07.08
распределенная БД


1-23582
Archont
2002-06-27 10:04
2002.07.08
ProgressBar


1-23605
Андрусь
2002-06-25 12:30
2002.07.08
Движение формы и Resize