Глядя на опубликованный вами проект, мерцание действительно плохо, когда у вас выбрана первая вкладка с градиентными рамками группы. При отображении второй или третьей вкладки мерцание практически отсутствует.
![Your main form](https://i.stack.imgur.com/KJnGy.png)
Очевидно, что проблема связана с элементами управления, отображаемыми на этой вкладке. Быстрый взгляд на код для пользовательского заполненного градиентом класса группового блока выявляет более конкретную причину. Вы выполняете много действительно дорогостоящей обработки каждый раз, когда рисуете один из элементов управления группы. Поскольку каждый элемент управления groupbox должен перерисовываться каждый раз при изменении размера формы, этот код выполняется невероятно много раз.
Плюс , у вас задан фон элемента управления «Прозрачный», который необходимо подделать в WinForms, попросив родительское окно сначала нарисовать себя внутри окна элемента управления, чтобы получить фоновые пиксели. Контроль тогда рисует себя сверху этого. Это также более сложная задача, чем заливка фона элемента управления сплошным цветом, например SystemColors.Control
, и это заставляет вас видеть нарисованные пиксели формы во время изменения размера формы, прежде чем групповые блоки получат возможность закрасить себя.
Вот конкретный код, о котором я говорю, из вашего пользовательского класса элемента управления groupbox, заполненного градиентом:
protected override void OnPaint(PaintEventArgs e)
{
if (Visible)
{
Graphics gr = e.Graphics;
Rectangle clipRectangle = new Rectangle(new Point(0, 0), this.Size);
Size tSize = TextRenderer.MeasureText(Text, this.Font);
Rectangle r1 = new Rectangle(0, (tSize.Height / 2), Width - 2, Height - tSize.Height / 2 - 2);
Rectangle r2 = new Rectangle(0, 0, Width, Height);
Rectangle textRect = new Rectangle(6, 0, tSize.Width, tSize.Height);
GraphicsPath gp = new GraphicsPath();
gp.AddRectangle(r2);
gp.AddRectangle(r1);
gp.FillMode = FillMode.Alternate;
gr.FillRectangle(new SolidBrush(Parent.BackColor), clipRectangle);
LinearGradientBrush gradBrush;
gradBrush = new LinearGradientBrush(clipRectangle, SystemColors.GradientInactiveCaption, SystemColors.InactiveCaptionText, LinearGradientMode.BackwardDiagonal);
gr.FillPath(gradBrush, RoundedRectangle.Create(r1, 7));
Pen borderPen = new Pen(BorderColor);
gr.DrawPath(borderPen, RoundedRectangle.Create(r1, 7));
gr.FillRectangle(gradBrush, textRect);
gr.DrawRectangle(borderPen, textRect);
gr.DrawString(Text, base.Font, new SolidBrush(ForeColor), 6, 0);
}
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
if (this.BackColor == Color.Transparent)
base.OnPaintBackground(pevent);
}
И теперь, когда вы увидели код, красные предупреждающие флажки должны подняться. Вы создаете связку объектов GDI + (кисти, ручки, области и т. Д.), Но не можете Dispose
любой из них! Почти все этого кода следует обернуть в using
операторов. Это просто небрежное кодирование.
Выполнение всей этой работы стоит чего-то. Когда компьютер вынужден тратить так много времени на рендеринг элементов управления, другие вещи отстают. Вы видите мерцание, поскольку оно напрягается, чтобы не отставать от изменения размера. Он ничем не отличается от всего, что перегружает компьютер (например, вычисление значения числа пи), это просто очень легко сделать, когда вы используете столько пользовательских элементов управления, как здесь. Прозрачность сложна в Win32, как и многие другие трехмерные изображения. Это делает пользовательский интерфейс и неуклюжим для пользователя. Еще одна причина, по которой я не понимаю спешку от нативного контроля.
У вас действительно есть только три варианта:
- Разобраться с мерцанием. (Я согласен, это не очень хороший вариант.)
- Используйте разные элементы управления, например стандартные, встроенные. Конечно, они могут не иметь эффект градиента, но в любом случае это будет выглядеть наполовину сломанным, если пользователь настроит свою тему Windows. Также довольно сложно читать черный текст на темно-сером фоне.
- Измените код рисования в ваших пользовательских элементах управления, чтобы выполнять меньше работы. Возможно, вам удастся справиться с некоторыми простыми «оптимизациями», которые не будут стоить вам никаких визуальных эффектов, но я подозреваю, что это маловероятно. Это компромисс между скоростью и эффектом глаз. Бездействие всегда быстрее.