Как связать элементы управления, стиль Mind Mapping

Я пытаюсь создать Mind Mapping для приложения, над которым я работаю, где мне нужно связать прямоугольники линиями или стрелками.

Это то, что я до сих пор:

Что у меня пока

И вот чего я хотел бы добиться:


Я могу перемещать и изменять размеры блоков, но после нескольких дней испытаний и исследований я просто не могу понять, как заставить пользователя добавлять ссылки на блоки и пересчитывать линии и изменять их углы / длины, когда пользователь перемещает коробки вокруг.

Хотя часть этого приложения использует Direct2D, я не хочу сам начинать рендеринг блоков из-за нехватки времени.

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

Может ли кто-нибудь дать советы о том, как этого добиться или узнать о существующих компонентах, которые я мог бы использовать?

Спасибо!

2 ответа

Как грустно в комментариях Сертака Акюса, все, что вам нужно, это две контрольные точки, чтобы можно было провести черту.

И вы можете просто пойти и нарисовать линию на холсте родительского контроля над вашими ящиками с помощью команды LineTo.

Если мы посмотрим на ваш пример. Рисование линии между Box1 и Box2 может быть выполнено с использованием следующей процедуры:

//Move point to the bottom midle of the Box1
Parent.Canvas.MoveTo(Box1.Left+(Box1.Width div 2),Box1.Top+Box1.Height);
//Draw a line to the top middle of the Box2
Parent.Canvas.LineTo(Box2.Left+(Box2.Width div 2),Box2.Top);

Теперь вам нужно обратить особое внимание на то, какой из ваших контролов выше, чтобы ваша линия не обязательно пересекала ее, а только приводила к ее границе.

Вы могли бы даже немного упростить себе жизнь, просто нарисовав линию от центральной точки одной ячейки к центральной точке другой ячейки, вот так

//Move point to the center of first box
Parent.Canvas.MoveTo(Box1.Left+(Box1.Width div 2),Box1.Top+(Box1.Height div 2));
//Draw a line to the center point of second box
Parent.Canvas.LineTo(Box2.Left+(Box2.Width div 2),Box2.Top+(Box2.Height div 2));

Но это может выглядеть не так хорошо, как первый подход.

В любом случае с графиками разума рано или поздно вы, вероятно, столкнетесь с ситуацией, когда рисование прямых линий не будет достаточно богом.

В таких случаях вы хотели бы предложить поддержку для рисования изогнутых линий (атлетическое рисование S-кривых). С их помощью вы должны предоставить своему пользователю возможность правильно настроить их так, чтобы они не пересекали другие поля. Но это требует от пользователя способности выбирать конкретную строку и затем настраивать ее определенные свойства.

Другой продвинутый подход, который вы можете использовать, - это автоматическое рисование кривой. Такой подход использует алгоритм нахождения пути в фоновом режиме, чтобы найти несколько опорных точек, представляющих возможный путь линии, а затем возможность визуализировать шипы Catmul-Rom через эти опорные точки.

К сожалению, я не могу предложить вам примеры кода для этого продвинутого подхода, поскольку я все еще пытаюсь реализовать его самостоятельно.

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

Поскольку это будет внутренний редактор, нет необходимости в расширенном рисовании или управлении линиями.

Затем я решил нарисовать сглаженные линии, которые TCanvas не поддерживает, поэтому я установил Graphics32 и с помощью LineToAS() линии выглядели великолепно.

Но после ознакомления с демоверсией TMS Diagram Studio необходимость изобретать это колесо исчезает. Кажется, в нем есть все, что мне нужно, а потом и немного.

Спасибо всем за комментарий!

Другие вопросы по тегам