如何链接控件,Mind Mapping样式

时间:2015-02-13 16:56:20

标签: delphi vcl mindmap

我正在尝试为我正在处理的应用程序创建一个Mind Mapping外观,我需要用线条或箭头链接框。

这是我到目前为止所做的:

What I have so far

这就是我想要实现的目标:

enter image description here
我可以移动和调整框的大小,但经过几天的试验和研究,我只是无法弄清楚如何让用户添加链接到框并重新计算线条,并在用户移动时更改其角度/长度周围的盒子。

即使此应用程序的一部分使用Direct2D,但由于时间限制,我不想自己开始渲染这些框。

我将使用VirtualTreeView恢复到不那么直观的TreeView,但我希望我能让它工作。

有人可以提供有关如何完成此操作或了解我可以使用的现有组件的提示吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

由于Sertac Akyus在评论中感到悲伤,所有你需要的是两个能够画线的参考点。

您可以使用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));

但这可能不如第一次接近那样好。

Anywhay迟早会有心智图,你可能会遇到画直线不够神的情况。

在这种情况下,您可能希望为绘制曲线提供支持(S曲线的SPORTSast绘图)。有了这些,您需要为您的用户提供调整它们的能力,以便他们不会穿越其他盒子。但这要求用户能够选择特定的行,然后调整它的某些属性。

您可能想要使用的另一种高级方法是自动曲线绘制。这种方法使用背景中的寻路算法来找到代表有效线路径的多个参考点,然后通过这些参考点渲染Catmul-Rom刺。

很遗憾,我无法为您提供此高级方法的任何代码示例,因为我仍然在尝试自己实现它。

答案 1 :(得分:0)

我最终要自己画箭头了。我所做的是在控件下放置一个TImage,并在控件的锚点之间绘制箭头。

由于这将是一个内部编辑器,因此不需要高级绘图或线路管理。

然后我决定绘制抗锯齿线,TCanvas不支持,所以我安装了Graphics32并使用LineToAS()线看起来很棒。

但是在看完TMS Diagram Studio演示之后,重新发明这个轮子的需求正在消退。它似乎包含了我需要的一切,然后是一些。

感谢大家的评论!