Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];

Вниз

Беда с этим 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
4-23835
SPeller
2002-05-05 14:37
2002.07.08
События


1-23568
alena.svt
2002-06-26 21:34
2002.07.08
RunTime


3-23520
maksik75
2002-06-17 18:00
2002.07.08
HELP !!


1-23560
Феликс
2002-06-26 23:11
2002.07.08
Как сделать , чтобы filelistbox отоброжал вновь созд. файлы?


7-23797
Dankin
2002-04-07 14:51
2002.07.08
Такой-вот странный вопрос, Где находится курсор !!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский