c++ - 如何用一条线链接主窗口内的 2 个静态窗口?
问题描述
我必须编写一个“逻辑方案/图表构建器”,我决定在 WinApi 中编写它,因为我认为它会更容易,但现在我遇到了问题。
这就是我想要做的:
我已经设法做块(开始,停止等)并在它们中写入,作为静态窗口,我已经设法模拟拖放过程,但我已经搜索了 6 个小时以获取有关信息我如何将块与线连接起来,即使它们被移动后,线仍应在两个块之间链接。
如果您需要,我可以发布部分代码,它有 650 行,所以我决定不把它全部扔在这里。
解决方案
这是一个广泛的问题,没有代码,我只能给你一般的指导。反正这里写代码太费时间了(我已经开发了好几个这样的图形工具了)。
我了解您可以使用 WinAPI 工作和绘图。因此,您可以绘制要链接的两个块,因此您始终知道每个框的边界线的坐标。
第一级
当您添加一条连接两个块的线时,您需要跟踪源块和目标块。每次绘制图表时:
- 您可以根据相关框的坐标动态计算线条的起点和终点。
- 您可以通过选择每个框的最近边界来做到这一点。在您的示例中
START
,READ X
您将采用 START 框的底部边界(因此框坐标中的最高 y)和框的顶部边界READ X
(因此框坐标中的最小 y)。 - 开始简单:总是取相关边界的中点,所以
(smallest_x + largest_x)/2
- 一旦你有了坐标画线。
你现在会得到一条直线。这是一个好的开始。但是如果盒子没有对齐,它会看起来很难看。
第二级
接下来是将您的线条分解为水平和垂直子线。这稍微复杂一些:
- 如果目标框的中间 x 超出右边框,或者在源框的左边框之前,您将选择通过右边框或左边框(中间)退出源。否则,您将通过框的底部或顶部边框退出(取决于最近的)。
- 如果目标的中间 y 在源的上下 y 之间,您将通过目标框的最左边或右边的线进入目标。否则最接近上层或下层。
- 如果您有垂直水平边框的组合,只需从每个边框的中间开始绘制线条(一个垂直,一个水平)。
- 如果您有两个相同方向的边框的组合,如果它们的中间对齐,您将有一条应变线。否则,您需要绘制三条线。
三级
第 2 级将工作并为简单图表设置自动线,例如您所拥有的图表。如果它可能变得更复杂,您需要修改您的线模型并让用户决定路径。
这意味着最终用户可以选择框源和目标框的一侧,以及该侧的位置。然后,您需要将此信息存储在您的线对象中。线上的位置应保持成比例,以便在缩放图表时此信息不会过时。
用户可能还想选择在哪里将线分成水平和垂直分量,甚至将线绕到对象周围。这意味着您可能还必须跟踪线对象中的这些中间点。
但是,我建议您不要从级别 3 开始,因为这要复杂得多,不仅在绘图中,而且在设计允许用户添加/删除这些线条设置的用户界面时。
推荐阅读
- vim - 不要在 (neo)vim 中使用 scrolloff=5 进行鼠标点击
- angular - 什么是相当于 setTimeout() 的 Typescript / Angular 7(异步)
- ionic-framework - 我的键盘输入无法在 Ionic 4 中提交表单
- curl - 未经授权使用 curl/postman 使用 Microsoft Graph 日历 API
- node.js - npm 错误!在“.../openpgpjs.org\r\n\r\”附近解析时 JSON 输入意外结束
- html - 当我在 chrome 开发工具中点击切换设备时,我不能让容器响应
- ibm-mobilefirst - WL.Clinet.connect - 抛出错误 - CONNECTION_IN_PROGRESS
- php - 从句子中删除除选定单词之外的单词
- symfony - 交响乐;服务“pathauto.verbose_messenger”依赖于不存在的服务“messenger”
- python - 添加边缘权重以从邻接矩阵中绘制 networkx 中的输出