【问题标题】:GDI+ Tearing! VB.NETGDI+ 撕裂! VB.NET
【发布时间】:2011-09-19 03:09:07
【问题描述】:

我对 Graphic 对象有疑问。我有一个循环,它通过一些数组并从中获取图像并将它们绘制在图片框上。每件事都很好,但是当我尝试调整大小或绘制另一件更重的东西时,每件事都开始闪烁,就像他们在绘画时一样。我知道画那些该死的东西太重了!但是有什么办法可以避免撕裂?

谢谢。

编辑:

我的代码:

graphic.Clear(frmmain.Workspace.BackColor)
For i = 0 To mObjectsList.Count - 1
  graphic.DrawImage(mObjectsList(i).oGraphic, mObjectsList(i).oX, mObjectsList(i).oY, mObjectsList(i).oWidth, mObjectsList(i).oHeight)
Next

【问题讨论】:

  • 您想与我们分享任何代码以加强您的描述,因为您现在谈论一些对我来说毫无意义的 GDI+ 撕裂
  • 好的,既然您已经展示了一些代码,我有几个问题: 1. graphic 是什么,您如何获取对它的引用? 2.mObjectsList 列表的大小是多少? 3.这段代码在哪里执行?
  • 好的。 graphic 是我从图片框 Graphic 对象创建的变量。 mObjectsList 太大了!我的意思是它可以存储你想要多少项目。图片框的Paint事件中执行的代码。

标签: vb.net gdi+


【解决方案1】:

graphic 是我从图片框 Graphic 对象创建的变量

图片框没有 Graphic 对象。 不要使用它的 CreateGraphics() 方法。无论你画什么,它都只会在屏幕上停留几分之一秒,几乎没有出现过。请改为在 Paint 事件处理程序中使用 e.Graphics。这将绘制到双缓冲位图中。 PictureBox 始终将其 DoubleBuffered 属性设置为 true。当 Paint 事件完成时,该位图被绘制。这就是为什么您的对象会闪烁,它们会再次被该位图透支。

【讨论】:

  • 你又来了!谢谢。是的,我的意思是 CreateGraphic 方法而不是对象。顺便说一句,我想在另一个函数中使用 e.Graphic,我通过一个变量得到它,但是使用这个变量运行的第一个代码给出了错误。我不知道,我可能会以一种糟糕的方式使用它。我定义了一个公共变量,在绘画中我像这样分配它 mWorkspaceGraphic = e.Graphics 然后在运行时,第一个代码 mWorkspaceGraphic.Clear(...) 给出我的错误Parameter is not valid.
  • 嗯,当然,三个点不是一个有效的参数。不确定您希望我如何对异常进行逆向工程,我只能猜测 CreateGraphics。只需将 e.Graphics 作为参数传递给任何想要进行任何绘图的方法。将其存储在变量中是一个坏主意,它仅在 Paint 事件运行时才有效。在那之后尝试使用它会很糟糕。重新迭代:仅在绘制事件中绘制。如果您有理由重绘某些内容,请调用控件的 Invalidate() 方法。这使得 Paint 事件运行。最终。
  • 对不起,关于这三个点,它只是 frmmain.Workspace.BackColor。我知道你在说什么,但我希望能够从任何地方调用我的绘图函数。这样,我应该只使用 Paint 事件来获取e.Graphics。那么,有什么解决办法吗?
  • 再次重复:您可以从任何地方调用 Invalidate()。这意味着“用户现在看到的不是最新的,应该重新绘制”。并且 Windows 最终符合“现在没有更重要的事情需要做,哎呀,让我们生成 Paint 事件”。这与“用户恢复了窗口”或“用户正在将另一个窗口拖过你的窗口”没有什么不同。它生成由窗口管理器触发的 Paint 事件。您需要编写代码,以便 Paint 事件在所有这些情况下忠实地再现场景。
  • 我想你没有明白我的意思。我说如果我想使用 e.Graphics 我应该把它交给我的函数drawObjects(e.Graphics) 但我只能得到 e.Graphics In paint 事件,如果我想从命令按钮单击事件中调用我的 drawObject例如,我不能使用drawObjects(e.Graphics) 因为我需要e.Graphics,它在paint event 中而不是在here。所以我该怎么做?我只想获取 e.Graphics。
猜你喜欢
  • 2014-05-23
  • 2011-04-04
  • 2012-06-15
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
相关资源
最近更新 更多