Я хотел разработать лейбл, который бы отображал текст в режиме постепенного появления.Я ожидаю, что мне нужно обработать рисование, так что, по сути, еще несколько пикселей добавляются справа на каждой итерации.Тем не менее, я столкнулся с препятствием и не могу заставить работать анимацию.Вот что у меня есть:
class RevealLabel : System.Windows.Forms.Label
{
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
const int GradWidth = 7;
Rectangle r = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y,
GradWidth, e.ClipRectangle.Height);
GraphicsPath p = new GraphicsPath();
using (SolidBrush bs = new SolidBrush(this.ForeColor))
{
using (LinearGradientBrush bg = new LinearGradientBrush(new Rectangle(0, 0, GradWidth, e.ClipRectangle.Height),
this.ForeColor,
this.BackColor,
LinearGradientMode.Horizontal))
{
for (int i = 0; i < e.ClipRectangle.Width; i += GradWidth)
{
r.X = i;
p.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, this.Font.Size,
r, StringFormat.GenericDefault);
e.Graphics.FillPath(bg, p);
e.Graphics.Flush();
long TickStop = DateTime.Now.AddSeconds(0.2).Ticks;
while (DateTime.Now.Ticks < TickStop)
{
System.Windows.Forms.Application.DoEvents();
}
e.Graphics.FillPath(bs, p);
}
}
}
e.Graphics.Flush();
}
}
Не уверен, что я на правильном пути, потому что это просто ужасный беспорядок.Беспорядок, который даже не выводится на экран постепенно, а скорее обрабатывает все в фоновом режиме, а затем обновляет экран только с конечным результатом.
Итак, мой вопрос двоякий:
Как правильно отобразить область пикселей / прямоугольников, которую я буду добавлять справа на каждой итерации?
Как получить ее для обновленияна экран на каждом розыгрыше, а не просто комок после завершения?
(Примечание: я также пытался рисовать в фоновом потоке, но продолжал получать ArgumentException, я думаю, потому что объект Graphics вышел из используемого состояния вскоре после выхода из метода обработчика рисования.)