Рисуем деревья вертикально или горизонтально в C#

Пример Обработать общие события мыши TreeNode в C# показывает, как создать общий класс узлов, который может рисовать деревья с узлами, которые содержат что угодно. В этом примере каждый узел центрируется по его поддереву.

Этот пример изменяет это, чтобы вы могли рисовать деревья, ориентированные вертикально, как это делает элемент управления TreeView.

Основные отличия между этой программой и предыдущей версией заключаются в том, как узел упорядочивает и рисует сам. Следующий код показывает, как узел упорядочивается, если его ориентация вертикальна.

[draw trees]

[draw trees] ...

Затем код устанавливает центр данных. Эта позиция имеет то же положение Y, что и пятно, и сдвигается вправо на радиус пятна плюс половина оттянутой ширины данных.

Затем код обновляет допустимое минимальное значение Y ymin и рекурсивно вызывает методы дочерних узлов ArrangeVertically, чтобы упорядочить дочерние узлы.

Если вы сравните это с кодом, используемым в предыдущем примере, чтобы упорядочить дерево по горизонтали, вы обнаружите, что это намного проще. (Этот код также включен в этот метод ArrangeHorizontally этого примера.)

Когда программа рисует деревья, она использует два шага. Сначала он рисует связи между узлами, а затем сам рисует узлы. Следующий код показывает, как класс TreeNode рисует ссылки для вертикально ориентированного дерева.

Для каждого из дочерних узлов этот код рисует вертикальную линию от пятна узла до положения слева от точки ребенка. Затем он рисует линию от этой позиции до места ребенка. Код заканчивается рекурсивным вызовом метода child DrawSubtreeLinksVertical для рисования ссылок для поддерева child.

Следующий код показывает, как программа рисует сами узлы.

Сначала код вызывает метод Draw объекта узла Data, чтобы сделать сам объект. Затем, если ориентация узла вертикальна, код рисует пятно слева от узла. Он заполняет пятна узлов листа оранжевым, а пятна нелистовых узлов - светло-голубыми.

Источник: http://csharphelper.com/blog/2016/08/draw-trees-vertically-or-horizontally-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *