.NET WINFORM 日历控件在panel中进行gdi绘制闪烁问题

【问题现象】

在一个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
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值