3

我们正在构建一种通过 Visual C++ 应用程序 (MFC) 中的 GUI 以可视方式连接组件的方法。简单的事情,例如单击框并在连接的框之间画线,并在其上存储信息。问题是我们在 GDI 中从头开始自己制作所有这些,并且很快就需要维护大量代码。

我们真的在这里重新发明轮子吗?

我在网上四处寻找提供面向对象的 2D 框架的组件(矢量图形在这里很有趣)。面向对象的意思是屏幕上的正方形是代码中的正方形对象,或者至少您可以在图形对象上存储自定义信息。它应该支持在代码中检索对象位置等信息以在对象之间画线,并检测鼠标是否在对象上。

不是很复杂的事情,但是如果仅仅因为你自己写了所有的代码就需要维护成百上千行,那么它就会变得非常复杂和难以维护,更不用说潜在的 bug 潜入,这在成熟的环境中是可以避免的框架。

4

5 回答 5

2

也许矫枉过正,但看看这个。还有这个

于 2009-02-03T12:17:30.433 回答
2

你有没有看过direct2d,它是gdi的替代品。http://blogs.technet.com/thomasolsen/archive/2008/10/29/introducing-the-microsoft-direct2d-api.aspx http://msdn.microsoft.com/en-us/library/dd370990(VS .85).aspx

于 2009-02-03T10:28:33.227 回答
0

我相信你会选择一个 OO 包,但不要指望奇迹。这就是为什么。

我假设您从一些应用程序数据开始,一组应用程序对象,我们称它们为对象 A。

您可以使用一个 OO 图形对象包来表示对象 A 的图形视图,将这组新的对象称为 G。

现在你有两组对象,A 和 G,其中任何一组都可以动态变化,你面临着保持它们正确对应的问题。不仅要从 A 生成 G,还要在 A 变化时修改 G,在 G 变化时修改 A。这需要大量事件驱动的链接代码,而且您永远无法确定您已经正确处理了每个案例。您很容易陷入所见即所得的情况。(所见即所得)

我有两个建议:

  • 你在做什么

有一个直接渲染对象 A 的“绘制”例程(如果要避免闪烁,请使用“blt”)。将简单的图形信息附加到对象 A,例如屏幕位置和大小。自己处理鼠标事件,用于突出显示、拖动、创建连线等。这可能看起来很麻烦,但它避免了您在使用冗余对象集时遇到的所有链接问题。而且,您可以完全控制代码。

这是管理冗余对象集的通用技术。然而,它有一个艰难的学习曲线。大多数程序员都无法做到这一点,但它确实减少了代码并保证了正确性。

于 2009-02-03T13:57:22.323 回答
0

“绘制对象并将它们连接在一起”的描述听起来有点像 Fig (xfig / winfig / et al) 处理的东西。

另一个可能适合此目的的产品(尽管有一定的价格)是 Visio——Microsoft Office Visio SDK(参见http://office.microsoft.com/en-us/visio/HA101656401033.aspx)据说非常丰富。

但是,从程序员的角度来看,我既没有看过 fig 也没有看过 Visio,所以我不知道底层代码是什么样的,也不知道它是否适合你的目的……但我认为它们都是很好的灵感起点。也许那里有另一个图形/图形库可能适合您的目的。

顺便说一句,在对此进行搜索(呃,谷歌搜索)时,我偶然发现了 AGD - http://www.ads.tuwien.ac.at/research/graphDrawing.html上的自动绘图。同样,不确定它是否适合您的特定情况,但指出它似乎很有趣。

祝你好运!

于 2009-02-07T07:40:00.037 回答
0

作为一个看起来很有用的 SVG 库(感谢 Malkocoglu 的想法!),我找到了这个:libboard。代码示例的简单性看起来很棒;我剩下的唯一问题就是让用户与其生成的 SVG 绘图进行交互。:/ AFAIK,它甚至不包括渲染器,更不用说与其绘图交互的方法了。我不确定我是否愿意自己开发一个 SVG 解析器来控制这些需求。但是以编程方式构建图形的代码简单性看起来正是我所追求的。唔。

于 2009-02-03T13:16:16.183 回答