继承的GroupBox具有OnPaint抖动

时间:2011-12-01 16:35:33

标签: c# winforms derived groupbox

我整个上午一直在寻找,不幸的是我不确定这个问题的技术术语是什么,所以我无法找到解决方案。

当我从GroupBox派生并覆盖onPaint函数时,组框将重新绘制在前面的组框之上。孩子正确控制绘画,只是组合框受到影响..

Screenshot

class ExtendedComponents
{
  public partial class extendedGroupBox : GroupBox
  {
    private Color borderColor;

    public extendedGroupBox()
    {
      this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ContainerControl, true);
      this.borderColor = Color.Black;
    }

    [NotifyParentProperty(true)]
    public Color BorderColor
    {
      get { return this.borderColor; }
      set { this.borderColor = value; Invalidate(); }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
      Size tSize = TextRenderer.MeasureText(this.Text, this.Font);

      Rectangle borderRect = e.ClipRectangle;
      borderRect.Y += tSize.Height / 2;
      borderRect.Height -= tSize.Height / 2;
      ControlPaint.DrawBorder(e.Graphics, borderRect, this.borderColor, ButtonBorderStyle.Dotted);

      Rectangle textRect = e.ClipRectangle;
      textRect.X += 6;
      textRect.Width = tSize.Width + 5;
      textRect.Height = tSize.Height;
      e.Graphics.FillRectangle(new SolidBrush(this.BackColor), textRect);
      e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), textRect);
    }
  }
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

简单的答案是不使用GroupBox控件 - 它本身就是闪烁的。

尝试使用Panel控件代替DoubleBuffer SetStyles等

对于您当前的实施,请勿使用e.ClipRectangle

//Rectangle borderRect = e.ClipRectangle;
Rectangle borderRect = this.ClientRectangle;

//Rectangle textRect = e.ClipRectangle;
Rectangle textRect = this.ClientRectangle;

答案 1 :(得分:1)

另外需要注意的是,您应该重写OnPaintBackground以避免闪烁。在那里你要么什么也不做或绘制控制前颜色。