最近做一個軟件需要用到圖片操作,但是又不想用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;
}
}
以上就是這些了 ,成功解決了問題。
