c# - 面板双缓冲

标签 c# winforms panel system.drawing double-buffering

可以通过将“AllPaintingInWmPaint”、“UserPaint”和“DoubleBuffer”ControlStyles 的值设置为“true”来实现整个表单的双缓冲(this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles .DoubleBuffer, true)).

但这不会发生在 System.Windows.Forms.Panel 上,因为类不允许我这样做。我找到了一个解决方案:http://bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control .我也试过这个:Winforms Double Buffering .它很慢,即使它被用在一张小图上,我有一些我在表单和其他东西中使用的自定义资源,因此我不会把整个表单变成一张图。第二个似乎会引起问题。还有其他方法吗?

我问这个是因为我不希望面板上的绘图在调整表单大小时一直闪烁。如果有一种无需双缓冲即可消除闪烁的方法,我将很高兴知道。

最佳答案

如果不需要滚动支持,请使用 PictureBox,默认情况下它是双缓冲的。获得双缓冲的可滚动面板非常简单:

using System;
using System.Windows.Forms;

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

ResizeRedraw 赋值抑制了容器控件的绘画优化。如果您在面板中进行任何绘画,您将需要它。没有它,当您调整面板大小时,绘画会弄脏。

双缓冲实际上会使绘画变慢。这会对稍后绘制的控件产生影响。它们在被填充之前留下的空洞可能会在一段时间内可见,也被视为闪烁。您会在 this answer 中找到针对该影响的对策。 .

关于c# - 面板双缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7569471/

相关文章:

c# - 用填充索引替换字符

c# - 在控件完成绘制之前显示表单

winforms - 无法更新数据库,因为数据库是只读的

java - 如何防止 JDialog 在 gnome-panel(Linux) 中显示?

java - 绘图板尺寸

C#(asp net mvc) - 如何从 Controller 或 jquery 中的字符串中删除转义字符?

c# - ASP.Net MVC 返回 Json 作为 IActionResult 修改对象键名

c# winforms - 在模式窗体之间传递参数

r - 每个公司每个月的最后观察 (R)

c# - 无法添加实体类型 'X' 的种子实体,因为没有为所需属性 "..ID"提供值