用于Visual C+;的简单面向对象二维图形框架+;? 我们正在构建一个通过VisualC++应用程序(MFC)中的GUI可视化连接组件的方法。简单的事情,比如点击框,在连接的框之间画线,并存储信息。问题是,我们自己在GDI中从头开始做这一切,它很快就变成了需要维护的大量代码

用于Visual C+;的简单面向对象二维图形框架+;? 我们正在构建一个通过VisualC++应用程序(MFC)中的GUI可视化连接组件的方法。简单的事情,比如点击框,在连接的框之间画线,并存储信息。问题是,我们自己在GDI中从头开始做这一切,它很快就变成了需要维护的大量代码,c++,visual-c++,graphics,mfc,2d,C++,Visual C++,Graphics,Mfc,2d,我们真的在重新发明轮子吗 我已经在web上查找了提供面向对象的2D框架的组件(矢量图形在这里很有趣)。面向对象,即屏幕上的正方形在代码中是正方形对象,或者至少可以在图形对象上存储自定义信息。它应该支持在代码中检索对象位置等信息,以便在对象之间画线,并检测鼠标是否在对象上 不是很复杂的事情,但是如果有成百上千的行需要维护,那么就变得非常复杂和难以维护了,因为所有的行都是你自己写的,更不用说可能会有bug潜入,这在一个成熟的框架中是可以避免的。你有没有看过direct2d,它有点像gdi的替代品 也

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

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


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

你有没有看过direct2d,它有点像gdi的替代品

也许杀伤力太大了,但还是去看看吧。而且作为一个看起来很有用的SVG库(感谢Malkocglu的想法!),我发现了这个:。代码示例的简单性看起来很棒;我唯一剩下的问题是让用户与其生成的SVG图形交互。:/顺便说一句,它甚至不包括渲染器,更不用说与它的图形交互的方法了。我不确定我是否愿意自己开发一个SVG解析器来控制这些需求。但是,以编程方式构建图形的代码简单性看起来正是我所追求的。嗯。

我肯定你会使用OO包,但不要期待奇迹。 原因如下

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

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

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

我有两个建议:

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

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

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

另一种可能适合这一用途的产品(尽管价格不菲)是Visio——微软Office Visio SDK(请参阅)据说相当丰富

然而,我没有从程序员的角度来看fig或Visio,因此我不知道底层代码是什么样子,也不知道它是否适合您的目的。。。但我认为它们都是灵感的良好起点。也许还有另一个图形库可能适合您的目的

顺便说一句,当我在这里闲逛(呃,谷歌搜索)的时候,我偶然发现了AGD——自动图形绘制。再一次,我不确定它是否适合你的特殊情况,但它似乎足够有趣地指出了这一点


祝你好运

关于Direct2D有一些争议,Jonathan Blow在这里发表了一篇愤怒的博文:DAM it。就在win seven的所有人都来拯救的时候(grapefrukt&Ctrl-Alt.:)是的,D2D可能是某种东西,但在这种情况下,可能更倾向于基于D2D的框架?我不确定D2D比GDI更容易开发(也就是说,所需的代码更少)。Johnathan Blow的任何有效观点都会在这场咆哮中完全消失。他似乎更关心演示代码本身的结构和编码风格。我以前和这些先生一起工作过——优秀的程序员。这篇博客文章提出了很多主张——我猜他们成功了。啊,是的,一个简单的SVG库在这里可能会很有用。嗯,我可能会更深入地研究这个问题;Wikipedia有一些有趣的外部链接。我认为Stackoverflow的更好用途是将这些信息添加到您的问题中,而不是作为另一个答案。我完全明白您的意思,因为我们基本上必须使用绘制例程,并根据您陈述的原因“快速”显示图形。我可以看看你建议的其他模型,因为简化代码在这里变得非常重要。@Jonas:如果我能提供任何帮助,请随时通过我的wikipedia用户页面直接与我联系。对于2D像素图形,坦白地说,我使用第一种方法。一些程序员害怕图形,认为这是一件大事,所以他们在上面分层对象,认为这会使它变得更好。这让情况变得更糟。