【问题标题】:How can I draw on Panel so it does not blink?如何在 Panel 上绘图使其不闪烁?
【发布时间】:2011-01-23 22:57:50
【问题描述】:

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

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

【问题讨论】:

  • 为什么要在这里创建Graphics? PaintEventArgs 已经提供了一个图形方法。

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


【解决方案1】:

您需要在双缓冲控件上绘图。

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

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

【讨论】:

  • 谢谢。这样可行 :)。除了我做了继承Panel的控制
  • @Ichibann:除非你也在其中放置控件,否则你不应该使用面板;它只会增加开销。
  • +1 只是一个小评论 - 在使用这个双缓冲区之前,我曾经每次都处理 e.Graphics 对象,这没有引起任何问题,但是将双缓冲区设置为 true,它导致什么都没有画。删除了处置,所有的作品都像一个魅力..
  • @ShadowWizard:除非文档告诉您,否则您不应处置属于其他人的对象。
  • @SLaks 我不知道在编写原始代码时,直到您说出来才确定,总是担心在幕后它会返回必须处理的新 Graphics 对象。可能是因为我的 SharePoint 背景 - 无论如何,感谢您的澄清。
【解决方案2】:

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

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

【讨论】:

  • 它是BufferPanel 类但有TransparentPanel 构造函数:P
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 2016-03-19
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
相关资源
最近更新 更多