0

我正在尝试为我正在处理的应用程序创建思维导图外观,我需要将框与线或箭头链接起来。

这是我到目前为止所拥有的:

到目前为止我所拥有的

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

在此处输入图像描述
我可以移动和调整框的大小,但是经过几天的试验和研究,我只是不知道如何让用户添加到框的链接并重新计算线条并在用户移动时更改它们的角度/长度周围的盒子。

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

我打算使用 VirtualTreeView 恢复到视觉效果较差的 TreeView,但我希望我可以让它工作。

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

谢谢!

4

2 回答 2

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));

但这可能看起来不如第一种方法那么好。

不管怎样,使用思维导图迟早你可能会遇到画直线不够神的情况。

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

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

不幸的是,我无法为您提供这种高级方法的任何代码示例,因为我仍在尝试自己实现它。

于 2015-02-13T20:11:51.270 回答
0

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

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

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

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

感谢大家的评论!

于 2015-02-13T20:36:53.907 回答