我怎么在link 2 static windows 里面加上main window 一行?

How do I link 2 static windows inside the main window with a line?

我必须编写 "logical scheme/diagram builder" 我决定在 WinApi 中编写代码,因为我认为这样会更容易,但现在我遇到了问题。

这就是我想要做的:

我已经成功完成了块(START、STOP 等)并以静态形式写入其中 windows,并且我已经成功模拟了拖放过程,但我我已经搜索了 6 个小时来寻找有关如何 link 有一条线的块的信息,即使在它们被移动之后,该线仍应 link 在两个块之间。

如果您需要,我可以 post 部分代码,它有 650 行,所以我决定不把它全部放在这里。

这是一个宽泛的问题,没有代码,我只能给你一般的指导。反正在这里写代码太费时间了(我已经开发了几个这样的图形工具)。

我了解到您可以使用 WinAPI 工作和绘图。所以你可以画出你想要 link 的两个块,因此你总是知道每个框的边界线的坐标。

一级

当您在两个块中添加一行 link 时,您需要跟踪源块和目标块。每次画图:

  • 您可以根据相关框的坐标动态计算线条的起点和终点。
  • 您可以通过选择每个框的最近边界来完成。在 STARTREAD X 之间的示例中,您将采用 START 框的底部边界(因此框坐标中的最高 y)和 READ X 框的顶部边界(所以盒子坐标中最小的 y)。
  • 从简单开始:始终取相关边界的中点,所以(smallest_x + largest_x)/2
  • 获得坐标后画线。

你现在会得到一条直线。这是一个好的开始。但是如果盒子没有对齐,它会很难看。

二级

下一步是将你的线分解成水平和垂直的子线。这稍微复杂一些:

  • 如果目标框的中间x超出右边界,或者在源框左边界之前,您将选择从右边界或左边界(中间)退出源。否则,您将通过框的底部或顶部边界退出(取决于最近的边界)。
  • 如果目标的中间y在源的上下y之间,您将通过目标框的左侧或右侧线中最近的一条线进入目标。否则最近的上一个或下一个。
  • 如果你有垂直水平边框的组合,只需从每个边框的中间开始画线(一竖一横)。
  • 如果你有两个相同方向的边界线的组合,如果它们的中间对齐,你就会有一条紧张的线。否则,您需要绘制三条线。

第三级

2 级将工作并为简单图表设置自动线,例如您所举的图表。如果它可能变得更复杂,你需要修改你的线模型并让用户决定路径。

这意味着最终用户可能会选择源框和目标框的那一侧,以及那一侧的位置。然后您需要将此信息存储在您的线对象中。线上的位置应按比例保持,以便在缩放图表时此信息不会过时。

用户可能还想选择将线分成水平和垂直分量的位置,甚至围绕和对象布置线。这意味着您可能还必须跟踪线对象中的这些中间点。

不过,我建议您不要从第 3 级开始,因为这不仅在绘图方面复杂得多,而且在设计允许用户 add/remove 这些行的用户界面方面也是如此设置。