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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двойная буферизация в C# 
:(
    Опции темы
CyraxZ
Дата 29.6.2007, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создаётся форма. На ней (или на панели) что-то рисуем. Затем перетаскиваем форму за пределы экрана, затем выдвигаем обратно. При этом скрытая часть формы/панели очищается. Требуется перерисовка. В обработчике OnPaint перерисовываем рисунок на форме/панели. Но при этом появляются страшные тормоза.
Как организовать перерисовку формы/панели без тормозов ?  Т.е. необходимо плавное выдвижение формы из-за экрана и т.п. Необходимо сделать так, как это происходит в Windows.
Сохранение части экрана в памяти ?  Двойная буферизация ? или что-то другое...
PM MAIL   Вверх
stab
Дата 29.6.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



http://forum.vingrad.ru/act-Search/CODE/sh...ered/index.html

поиск - удобная штука.


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


Опытный
**


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

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



Цитата

Затем перетаскиваем форму за пределы экрана, затем выдвигаем обратно. При этом скрытая часть формы/панели очищается. Требуется перерисовка. В обработчике OnPaint перерисовываем рисунок на форме/панели. Но при этом появляются страшные тормоза.

Разве на это как-то повлияет двойная буферизация ?  Собственно, на тормоза (при перерисовке в процессе выдвижения формы из-за границы экрана) двойная буферизация никак не повлияла...
Как по мне, тут нужна не двойная буферизация, а сохранение в памяти скрываемой за экраном части формы (bitmap)...
Как это реализовано в виндовых формах ?
PM MAIL   Вверх
CyraxZ
Дата 4.8.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как в стандартных формах реализована отрисовка части изображения, оказавшейся за пределами экрана, при выдвижении формы из-за экрана ?
Явно не перерисовка всех элементов формы. Как-то через сохранение bitmap'а...
PM MAIL   Вверх
tdebugger
Дата 6.8.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну верно, рисуешь на битмапе и по мере необходимости сбрасываешь на экран.
 Подмечен интересный факт: если в дотнете первой версии для безмерцательного вывода изображения лучше всего битмап с оным присваивать свойству BackgroundImage контрола, то во второй версии подойдет более логически понятный DrawImage графикса.
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
CyraxZ
Дата 14.8.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно ли пустой битмап получить сразу из объекта Graphics, чтобы не вычислять размеры ?
PM MAIL   Вверх
Naum
Дата 15.8.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(CyraxZ @  14.8.2007,  20:01 Найти цитируемый пост)
Можно ли пустой битмап получить сразу из объекта Graphics, чтобы не вычислять размеры ?

Нет, Graphics, в принципе, кроме хандла объекта больше ничего об объекте не знает.


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


Шустрый
*


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

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



Может опять чего не допонял - обычно Graphics получают из битмапа, да и размеры вычислить не долго:
Код

Bitmap btBitmap=new Bitmap(this.label1.Width,this.label1.Height);
Graphics btGraphBack=Graphics.FromImage(btBitmap);

--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
Idsa
Дата 16.8.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(tdebugger @  16.8.2007,  06:31 Найти цитируемый пост)
Может опять чего не допонял - обычно Graphics получают из битмапа, да и размеры вычислить не долго:

Это когда рисуют на самом bitmap'е. CyraxZ же рисует на форме/панели.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tdebugger
Дата 17.8.2007, 10:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так о том и речь - рисуешь на битмапе, а в OnPainte сбрасываешь его на контрол.И ни каких мерцаний и тормозов. Рисовать в памяти наверно быстрее, чем на устройстве? 
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
Idsa
Дата 17.8.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(tdebugger @  17.8.2007,  10:26 Найти цитируемый пост)
Рисовать в памяти наверно быстрее, чем на устройстве?  

smile Панель - это не устройство, а такой же объект в памяти, как и Bitmap.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tdebugger
Дата 17.8.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



...вот они последствия ООП ... вот что такое абстракция ... люди уже не различают разницы между контекстом устройства и памятью...


--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
Alek86
Дата 24.8.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(tdebugger @  17.8.2007,  10:26 Найти цитируемый пост)
Так о том и речь - рисуешь на битмапе, а в OnPainte сбрасываешь его на контрол


вопрос не совсем в тему. Как его сбросить? какой функцией?


--------------------
user posted image    user posted image
PM MAIL   Вверх
tdebugger
Дата 25.8.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если .NET второй , то примерно вот так:
Код

        Bitmap btBac;
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if(btBac!=null) 
                e.Graphics.DrawImage(btBac, 0,0);
        }

Не рекомендую делать это где бы то не было еще( во всяких там конструкторах-деструкторах), контекст устройства -ресурс ограниченный, его беречь надо.

А рисовать соответственно так:
Код

        private void button1_Click(object sender, EventArgs e)
        {
            btBac = new Bitmap(panel1.Width, panel1.Height);
            Graphics gr = Graphics.FromImage(btBac);
            gr.FillEllipse(Brushes.DarkGreen, 0, 0, panel1.Width, panel1.Height);
            panel1.Invalidate();
        }



Цитата

Панель - это не устройство, а такой же объект в памяти, как и Bitmap.

Так то панель. Но вся штука в том , что когда мы рисуем через Graphics какого-либо контрола, мы, по сути дела, рисуем в памяти видекарты - то что я назвал "устройством".
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
Alek86
Дата 26.8.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



спасибо

Добавлено через 12 минут и 10 секунд
кстати, используя этот метод, избавиться от сильного моргания не получилось. (вроде для того и рисовали).
А зато, когда поставил
Код

this.DoubleBuffered = true;

у своего контрола, то мерцания исчезли и без этих ухищрений.


--------------------
user posted image    user posted image
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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