Унаследованные Groupbox имеют паутины
Вопрос
Я искал все утро, и, к сожалению, я не уверен, что такое Techincal Term для этой проблемы, поэтому я не могу найти резолюцию.
Когда я выхожу из Groupbox и переопределяю функцию OnPaint, Groupboxes перерывывают себя переоценивают предыдущие Groupbox. Ребенок управляет краской правильно, только Groupbox затронут ..
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);
}
}
}
Любая помощь приветствуется!
Решение
Легкий ответ- не использовать управление GroupBox- он по своей сути скатится.
Попробуйте вместо этого использовать управление панелью с помощью DoubleBuffer SetStyles и т. Д.
Для вашей текущей реализации не используйте e.ClipRectangle
:
//Rectangle borderRect = e.ClipRectangle;
Rectangle borderRect = this.ClientRectangle;
//Rectangle textRect = e.ClipRectangle;
Rectangle textRect = this.ClientRectangle;
Другие советы
Еще одна вещь, которую следует отметить, это то, что вы должны отменять на платеж, чтобы избежать мерцания. Там вы либо ничего не делаете, либо рисуете цвет управления.