用于 Visual C++ 的简单面向对象的 2D 图形框架?

Posted

技术标签:

【中文标题】用于 Visual C++ 的简单面向对象的 2D 图形框架?【英文标题】:Simple object-oriented 2D graphics framework for use in Visual C++? 【发布时间】:2009-02-03 10:15:59 【问题描述】:

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

我们真的是在重新发明***吗?

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

Direct2D 存在一些争议,Jonathan Blow 在这里有一篇关于它的愤怒博文:braid-game.com/news/?p=466 阻止它。就在每个人虽然赢了七场但都来救援的时候 感谢grapefrukt & Ctrl-Alt。 :) 是的,D2D 可能是某种东西,但在这种情况下,最好是基于 D2D 的框架?我不确定 D2D 是否比 GDI 更容易开发(即所需的代码更少)。 Johnathan Blow 提出的任何有效观点都完全消失在了咆哮中。他似乎更关心演示代码本身的结构和编码风格。 我以前曾与这些先生合作过——优秀的程序员。该博客条目提出了很多主张 - 我猜他们成功了。【参考方案2】:

也许有点矫枉过正,但请查看this。还有this

【讨论】:

啊,是的,一个简单的 SVG 库在这里可能会很有用。嗯,我可能会对此进行更多研究;***有一些有趣的外部链接。【参考方案3】:

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

【讨论】:

我认为更好地使用 *** 是将此信息添加到您的问题中,而不是作为另一个答案。【参考方案4】:

我相信你会选择一个 OO 包,但不要指望奇迹。 原因如下。

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

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

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

我有两个建议:

你在做什么

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

我使用的一种奇怪的方法:Differential Execution

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

【讨论】:

我完全明白你在说什么,因为我们基本上必须完成使用绘画程序和“blitting”图形的工作,因为你说的原因。我可以看看你建议的其他模型,因为简化的代码在这里变得非常重要。 @Jonas:如果我能提供任何帮助,请随时通过我的***用户页面直接与我联系。 对于 2D 像素图形,坦率地说我使用第一种方法。一些编码人员害怕图形并认为这很重要,因此他们在其上分层对象,认为这会使它变得更好。它使情况变得更糟。【参考方案5】:

“绘制对象并将它们连接在一起”的描述,听起来有点像 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 的自动绘图。同样,不确定它是否适合您的特定情况,但指出这一点似乎很有趣。

祝你好运!

【讨论】:

以上是关于用于 Visual C++ 的简单面向对象的 2D 图形框架?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio Express 2013 中面向初学者的 C++ 设置

Visual C++的简写是啥?

用于linux的c++ 2d绘图工具

面向 XP 的 Visual Studio 2013 的 Visual C++ 编译器标志

Sprite::create(“file.png”) 在 Cocos2d-x C++ Visual Studio 上返回 null

Visual C++和C++的区别