首页 > 解决方案 > 如何用一条线链接主窗口内的 2 个静态窗口?

问题描述

我必须编写一个“逻辑方案/图表构建器”,我决定在 WinApi 中编写它,因为我认为它会更容易,但现在我遇到了问题。

这就是我想要做的:

图片

我已经设法做块(开始,停止等)并在它们中写入,作为静态窗口,我已经设法模拟拖放过程,但我已经搜索了 6 个小时以获取有关信息我如何将块与线连接起来,即使它们被移动后,线仍应在两个块之间链接。

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

标签: c++algorithmwinapilinediagram

解决方案


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

我了解您可以使用 WinAPI 工作和绘图。因此,您可以绘制要链接的两个块,因此您始终知道每个框的边界线的坐标。

第一级

当您添加一条连接两个块的线时,您需要跟踪源块和目标块。每次绘制图表时:

  • 您可以根据相关框的坐标动态计算线条的起点和终点。
  • 您可以通过选择每个框的最近边界来做到这一点。在您的示例中STARTREAD X您将采用 START 框的底部边界(因此框坐标中的最高 y)和框的顶部边界READ X(因此框坐标中的最小 y)。
  • 开始简单:总是取相关边界的中点,所以(smallest_x + largest_x)/2
  • 一旦你有了坐标画线。

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

第二级

接下来是将您的线条分解为水平和垂直子线。这稍微复杂一些:

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

三级

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

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

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

但是,我建议您不要从级别 3 开始,因为这要复杂得多,不仅在绘图中,而且在设计允许用户添加/删除这些线条设置的用户界面时。


推荐阅读