Движение объекта с помощью PictureBox C#
Помогите, пожалуйста. Задание - нарисовать движующийся поезд.При наложении одного PictureBox над другим PictureBox и при его последующем движении с помощью таймера, рисунок нижнего PictureBox стирается. Как это исправить? Вот скрин:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Labaratornya_9
{
public partial class Form1 : Form
{
private int MaxX = 0;
private int MinX = 940;
private int Direct = 1;
public Form1()
{
InitializeComponent();
Timer t = new Timer();
t.Interval = 20;
t.Enabled = true;
t.Tick += (s, o) => { Move(); };
}
private void PictureBox1_Click(object sender, EventArgs e)
{
}
private void НарисоватьФонToolStripMenuItem_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
g.Clear(Color.White);
SolidBrush zemlya = new SolidBrush(Color.OliveDrab);
SolidBrush nebo = new SolidBrush(Color.DeepSkyBlue);
SolidBrush oblako = new SolidBrush(Color.White);
SolidBrush dom = new SolidBrush(Color.Gray);
Pen contur = new Pen(Color.Black);
SolidBrush contur2 = new SolidBrush(Color.DarkTurquoise);
SolidBrush okna = new SolidBrush(Color.Cyan);
SolidBrush dom2 = new SolidBrush(Color.DarkGoldenrod);
SolidBrush voda = new SolidBrush(Color.Blue);
// Рисует небо
g.FillRectangle(nebo, 0, 0,1200, 200);
// Рисует землю
g.FillRectangle(zemlya, 0, 200, 1200, 400);
// Контур
g.FillRectangle(contur2, 0, 200, 1200, 5);
// облака
g.FillEllipse(oblako, 110, 20, 90, 40);
g.FillEllipse(oblako, 150, 30, 110, 30);
g.FillEllipse(oblako, 100, 30, 90, 30);
g.FillEllipse(oblako, 590, 80, 90, 30);
g.FillEllipse(oblako, 610, 90, 90, 30);
g.FillEllipse(oblako, 550, 90, 110, 30);
g.FillEllipse(oblako, 890, 30, 110, 30);
g.FillEllipse(oblako, 930, 40, 90, 35);
g.FillEllipse(oblako, 850, 40, 110, 30);
// город слева
g.FillRectangle(dom, 0, 180, 70, 120);
g.DrawRectangle(contur, 0, 180, 70, 120);
for (int i = 10; i <= 60; i += 10)
{
for (int j = 10; j <= 100; j += 10)
{
g.FillRectangle(okna, 0 + i, 180 +j, 5, 5);
g.DrawRectangle(contur, 0 + i, 180 + j, 5, 5);
}
}
g.FillRectangle(dom, 50, 160, 70, 120);
g.DrawRectangle(contur, 50, 160, 70, 120);
for (int i = 10; i <= 60; i += 10)
{
for (int j = 10; j <= 100; j += 10)
{
g.FillRectangle(okna, 50 + i, 160 + j, 5, 5);
g.DrawRectangle(contur, 50 + i, 160 + j, 5, 5);
}
}
g.FillRectangle(dom, 30, 210, 70, 120);
g.DrawRectangle(contur, 30, 210, 70, 120);
for (int i = 10; i <= 60; i += 10)
{
for (int j = 10; j <= 100; j += 10)
{
g.FillRectangle(okna, 30 + i, 210 + j, 5, 5);
g.DrawRectangle(contur, 30 + i, 210 + j, 5, 5);
}
}
//Город справа
g.FillRectangle(dom2, 1050, 160, 70, 120);
g.DrawRectangle(contur, 1050, 160, 70, 120);
for (int i = 10; i <= 60; i += 10)
{
for (int j = 10; j <= 100; j += 10)
{
g.FillRectangle(okna, 1050 + i, 160 + j, 5, 5);
g.DrawRectangle(contur, 1050 + i, 160 + j, 5, 5);
}
}
g.FillRectangle(dom2, 1100, 180, 70, 120);
g.DrawRectangle(contur, 1100, 180, 70, 120);
for (int i = 10; i <= 60; i += 10)
{
for (int j = 10; j <= 100; j += 10)
{
g.FillRectangle(okna, 1100 + i, 180 + j, 5, 5);
g.DrawRectangle(contur, 1100 + i, 180 + j, 5, 5);
}
}
g.FillRectangle(dom2, 990, 210, 70, 120);
g.DrawRectangle(contur, 990, 210, 70, 120);
for (int i = 10; i <= 60; i += 10)
{
for (int j = 10; j <= 100; j += 10)
{
g.FillRectangle(okna, 990 + i, 210 + j, 5, 5);
g.DrawRectangle(contur, 990 + i, 210 + j, 5, 5);
}
}
// Озеро
g.FillEllipse(voda, 590, 280, 110, 30);
g.FillEllipse(voda, 590, 300, 130, 40);
g.FillEllipse(voda, 530, 290, 90, 35);
g.FillEllipse(voda, 650, 290, 110, 30);
// Рельсы
g.DrawLine(contur, 0, 400, 1200, 400);
g.DrawLine(contur, 0, 410, 1200, 410);
}
private void ВыйтиToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void ПуститьПоездToolStripMenuItem_Click(object sender, EventArgs e)
{
Graphics g = pictureBox2.CreateGraphics();
g.Clear(Color.Red);
}
private void Move()
{
var posPB = pictureBox2.Location;
if (posPB.X < MaxX)
{
Direct = 1;
}
else if (posPB.X > MinX)
{
Direct = -1;
}
pictureBox2.Location = new Point(posPB.X + Direct, posPB.Y);
}
}
}
Ответы (1 шт):
Автор решения: Ulysses
→ Ссылка
Попробуйте в конструкторе формы после InitializeComponent(); поставить строки
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
А в методе Move() в конец добавить
Refresh();
