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