2010-09-11 72 views
3

我有一個自定義控制,其中我重寫下面的方法來建立一個透明的背景:透明度繪製化合物層,而不是重繪

protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 

在塗料的方法,即時通訊做這樣的:

protected override void OnPaint(PaintEventArgs p) 
    { 
     base.OnPaint(p); 
     Graphics e = p.Graphics; 
     this.Size = Resources.CenterButtonHover.Size; 
     if (mousedown) 
     { 
      e.DrawImage(Resources.CenterButtonDown, new Point(0, 0)); 
     } 
     else if (hover) 
     { 
      e.DrawImage(Resources.CenterButtonHover, new Point(0, 0)); 
     } 
     else 
     { 
      e.DrawImage(Resources.CenterButtonNormal, new Point(4, 4)); 
     } 
     e.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
    } 

並在調用this.Invalidate的各種鼠標事件上。

透明度渲染正確,但每次渲染都會渲染到最後一次渲染的頂部而不是重繪。這會使輝光變得越來越激烈,直到它變成一個大斑點。我該如何解決?

回答

2

我解決了這個問題,保留了一個bool,以確定在重新繪製之前是否需要刪除梯度。

 if (needsreset) 
     { 
      this.SuspendLayout(); 
      this.Region = new Region(this.ClientRectangle); 
      needsreset = false; 
      return; 
     }