private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
int i = 100;
while (i < 280)
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
Thread.Sleep(10);
i++;
if (i == 279)
{
while (i > 100)
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
Thread.Sleep(10);
i--;
}
}
}
g.Dispose();
}
Проблема перерисовки картинки в GDI
Предпологаю, что это из-за бесконечного цикла, но чем можно заменить. Даже если без цикла, всё равно картинка не перерисовывается
Код:
Любая отрисовка должна происходить только внутри OnPaint()-обработчика формы. По нажатию на кнопку вы должны просто вызвать событие перерисовки, изменив только перед этим ту информацию, исходя из которой происходит отрисовка.
Спасибо, попробую разобраться
Код:
protected override void OnPaint(PaintEventArgs e)//вывод графики
{
Graphics g = e.Graphics;
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
base.OnPaint(e);
g.Dispose();
}
public void Paint()
{
i+=10;
Invalidate();
Thread.Sleep(1000);
i+=10;
}
private void button1_Click(object sender, EventArgs e)
{
Paint();
}
{
Graphics g = e.Graphics;
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
base.OnPaint(e);
g.Dispose();
}
public void Paint()
{
i+=10;
Invalidate();
Thread.Sleep(1000);
i+=10;
}
private void button1_Click(object sender, EventArgs e)
{
Paint();
}
Обновите форму после вызова Invalidate(). Метод Refresh() или Update() называется, не помню по памяти.
Код:
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
int i = 100;
while (i < 280)
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
Thread.Sleep(10);
i++;
}
while (i > 100)
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
Thread.Sleep(10);
i--;
}
g.Dispose();
};
{
Graphics g = this.CreateGraphics();
int i = 100;
while (i < 280)
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
Thread.Sleep(10);
i++;
}
while (i > 100)
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(100, 20, 200, 400));
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(i, 20, 20, 20));
Thread.Sleep(10);
i--;
}
g.Dispose();
};
Обращу внимание: не стоит рисовать прямо на форме. Лучше добавить на форму панель, и рисовать уже на ней. Потому что, когда в дальнейшем захочется модернизировать программку, добавить, например, меню, какие-то кнопочки, то может оказаться, что часть игрового поля закрывается новыми компонентами. И придётся пересчитывать координаты. А если рисовать на панели, то достаточно будет просто немного передвинуть панель.
Код в другом сообщении, имхо, бред. Что там должно происходить - хз.
Ещё замечание: если вы не создавали объект Graphics самостоятельно, то не нужно его диспозить. To есть для e.Graphics внутри OnPaint вызывать Dispose() не нужно!
Всё, вроде разобрался. Спасибо за помощь.