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