【问题现象】
在一个panel的paint handler中绘制日历界面,尽管整个用户控件/窗口设置了双缓冲属性,但是还是会闪烁,
使用类似下面注释中的 画布中绘图也无济于事
private void MBCalendar_Grid_Paint(object sender, PaintEventArgs e)
{
//Panel pnl = sender as Panel;
//Bitmap bmp = new Bitmap(pnl.ClientSize.Width, pnl.ClientSize.Height);
//Graphics gph = Graphics.FromImage(bmp);
Graphics gph = e.Graphics;
【问题原因】
VS自带的System.Windows.Forms.Panel控件没有双缓冲功能
【解决方案】
写个继承System.Windows.Forms.Panel的控件替换日历控件中的刚刚出事的panel,搞定
namespace shiney.winform.skins.controls
{
/// <summary>
/// 这是一个支持双缓冲的Panel控件
/// </summary>
public partial class XPanel : Panel
{
#region Constructors
public XPanel():base()
{
setStyles();
}
#endregion
#region Private Methods
private void setStyles()
{
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
UpdateStyles();
}
#endregion
}
}