| 最近做一个软件需要用到图片操作,但是又不想用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;
 }
 }
 以上就是这些了 ,成功解决了问题。
 |