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