C# 我怎样才能在面板上画画,使它不会闪烁?

C# 我怎样才能在面板上画画,使它不会闪烁?,c#,winforms,visual-studio-2010,drawing,panel,C#,Winforms,Visual Studio 2010,Drawing,Panel,这是我的密码。当我把光标移到表格上时,圆圈在移动,但它在闪烁。我怎样才能解决这个问题 public partial class Preprocesor : Form { int x, y; Graphics g; public Preprocesor() { InitializeComponent(); } private void Preprocesor_Load(object sender, EventArgs e)

这是我的密码。当我把光标移到表格上时,圆圈在移动,但它在闪烁。我怎样才能解决这个问题

public partial class Preprocesor : Form
{
    int x, y;
    Graphics g;

    public Preprocesor()
    {
        InitializeComponent();
    }

    private void Preprocesor_Load(object sender, EventArgs e)
    {
        g = pnlMesh.CreateGraphics();
    }

    private void pnlMesh_Paint(object sender, PaintEventArgs e)
    {
        g.Clear(Color.White);
        g.FillEllipse(Brushes.Black, x, y, 10, 10);
    }

    private void pnlMesh_MouseMove(object sender, MouseEventArgs e)
    {
        x = e.X;
        y = e.Y;
        pnlMesh.Invalidate();
    }
}

您需要使用双缓冲控件

创建一个继承
控件
并在构造函数中设置的类(这是受保护的属性)。
使用该控件而不是您的面板,这样不会有任何闪烁

此外,您不应为以后存储
图形
对象。

相反,您应该在
绘制
处理程序中绘制
e.Graphics

覆盖面板用户控件并将
双缓冲
设置为true怎么样

public partial class BufferPanel : Panel
{
    public BufferPanel()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        UpdateStyles();
    }
}

塔克斯。行得通:)。除了我制作了继承
面板的控件
@Ichibann:除非你也在里面放置控件,否则你不应该使用面板;它只是增加了开销。+1只是一个小注释-在使用这个双缓冲区之前,我每次都会处理
e.Graphics
对象,这没有引起任何问题,但是当双缓冲区设置为true时,它导致没有绘制任何内容。删除了dispose,所有操作都像一个符咒。@ShadowWizard:除非文档告诉您,否则您不应该处理属于其他人的对象。@SLaks我不知道在编写原始代码时,直到您说了才确定,总是担心在幕后它会返回必须处理的新图形对象。可能是由于我的SharePoint背景-无论如何,感谢您的澄清。它是
BufferPanel
类,但具有
TransparentPanel
构造函数:p您为什么需要在此处创建
图形
?PaintEventArgs已经提供了图形方法。