Опитвам се да направя анимация в Win Forms и опитах различен подход от извикването на Invalidate() в манипулатора timer_elapsed и след това правя неща в OnPaintHandler.
Просто рисувам директно изображение върху pictureBox, след което, когато timer_тиктака, извиквам Invalidate и след това ръчно преначертавам изображението на актуализирана позиция.
static void tmrMoving_Elapsed(object sender, EventArgs e, Train t)
{
MainForm.playBox.Invalidate();
g.DrawImage(t.components[i], new Rectangle(
new Point(t.nextVagoonPositionX * 20, t.nextVagoonPositionY * 20),
new Size(20, 20)));
t.nextVagoonPositionX += 1;
t.nextPositionX = -1;
}
Имам проблем, че когато таймерът тиктака, желаното изображение понякога се изчертава, а понякога не, като 30% шанс да не нарисува (имам интервали на таймера от 1 секунда, така че мога да го видя), дори ако обектът се движи или просто намирайки се на едно и също място.
Неща, които съм пробвал:
1. Задаване на регион в Invalidate() args -> изображението беше начертано много пъти до по-старите изображения (така че не беше пребоядисано на желаното място, тъй като старите изображения останаха на местата си)
2. Извикване на Update() или Refresh() или и двете след invalidate-> Никога не е показвано изображение
3. Комбиниране на Update() или Refresh() или и двете с Invalidate(правоъгълна област) -> никога не се показва изображение
4. Задаване на DoubleBuffering true -> няма ефект
5. Игра с this.SetStyle(ControlStyles.UserPaint, true); -> няма ефект (дори не съм сигурен какво прави между другото.)