Унаследованный GroupBox имеет дрожание OnPaint - PullRequest
1 голос
/ 01 декабря 2011

Я искал все утро и, к сожалению, я не уверен, что такое технический термин для этой проблемы, поэтому я не могу найти разрешение.

Когда я наследую от 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 ]

2 голосов
/ 01 декабря 2011

Простой ответ - не использовать элемент управления GroupBox - он по своей сути флик.

Попробуйте вместо этого использовать элемент управления Panel с установленными стилями DoubleBuffer и т. Д.

Для текущей реализации не используйте e.ClipRectangle:

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

//Rectangle textRect = e.ClipRectangle;
Rectangle textRect = this.ClientRectangle;
1 голос
/ 01 декабря 2011

Еще одна вещь, на которую следует обратить внимание, это то, что вы должны переопределить OnPaintBackground, чтобы избежать мерцания. Там вы либо ничего не делаете, либо рисуете контроль над цветом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...