Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Графика и анимация в С#


Автор: Wardena 13.9.2006, 21:46
Привет, Ребята, разбираюсь тут с шарпом и натолкнулась на следующие проблемы:
1) рисую на PictureBox но не могу сделать так что картинка выводилась сразу при старте программы, пробовала писать в событии формы Load, но ничего не вышло, вобщем долго мучала, скажите где прописывать надо плиз.
2) рисую используя класс Graphics:
            Graphics grfx = Picturebox.CreateGraphics();
            grfx.Clear(Color.Black);
            ................
там дальше все прописано как и что рисовать, но у меня программка связана с анимацией, то есть происходит вызов этой процедуры и каждый раз картинка перерисовывается, всявязи с этим появляется вопрос о том как убрать мерцание, пробовала создавать массив типо PictureBox[] pages = new PictureBox[2];
и в цикле писать так Picturebox = pages[page]; где page меняется от 0 до 1 при каждой перерисовке, получаю пустой экран... скажите плиз как надо...
3) скажем имею нарисованую картинку, нажимаю Alt+TAB то есть перевожу на рдугое окно, потом созваращаюсь в окно с программой и там все стерлатЬ, я дельфи я использовала событие OnPaint а тут событие Paint вообще непонятно как работает... вот...
Help Me Plz   smile 

Автор: reloni 13.9.2006, 21:52
Цитата(Wardena @  13.9.2006,  22:46 Найти цитируемый пост)
3) скажем имею нарисованую картинку, нажимаю Alt+TAB то есть перевожу на рдугое окно, потом созваращаюсь в окно с программой и там все стерлатЬ, я дельфи я использовала событие OnPaint а тут событие Paint вообще непонятно как работает... вот...

Переопределить функцию OnPaint нужно так:
Код

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }

В него впихивать уже всю перерисовку формы.

Автор: Wardena 13.9.2006, 22:31
так все, остается вопрос только с мерцанием =)

Автор: stab 14.9.2006, 02:51
Простейший вариант: создать свой контрол на основе PictureBox и выставить у него DoubleBuffered в true. Двойная буферизация как раз таки избавляет от мерцания, но замедляет перерисовку и увеличивает расход памяти, т.к. сначала рисуется в оффскрин битмап, а уже потом этот битмап рисуется на контроле.

Код

public class MyPictureBox: PictureBox
{
    public MyPictureBox()
    {
        DoubleBuffered = true;
    }
}


В принципе, чтобы ты не придумал, схема работы мало будет отличаться от уже реализованной в фреймворке двойной буферизации. Так что, юс ит энд энджой.   smile 

Автор: Wardena 14.9.2006, 03:55
в начале написала:
        public class MyPictureBox : PictureBox
        {
            public MyPictureBox()
            {
                DoubleBuffered = true;
            }
        }
затем 
        this.Picturebox = new System.Windows.Forms.PictureBox();
заменила на
        this.Picturebox = new MyPictureBox();
дальше ничего не меняла в коде программы и мерцание не исчезло, что-то в коде самом надо прописывать чтоли, както настраивать что-то, чередовать буфферы, или это все автомарически? МСДН про этот дабл буффер говорит что это какаято новая финча дот нет фреймворка 2, объясните плиз в кратце что не так...

Автор: stab 14.9.2006, 05:51
вот пример:

Код

namespace Animation
{
    public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int w;
        private int h;

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.Clear(Color.WhiteSmoke);
            e.Graphics.DrawEllipse(Pens.Blue, 0, 0, w, h);
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            w = 0;
            h = 0;

            for (int i = 0; i < 50; i++)
            {
                w += pictureBox1.Width / 50;
                h += pictureBox1.Height / 50;

                pictureBox1.Refresh();
                System.Threading.Thread.Sleep(10);
            }
        }
    }

    public class MyPictureBox: PictureBox
    {
        public MyPictureBox()
        {
            DoubleBuffered = true;
        }
    }
}

попробуй его запустить с DoubleBuffered = true и DoubleBuffered = false, разницу сразу заметишь.


Цитата(reloni @  14.9.2006,  01:52 Найти цитируемый пост)
Переопределить функцию OnPaint нужно так:
...
В него впихивать уже всю перерисовку формы.

достаточно повесить обработчик на событие Paint.

Автор: Naum 14.9.2006, 09:34
Цитата(Wardena @  14.9.2006,  04:55 Найти цитируемый пост)
МСДН про этот дабл буффер говорит что это какаято новая финча дот нет фреймворка 2, объясните плиз в кратце что не так...


Не знаю у меня 1 Framework и 2003 студия. и все время работала, если например рисую на форме, то все время пишу в OnLoad'е (только это  VB)
Код

Me.SetStyle(AllPaintingInWmPaint, true)
Me.SetStyle(UserPaint, true)
Me.SetStyle(DoubleBuffer, true)
.

Насчет SetStyle можно посмотреть http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemwindowsformscontrolstylesclasstopic.asp

Добавлено @ 09:37 
То есть у тебя по идее должно исчезнуть мерцание после

Код

this.PictureBox.SetStyle(DoubleBuffer,true);

Автор: mr.DUDA 14.9.2006, 16:13
Для второго фреймворка работает этот код:
Код
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

Автор: Wardena 17.9.2006, 09:48
Все спасибо ребят огромное, дабл буфер заработал, разобралась =) сори что долго не отвечала просто другие дела были, а щас возвращаюсь в КГ) буду дальше дерзать, если какие вопросы еще возникнут тута отпишу, всем респект =)

Автор: HUJG 6.7.2007, 11:34
Сорри что поднимаю старую тему.
Кто нибудь писал графику для КПК .NET Compact Framework 2.0? Там по каким то причинам у формы нет метода SetStyle. Как в этом случае организовать буферизацию?

Автор: MiBBiM 23.7.2009, 12:08
+1

Автор: OrionRussia 16.9.2010, 10:10
Я сделал по образцу программку, на форме движется объект(возможно НЛО), при достижении границы он повторно вылетает из той же стороны. Как сделать так, чтобы он менял направление движения при достижении границы? Долетел до границы, развернулся, обратно полетел.

Автор: CYBERDREAM 16.9.2010, 10:20
Шаг смещения меня на отрицательный, и потом обратно, ну и т.д.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)