2013-01-02 72 views
2

在此圖片中... enter image description here ...您可以在每個「線條顏色」標籤旁邊看到有一個彩色圓圈。UserControl中的自定義控件無法正確呈現

在我的項目中,彩色圓圈是斯沃琪。下面是斯沃琪整個代碼文件:

public class Swatch : System.Windows.Forms.Panel 
{ 
    /*private int _Radius = 20; 

    [System.ComponentModel.Category("Layout")] 
    public int Radius 
    { 
     get { return _Radius; } 
     set { _Radius = value; } 
    } */ 
    private System.Drawing.Color _BorderColor = System.Drawing.Color.Transparent; 

    [System.ComponentModel.Category("Appearance")] 
    public System.Drawing.Color BorderColor 
    { 
     get { return _BorderColor; } 
     set { _BorderColor = value; } 
    } 

    private System.Drawing.Color _FillColor = System.Drawing.Color.Blue; 

    [System.ComponentModel.Category("Appearance")] 
    public System.Drawing.Color FillColor 
    { 
     get { return _FillColor; } 
     set { _FillColor = value; } 
    } 

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     System.Drawing.Rectangle RealRect = new System.Drawing.Rectangle(e.ClipRectangle.Location, e.ClipRectangle.Size); 
     RealRect.Inflate(-1, -1); 

     int Radius = Math.Min(RealRect.Size.Height, RealRect.Size.Width); 
     System.Drawing.Rectangle SqRect = new System.Drawing.Rectangle(); 
     SqRect.Location = RealRect.Location; 
     SqRect.Size = new System.Drawing.Size(Radius, Radius); 

     System.Drawing.Drawing2D.CompositingQuality PrevQual = e.Graphics.CompositingQuality; 
     using (System.Drawing.SolidBrush Back = new System.Drawing.SolidBrush(this.FillColor)) 
     { 
      using (System.Drawing.Pen Pen = new System.Drawing.Pen(new System.Drawing.SolidBrush(this.BorderColor))) 
      { 
       //e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
       e.Graphics.FillEllipse(Back, SqRect); 
       e.Graphics.DrawEllipse(Pen, SqRect); 
      } 
     } 

     e.Graphics.CompositingQuality = PrevQual; 
    } 

    public Swatch() 
    { 
     this.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, true); 
     this.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, true); 
     this.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, true); 
     this.SetStyle(System.Windows.Forms.ControlStyles.SupportsTransparentBackColor, true); 
     this.DoubleBuffered = true; 
    } 
} 

每一行是由一個TableLayoutPanel,標籤,斯沃琪控制和的NumericUpDown盒的用戶控件。

有大約10行,它們被放置在TableLayoutPanel中,它坐落在一個標籤控制一個TabPage的內部。標籤頁AutoScroll設置爲true,因此溢出會導致標籤頁滾動。

問題是當我運行應用程序並向上和向下滾動時,色板(彩色圓圈)撕裂並顯示各種工件,如上圖所示。我希望有乾淨的滾動,沒有渲染文物。

我使用SetStyle(這裏Painting problem in windows form建議)嘗試,但它沒有任何效果。

用戶控件(每行)有DoubleBuffered設置爲true,並且也沒有任何效果。

我擔心我錯過了一些相當明顯的東西。

回答

4

問題是,你計算基於剪切矩形的圓的半徑。所以當這條線只是部分可見時,會產生一個不好的值。

你應該基於真實的矩形,由基類提供的一個計算它,並讓它正常地修剪。

+0

非常感謝!這工作! – kevin628

相關問題