[英]How do I double buffer a Panel?
我有一个面板,上面有一个轮盘赌,我需要对面板进行双重缓冲,以使其停止闪烁。 谁能帮我吗?
编辑:
是的,我试过了。
panel1.doublebuffered 不存在,只有 this.doublebuffered。 而且我不需要缓冲表单,只需要缓冲面板。
您需要从Panel或PictureBox派生。
这取决于您选择启用缓冲的方式。
如果你设置this.DoubleBuffer标志,那么你应该没问题。
如果您手动更新样式,则必须在WM_PAINT中自己绘制表单。
如果你真的有野心,你可以维护和绘制自己的后台缓冲区作为位图。
using System.Windows.Forms;
public class MyDisplay : Panel
{
public MyDisplay()
{
this.DoubleBuffered = true;
// or
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
}
}
另一种方法是使用InvokeMember方法调用doublebuffered成员:
typeof(Panel).InvokeMember("DoubleBuffered", BindingFlags.SetProperty
| BindingFlags.Instance | BindingFlags.NonPublic, null,
panel2, new object[] { true });
通过这种方式,您不必创建子类
您可以在派生的Panel
类中公开DoubleBuffered
-Property:
public class DoubleBufferedPanel : Panel
{
[DefaultValue(true)]
public new bool DoubleBuffered
{
get
{
return base.DoubleBuffered;
}
set
{
base.DoubleBuffered = value;
}
}
}
Winform面板具有DoubleBuffered属性 。
编辑:我应该注意到它受到了保护。 其他人已经描述了如何对它进行分类。 :)
只是扩展User79775的答案,如果你想在VB.net中实现这个,那就这样做:
Imports System.Windows.Forms
Public Class MyDisplay
Inherits Panel
Public Sub New()
Me.DoubleBuffered = True
' or
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
UpdateStyles()
End Sub
End Class
我和你遇到了完全一样的困境。 我在 C# WinForm 中放置了一个面板,并将其用作几何动画的显示区域。 由计时器触发的多次重绘操作,再加上偶尔调整窗口大小,都导致该面板闪烁得非常厉害。 其他解决方案似乎都依赖于激活DoubleBuffered
标志,但这对我的经验没有任何影响。
正确的方法是使用System.Drawing.BufferedGraphics
类并在您的应用程序中利用它。
这个例子有点矫枉过正,因为它至少突出了两种在翻转图形缓冲区之前执行渲染的方法; 你只需要在你的实现中保留你喜欢的那个。
我个人选择将 Panel 子类化为一个新的DoubleBufferedPanel
类。 我只是使用基本面板的Paint()
方法结合对Refresh()
的调用来翻转缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.