Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Графика и анимация в С# 
:(
    Опции темы
Wardena
Дата 13.9.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыфтик =)



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.9.2006
Где: Уфа

Репутация: нет
Всего: нет



Привет, Ребята, разбираюсь тут с шарпом и натолкнулась на следующие проблемы:
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 
PM MAIL ICQ   Вверх
reloni
Дата 13.9.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 10.5.2006
Где: Москва

Репутация: 3
Всего: 4



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

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

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

В него впихивать уже всю перерисовку формы.
PM MAIL ICQ   Вверх
Wardena
Дата 13.9.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыфтик =)



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.9.2006
Где: Уфа

Репутация: нет
Всего: нет



так все, остается вопрос только с мерцанием =)

Это сообщение отредактировал(а) Wardena - 13.9.2006, 22:36
PM MAIL ICQ   Вверх
stab
Дата 14.9.2006, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



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

Код

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


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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Wardena
Дата 14.9.2006, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыфтик =)



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.9.2006
Где: Уфа

Репутация: нет
Всего: нет



в начале написала:
        public class MyPictureBox : PictureBox
        {
            public MyPictureBox()
            {
                DoubleBuffered = true;
            }
        }
затем 
        this.Picturebox = new System.Windows.Forms.PictureBox();
заменила на
        this.Picturebox = new MyPictureBox();
дальше ничего не меняла в коде программы и мерцание не исчезло, что-то в коде самом надо прописывать чтоли, както настраивать что-то, чередовать буфферы, или это все автомарически? МСДН про этот дабл буффер говорит что это какаято новая финча дот нет фреймворка 2, объясните плиз в кратце что не так...
PM MAIL ICQ   Вверх
stab
Дата 14.9.2006, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



вот пример:

Код

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.



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Naum
Дата 14.9.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(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 можно посмотреть здесь.

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

Код

this.PictureBox.SetStyle(DoubleBuffer,true);



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 14.9.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



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



--------------------
user posted image
PM MAIL WWW   Вверх
Wardena
Дата 17.9.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыфтик =)



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.9.2006
Где: Уфа

Репутация: нет
Всего: нет



Все спасибо ребят огромное, дабл буфер заработал, разобралась =) сори что долго не отвечала просто другие дела были, а щас возвращаюсь в КГ) буду дальше дерзать, если какие вопросы еще возникнут тута отпишу, всем респект =)
PM MAIL ICQ   Вверх
HUJG
Дата 6.7.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) HUJG - 6.7.2007, 11:38
PM MAIL   Вверх
MiBBiM
Дата 23.7.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 11.7.2009

Репутация: нет
Всего: нет



+1
PM MAIL   Вверх
OrionRussia
Дата 16.9.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.8.2010

Репутация: нет
Всего: нет



Я сделал по образцу программку, на форме движется объект(возможно НЛО), при достижении границы он повторно вылетает из той же стороны. Как сделать так, чтобы он менял направление движения при достижении границы? Долетел до границы, развернулся, обратно полетел.
PM MAIL   Вверх
CYBERDREAM
Дата 16.9.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Шаг смещения меня на отрицательный, и потом обратно, ну и т.д.


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.