九个朋友给了我一个缓冲的想法:在绘图过程完成后查看图纸。他告诉我画一个图形(在这种情况下是一个面板),对用户来说是不可见的。但是当绘图过程完成时,绘图将应用于面板。换句话说,就像在没有向任何人展示图片之前画画,直到它完成。
我试了一下。但我做错了。首先,我绘制一个仅声明的面板(代码中没有更改其属性的行)。之后,我尝试使用“gfx = RealPanel.CreateGraphics();”在可见面板上应用新绘图。但这只会在面板上制作一个新的图形...是的,我做错了。我不知道该怎么做。
在我的情况下,有一个面板在一瞬间充满了线条和方块。该面板也属于另一个面板。第一个面板不能与整个窗口一起调整大小,但第二个面板可以。当面板编号2调整大小并且小于面板编号1时,闪烁开始。第二个面板的自动滚动属性设置为“true”,当我滚动时也会出现闪烁。
请不要试图告诉我使用双缓冲。我尝试了“解锁”面板的双缓冲属性。我尝试了这里解释的所有方法:Winforms Double Buffering ...不会让我有任何不同。我想尝试这个想法。
那么,我该怎么做呢?
谢谢!
答案 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事件。