【问题标题】:Avoiding overlapping of paint events, arching lines through click and drag?通过单击和拖动避免绘制事件的重叠、拱形线?
【发布时间】:2010-09-17 22:51:26
【问题描述】:

我目前是一名学生,正在尝试设计一个 Visual C++ 应用程序,以允许我直观地插入一个有向图,以便使用该图的矩阵创建一个文本文件。此时,我创建了一个 onClick 事件来创建节点,并使用表单的 Paint 事件来绘制节点。我还插入了条件以避免节点重叠。

我目前正在创建节点之间的链接。我遇到的问题是连接两个节点的线穿过另一个节点。我认为编写一个算法来检测重叠并计算线条需要弯曲多少以避免在这种情况下过于繁琐。

因此,我考虑创建一条可由用户通过单击并向左或向右拖动来弯曲的线,但是我在查找有关如何执行此操作的任何教程时遇到了问题。因此,如果有人不得不在项目中引入这种拱形线,或者知道我可以在哪里找到有关这方面的一些信息,我将不胜感激。

提及:

  1. 请不要推荐任何花哨的图形库来执行此操作,因为我对为此程序安装 3rd 方的东西不感兴趣。我要插入代码的函数名为 form1_onPaint,所以我想严格遵守 C++ 标准库。
  2. 我知道我说过我有兴趣通过单击和拖动来拱起一条线,但是如果有人可以提出另一种可行的解决方案,例如检测 onPaint 事件中的重叠或任何其他可能有用的功能来解决这将有很大的帮助。

【问题讨论】:

    标签: visual-c++ graphics gdi


    【解决方案1】:

    如果你想画曲线,那么看看Windows GDI函数PolyBezier()

    创建一个包含四个点的数组:第一个点和最后一个点应该是端点,即您连接两个点的节点。两个中间点应该是相同的,并且应该是曲线的“点”,即你用鼠标拖动的位置。

    【讨论】:

    • 很高兴知道,我以前从未使用过那个。如果提问者使用表单,则这个的 winforms 版本是 Graphics.DrawBezier。
    【解决方案2】:

    一种可能的方法是允许用户抓住并拖动其中一条连接线的中点,这会将连接线分成两段(在末端连接)。这使事情变得简单,避免了处理复杂曲线的需要,而且实现起来也很简单。您可能会喜欢并允许对行进行额外的细分,因此单行最终可以分成任意数量的子行。

    关于这样做需要什么的一些基本想法:

    • 线段和定义端点的各个点的表示。您可以为一端存储一个点,为每个中间分段断点存储一个点,为另一端存储一个最终点。

    • 一种跟踪光标所在位置的方法,这样当它接近一条线的中点时,您可以准备抓取并拖动该线以将其分割。 “鼠标移动”事件将在其中发挥作用。不确定您使用的是哪个工具包,或者我会更具体地说明事件的名称 - 它可能是 onMouseMove。

    • 一种跟踪拖动操作的方法。这可能涉及“鼠标向下”、“鼠标移动”和“鼠标向上”。拖动时,您将更新相关线段断点的坐标。

    不幸的是,我认为基本的绘图/窗口系统在尝试检测相互重叠的油漆方面没有多大用处。您可以自己完成,但我同意您的想法,即编写代码可能既棘手又乏味。

    最终产品可能如下所示:


    (来源:misterfoo.com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-30
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多