C#WinForms绘图没有查看

时间:2011-09-28 13:11:54

标签: c# winforms system.drawing

九个朋友给了我一个缓冲的想法:在绘图过程完成后查看图纸。他告诉我画一个图形(在这种情况下是一个面板),对用户来说是不可见的。但是当绘图过程完成时,绘图将应用于面板。换句话说,就像在没有向任何人展示图片之前画画,直到它完成。

我试了一下。但我做错了。首先,我绘制一个仅声明的面板(代码中没有更改其属性的行)。之后,我尝试使用“gfx = RealPanel.CreateGraphics();”在可见面板上应用新绘图。但这只会在面板上制作一个新的图形...是的,我做错了。我不知道该怎么做。

在我的情况下,有一个面板在一瞬间充满了线条和方块。该面板也属于另一个面板。第一个面板不能与整个窗口一起调整大小,但第二个面板可以。当面板编号2调整大小并且小于面板编号1时,闪烁开始。第二个面板的自动滚动属性设置为“true”,当我滚动时也会出现闪烁。

请不要试图告诉我使用双缓冲。我尝试了“解锁”面板的双缓冲属性。我尝试了这里解释的所有方法:Winforms Double Buffering ...不会让我有任何不同。我想尝试这个想法。

那么,我该怎么做呢?

谢谢!

1 个答案:

答案 0 :(得分:4)

您永远不必使用CreateGraphics

双缓冲面板应该解决这个问题。不要在“隐藏”面板上使用它。您应该摆脱隐藏的面板,只需使用新的面板控件。如果您仍然有闪烁问题,那么您应该编辑您的问题并发布导致过滤的代码。

public class PanelEx : Panel
{
  public PanelEx()
  {
    this.DoubleBuffered = true;
  }
}

如果您仍想进行自己的“隐藏”双缓冲,那么您可以直接在自己的位图上进行操作:

Bitmap bm = new Bitmap(width, height);

然后像这样做你的画:

using (Graphics g = Graphics.FromImage(bm))
{
  //Draw stuff
}

在Panels绘画活动中,您所做的只是:

private void panel1_Paint(object sender, PaintEventArgs e)
{
  e.Graphics.DrawImage(bm, 0, 0);
}

当您需要更新屏幕时,只需使面板无效:

panel1.Invalidate();

会告诉你的程序调用paint事件。