Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема перерисовки картинки в GDI

43K
15 декабря 2011 года
YPotapych
24 / / 06.12.2009
Только начал изучать графику. Всё получается, но стоит нажать мышью во время работы или переместить окно, всё виснет.

Предпологаю, что это из-за бесконечного цикла, но чем можно заменить. Даже если без цикла, всё равно картинка не перерисовывается


Код:
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();

        }
278
15 декабря 2011 года
Alexander92
1.1K / / 04.08.2008
Любая отрисовка должна происходить только внутри OnPaint()-обработчика формы. По нажатию на кнопку вы должны просто вызвать событие перерисовки, изменив только перед этим ту информацию, исходя из которой происходит отрисовка.
43K
15 декабря 2011 года
YPotapych
24 / / 06.12.2009
Спасибо, попробую разобраться
43K
16 декабря 2011 года
YPotapych
24 / / 06.12.2009
Всё равно не получается, появилась новая проблема, в функции Paint должно сперва увеличиться значение i, потом вызваться перерисовка, потом пауза, а потом ещё прибавить 10. А получается сначала пауза, потом увеличение i сразу на 20.


Код:
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();
        }
278
16 декабря 2011 года
Alexander92
1.1K / / 04.08.2008
Обновите форму после вызова Invalidate(). Метод Refresh() или Update() называется, не помню по памяти.
297
16 декабря 2011 года
koodeer
1.2K / / 02.05.2009
YPotapych, что должен делать код из первого сообщения? Прямоугольник должен проехать в одну сторону, а потом вернуться? Тогда так:
Код:
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 самостоятельно, то не нужно его диспозить. To есть для e.Graphics внутри OnPaint вызывать Dispose() не нужно!
43K
17 декабря 2011 года
YPotapych
24 / / 06.12.2009
Всё, вроде разобрался. Спасибо за помощь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог