C#自定义控件操作图片时图片闪烁问题的解决方案


最近做一个软件需要用到图片操作,但是又不想用PictureBox,所以使用了自定义控件直接操作图片文件的移动,过程中遇到了一个问题:图片移动时闪烁,最终解决方案如下(有使用过其他方法比如下面Code中注释的部分,结果没有解决):

1)在自定义控件中打开控件双缓存,用到DoubleBuffered属性,设置其值为true,

2)重写控件的OnPaint()事件,

3)不要频繁调用Graphics的Clear清除、Draw绘制,这样肯定会闪烁,最佳方案是先把需要绘制的东西都画到一个Bitmap上缓存起来,然后再重写的OnPaint()事件中调用一次Graphics.DrawImage()即可

以上详见下面Code:

class DogControl : Control
   {
       public Image FromImage { get; set; }

       public DogControl()
       {
           this.DoubleBuffered = true;
       }

       protected override void OnPaint(PaintEventArgs e)
       {
           base.OnPaint(e);

           this.Size = new Size(this.FromImage.Width + 1, this.FromImage.Height + 1);

           using (Bitmap bitmap = GenerateImage(FromImage))
           {
               e.Graphics.DrawImageUnscaled(bitmap, 0, 0);
           }
       }

       //网上查到这个方法,直接通过Windows消息去解决,但是没有搞定

       //protected override void WndProc(ref Message m)
       //{
       //    if (m.Msg == 0x0014)//禁掉清除背景消息
       //    {
       //        return;
       //    }
       //    base.WndProc(ref m);
       //}

       protected override void OnLocationChanged(EventArgs e)
       {
           base.OnLocationChanged(e);
           this.Invalidate();
           this.Update();
       }

       private Bitmap GenerateImage(Image image)
       {
           Bitmap bitmap = new Bitmap(image.Width + 0x01, image.Height + 0x01);
           using (Graphics gp = Graphics.FromImage(bitmap))
           {
               gp.DrawImage(image, 0, 0, image.Width, image.Height);
           }
           return bitmap;
       }
   }
以上就是这些了 ,成功解决了问题。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM