如何在Panel上绘制以使其不闪烁?

时间:2011-01-23 22:57:50

标签: c# winforms visual-studio-2010 drawing panel

这是我的代码。当我将光标移动到Form上时,圆圈正在移动,但它正在闪烁。我该如何解决这个问题?

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();
    }
}

2 个答案:

答案 0 :(得分:5)

您需要使用双缓冲控件。

创建一个继承Control并在构造函数中设置DoubleBuffered = true;的类(这是受保护的属性)。
使用该控件代替面板,它不会有任何闪烁。

此外,您不应该存储Graphics对象以供日后使用 相反,您应该在e.Graphics处理程序中使用Paint

答案 1 :(得分:4)

如何覆盖面板用户控件并将Doublebuffered设置为true?

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