c# WinForms绘图不查看



一个九岁的朋友给了我一个缓冲的想法:在绘图过程完成后查看绘图。他让我在一个用户看不见的图形(在这个例子中是一个面板)上画画。但当绘图过程完成后,绘图被应用在面板上。换句话说,这就像画了一幅画,直到画完才给任何人看。

我试过了。但我做错了。首先,我绘制一个仅声明的Panel(代码中没有行改变其属性)。之后,我尝试使用"gfx = RealPanel.CreateGraphics();"将新绘图应用于可见面板上。但这只会在面板上生成新的图形…是的,我做错了。我不知道怎样才能把它做好。

在我的例子中,有一个面板,在一个时刻被线条和正方形填满。该面板也属于另一个面板。第一个面板不能随整个窗口一起调整大小,但第二个面板可以。当面板2正在调整大小,它比面板1小,闪烁开始。第二个面板的自动滚动属性被设置为"true",当我滚动的时候也会闪烁。

请不要试图告诉我使用双缓冲。我尝试"解锁"面板的双重缓冲属性。我尝试了这里解释的所有方法:Winforms双重缓冲……对我来说没什么不同。我想试试这个主意。

那么,我怎样才能做好呢?

谢谢!

你永远不应该使用CreateGraphics

双缓冲面板应该解决这个问题。不要在"隐藏"面板上使用它。你应该去掉隐藏面板,然后使用新的面板控件。如果你仍然有闪烁的问题,那么你应该编辑你的问题并发布导致闪烁的代码。

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

如果你仍然想做你自己的"隐藏"双缓冲,那么你直接在你自己的位图上做:

Bitmap bm = new Bitmap(width, height);

然后像这样画:

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

在panel paint事件中,你所要做的就是:

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

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

panel1.Invalidate();

告诉你的程序去调用paint事件

最新更新