Кто-нибудь имеет представление о том, как избавиться от мерцания?Я исследовал SO, Интернет и попробовал много разных вещей, таких как помещение TickerControl в панель с двойной буферизацией а-ля Двойная буферизация, когда не рисуется в OnPaint (): почему это не работает? и т. Д., Кромемного других вещей.Он по-прежнему мерцает не при каждом перекрашивании, а пару раз в секунду.
Кроме того, даже после удаления «g.Clear (BackColor)» в OnPaint что-то должно по-прежнему очищать фон, как текстпродолжает читать читабельно.
Здесь соответствующие части моего класса TickerControl:
class TickerControl : Control
{
private static readonly StringFormat stringFormat = new StringFormat(StringFormatFlags.NoWrap);
private const int padding = 40;
private const int scrollSleep = 10;
private const int scrollAdvancePixels = 1;
private float textWidth;
private float currentX;
private static readonly Timer scrollTimer = new Timer();
public TickerControl()
{
this.SetStyle(ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer
, true);
scrollTimer.Tick += AdvanceText;
scrollTimer.Interval = scrollSleep;
scrollTimer.Enabled = true;
}
private void AdvanceText(object sender, EventArgs e)
{
if (IsDisposed)
return;
currentX -= scrollAdvancePixels;
if (currentX <= -textWidth)
currentX = 0;
Invalidate();
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.Clear(BackColor);
using (SolidBrush brush = new SolidBrush(ForeColor))
{
g.DrawString(Text, Font, brush, currentX, 0, stringFormat);
g.DrawString(Text, Font, brush, currentX + textWidth, 0, stringFormat);
}
}
Любые идеи?
Обновление:
Поскольку sallushan предложил ручную двойную буферизацию, позвольте мне добавить, что я пробовал это раньше, используя код ниже.Но на экране это выглядит точно так же, как и выше, поэтому проблема, похоже, не в моем методе OnPaint.Я предполагаю, что это должно быть где-то в настройке моего Контроля.
private Bitmap backBuffer;
protected override void OnPaint(PaintEventArgs e)
{
if (backBuffer == null)
backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
Graphics g = Graphics.FromImage(backBuffer);
g.Clear(BackColor);
using (SolidBrush brush = new SolidBrush(ForeColor))
{
g.DrawString(Text, Font, brush, currentX, 0, stringFormat);
g.DrawString(Text, Font, brush, currentX + textWidth, 0, stringFormat);
}
g.Dispose();
e.Graphics.DrawImageUnscaled(backBuffer, 0, 0);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// Don't call base!
}
protected override void OnSizeChanged(EventArgs e)
{
if (backBuffer != null)
{
backBuffer.Dispose();
backBuffer = null;
}
base.OnSizeChanged(e);
}