避免油漆事件重叠,通过点击和拖动来制作拱形线?

时间:2008-10-18 21:19:47

标签: visual-c++ graphics gdi

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

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

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

提及:

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

2 个答案:

答案 0 :(得分:1)

一种可能的方法是允许用户抓住并拖动其中一条连接线的中点,这会将线分成两段(在两端连接)。这使事情变得简单并且避免了处理复杂曲线的需要,并且实现起来非常简单。你可以得到想象并允许额外细分线,所以最后一条线可以分成任意数量的子线。

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

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

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

  • 跟踪拖动操作的方法。这可能涉及“鼠标按下”,“鼠标移动”和“鼠标移动”。在拖动时,您将更新相关分段断点的坐标。

不幸的是,我认为基本的绘图/窗口系统在尝试检测彼此重叠的涂料时不会有太大用处。你可以自己做,但我同意你的想法,编码可能会很棘手和乏味。

最终产品可能如下所示:

http://www.misterfoo.com/data/link-demo.png

答案 1 :(得分:1)

如果要绘制曲线,请查看Windows GDI函数PolyBezier()

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