如何在主窗口内用线链接2个静态窗口? [关闭]

问题描述 投票:-1回答:1
我必须编写一个“逻辑方案/图表生成器”,并且我决定在WinApi中这样做,因为我认为这样会更容易,但是现在我遇到了问题。

这是我想做的:

image

我已经设法完成了这些块(START,STOP等)并将其作为静态窗口写入其中,并且我已经对拖放过程进行了模拟,但是我一直在搜索6个小时,有关如何用一条线链接这些块的信息,即使在移动了两个块之后,该行仍应链接在该块之间。

如果需要,我可以张贴代码的某些部分,它有650行,所以我决定不将其全部放在此处。

c++ algorithm winapi line diagram
1个回答
1
投票
这是一个广泛的问题,没有代码,我只能给您一般指导。无论如何,在这里编写代码会太浪费时间(我已经开发了几种这样的图形工具)。

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

第一级

添加链接两个块的行时,需要跟踪源块和目标块。每次绘制图表时:

    您将根据相关框的坐标动态计算线的起点和终点。
  • 您可以通过选择每个框的最接近边界来完成。在STARTREAD X之间的示例中,您将采用START框的底部边界(因此,框坐标中的y最高)和READ X框的顶部边界(因此框坐标)。
  • 简单开始:始终取相关边界的中间点,因此(smallest_x + largest_x)/2
  • 一旦有了坐标就画线。
  • 您现在将获得一条直线。这是一个好的开始。但是,如果框未对齐,则外观将很难看。

    第二级

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

      如果目标框的中间x超出源框的右边界,或者在源框的左边界之前,则您将选择通过右边界或左边界(中间)退出源。否则,您将通过框的底部或顶部边框退出(取决于最接近的框)。
  • 如果目标的中间y在源的上部y和下部y之间,则将通过目标框的左行或右行的最接近位置输入小部件。上一个或下一个的最接近的一个。
  • 如果您有垂直水平边框的组合,则只需从每个边框的中间画一条线(一个垂直,一个水平)。
  • 如果您有两个方向相同的合并,如果它们的中间对齐,则会有一条拉紧线。否则,您将需要绘制三条线。
  • 第三级

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

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

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

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

  • © www.soinside.com 2019 - 2024. All rights reserved.