Модераторы: 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   Вверх
tdebugger
Дата 26.8.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

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



Цитата

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

А что за мерцания у тебя были ?  Когда происходили ?


Кстати, двойная буферизация как работает ?
Там есть какой-то промежуток времени, через который буфера свопятся или другой алгоритм ?
PM MAIL   Вверх
Alek86
Дата 27.8.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



при прорисовке поля игры при щелчке мышкой на нем (на поле добавлялась точка) я вызывал invalidate и update (позже перешел на refresh, ибо первый способ не всегда работал). вот тогда все и мерцало. Ну, и при ресайзе тоже.

наверное, все рисуется в памяти, а потом сразу свопится.


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


Опытный
**


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

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



Цитата

при прорисовке поля игры при щелчке мышкой на нем (на поле добавлялась точка) я вызывал invalidate и update (позже перешел на refresh

А вызывал ты Invalidate без параметров ?
И где ты рисовал - на Graphics или на bitmap'е ?

Код

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. Далее рисуем эллипс на Graphics, то бишь на bitmap'е, и перерисовываем... Вопрос: что здесь перерисовывается ?  Graphics и bitmap никак не связаны с контролом panel1.

И вообще я не совсем понял, что должен перерисовывать Invalidate. Рисую-то я сам - на Graphics'е, полученном из контрола, либо на bitmap'е, который я потом сам должен скидывать на контрол через его graphics.

Т.е. сейчас я в обработчике OnPaint скидываю bitmap на панель - это в UI-потоке.
В то же время в потоке таймера периодически требуется обновить какую-либо область панели. Вот здесь не совсем понятно, что делать. До настоящего момента я вручную перерисовывал эту область через Graphics панели (перерисовка происходила через Invoke в UI-потоке).
Теперь, если использовать bitmap, нужно на нём перерисовать изменённую область и скинуть этот битмэп на контрол. Но это делать нужно в UI-потоке во избежание одновременного доступа к контролу, т.е. опять использовать Invoke...

PM MAIL   Вверх
Alek86
Дата 28.8.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



рисовать на битмапе нужно в методе OnPaint
и вообще, рисуй на панели в OnPaint, но поставь у нее (панели) DoubleBuffered = true

smile




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


Опытный
**


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

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



А вот интересный момент: раньше советовали для устранения мерцаний в конструкторе объявлять:
Код

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); // раньше вроде бы было просто DoubleBuffer

Недавно пришлось свой контрол рисовать, вставил вышеупомянутую строчку, так его вообще на форме не видно. Если закомментировать строку, то все нормально.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
CyraxZ
Дата 28.8.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

рисовать на битмапе нужно в методе OnPaint

И тут же скидывать bitmap на панель ?
Тогда толку от bitmap'а ?

У меня следующая ситуация. На панели происходит перерисовка в следующих двух случаях:
1. Когда изменяется состояние (для дискретных сигналов) или значение (для аналоговых сигналов) элемента, я его (и только его, не всю схему) тут же перерисовываю на панели. Перерисовка происходит посредством Invoke(), посему выполняется в UI-потоке. Здесь у меня никаких проблем с тормозами нет.
2. Когда окно перемещается за пределы экрана, а затем выдвигается из-за него, то много раз вызывается обработчик Paint панели. В этом обработчике у меня происходит перерисовка всейсхемы. Перерисовываю я сам - поэлементно (естественно, DoubleBuffered здесь не поможет). Посему наблюдаются сильные тормоза...

Как мне избавиться от тормозов во втором случае ?

Судя по всему, нужно хранить уже отрисованный bitmap (например, в классе панели), а в обработчике Paint панели всего лишь скидывать этот bitmap на панель. Так ?

Что касается первого случая, то там нужно при изменении элемента перерисовать на bitmap'е этот элемент, затем посредством Invoke вызвать метод Invalidate(с параметрами, где указывается область перерисоки). Но тогда проще будет через Invoke вызвать свой метод, который рисует непосредственно на Graphics панели (т.е. фактически аналог вызова Invalidate())...

Как всё это лучше организовать ?
PM MAIL   Вверх
Alek86
Дата 28.8.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(CyraxZ @  28.8.2007,  21:11 Найти цитируемый пост)

И тут же скидывать bitmap на панель ?
Тогда толку от bitmap'а ?


толк, как я понимаю, в том, что все "прорисовывается" в памяти, а не во время рисования формы, то есть очень быстро.

а все-же, попробуй поставь DoubleBuffered, ибо, если я тебя правильно понял, он-то тут как раз и нужен


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


Опытный
**


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

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



Цитата

а все-же, попробуй поставь DoubleBuffered, ибо, если я тебя правильно понял, он-то тут как раз и нужен

DoubleBuffered у меня стоит. Но это свойство у формы. Я же рисую на панели. Впрочем, свойство, возможно, распространяется на прорисоку и всех его контролов.
DoubleBuffered не поможет, когда я сам все элементы по очереди отрисовываю на панели. У меня как раз такой случай. Я должен сам делать двойную буферизацию - собственно, через промежуточный image и есть такая буферизация (рисую на image и скидываю махом на панель).

Насколько я понял, метод Invalidate элементарно вызывает обработчик Paint...
PM MAIL   Вверх
tdebugger
Дата 30.8.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Насколько я понял, метод Invalidate элементарно вызывает обработчик Paint...
Посылает сообщение для вызова пеперисовки - это более корректно, чем вызывать Paint напрямую...не под DOS программируем...

Цитата

DoubleBuffered у меня стоит. Но это свойство у формы. Я же рисую на панели. Впрочем, свойство, возможно, распространяется на прорисоку и всех его контролов.
На вряд ли. 
Цитата

 Я же рисую на панели. 
Здесь не мешало бы собственный контрол заделать. 

Цитата

толк, как я понимаю, в том, что все "прорисовывается" в памяти, а не во время рисования формы, то есть очень быстро.
Ну по крайней мере на порядок быстрее. Метод особенно хорошо помогает , когда требуется действительно сложная логика рисования - прорисовка внутри алгоритма, попиксельное сравнение...
Цитата

рисовать на битмапе нужно в методе OnPaint
Да где угодно можно, еще один плюс обратного буфера...

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); -  то же самое, что DoubleBuffer=true; Кроме этого могут быть полезны  следующие установки:
Код

SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);

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


Опытный
**


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

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



Цитата

SetStyle(ControlStyles.UserPaint, true);

Изображение, которое я рисую на форме (на панели) будет перерисовываться вместе с самой формой при выдвигании формы из-за экрана или из-за другой формы ?
Если да, то никакие битмапы мне не понадобятся, поскольку только из-за этого я и ввёл битмапы...

PM MAIL   Вверх
tdebugger
Дата 31.8.2007, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

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



Цитата

Каждый контрол сам по себе перерисовывается

У меня форма/панель при выдвигании из-за экрана или из-за другой формы не перерисовывается - остаётся белое пространство...
PM MAIL   Вверх
tdebugger
Дата 31.8.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

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



Цитата

Тяжелый случай. После чего это произошло? 

А всегда так было - от самого начала и до самого конца.
При выдвигании сама форма-то перерисовывается, а то, что я сам до задвигания формы за экран рисовал, - не перерисовывается. Приходится самому... в OnPaint'е...

Ну так SetStyle(ControlStyles.UserPaint, true); не решит эту проблему ?

Цитата

Здесь не мешало бы собственный контрол заделать. 

Именно. Но сейчас уже поздно. Вот если бы сразу такую мысль...

Это сообщение отредактировал(а) CyraxZ - 31.8.2007, 17:49
PM MAIL   Вверх
tdebugger
Дата 1.9.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот зря я с тобой мучился...про контексты рассказывал...
 Все, что нарисовано в окне (форме, контроле), есть содержимое памяти видеоадаптера (чуть не сказал монитора- вот бы дал повода для смеха...), то есть, если мы задвинули окно за пределы монитора, то его изображение теряется из-за отсутствия памяти ТАМ, а когда перекрыли другим окном - соответственно преписали память содержимым ТОГО окна. К счастью нам не нужно беспокоиться о перемещении участков памяти при передвигании окна, это работа системы, а вот восстановление потерянного изображения - уже наша забота. Скинуть заранее приготовленный битмап или нарисовать все заново - это зависит от требований оптимизации, но без обработчика сообщения WM_PAINT не обойтись никак...

 SetStyle(ControlStyles.UserPaint, true); - устраняет прорисовку фона(перекрывает WM_ERASEBKGND). Ну это уже в конце подбирается, когда все готово, помогло - хорошо, нет - обратно закомментировать, потому как оптимизация графики, вещь сугубо индивидуальная и 100%-го рецепта на эту тему нет...
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
CyraxZ
Дата 10.9.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

восстановление потерянного изображения - уже наша забота

Ну так ОС же сама перерисовывает изображение под курсором мыши. Почему бы ей не перерисовывать его для случая другого окна. Какая разница - курсор мыши или другое окно - всё равно перерисовывать нужно. В случае с курсором перерисовывает, а в случае с другим окном - нет. Не совсем логично...
PM MAIL   Вверх
mr.DUDA
Дата 11.9.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(CyraxZ @  10.9.2007,  23:23 Найти цитируемый пост)
Какая разница - курсор мыши или другое окно - всё равно перерисовывать нужно. В случае с курсором перерисовывает, а в случае с другим окном - нет. Не совсем логично...

Курсор - отдельная песня, у него размер более-менее небольшой и к тому же вроде как обычная видеокарта имеет аппаратную поддержку отрисовки курсора "поверх" всего. Что касается окон - каждое окно имеет область в памяти, где хранится текущее содержимое. Сохранять и восстанавливать это содержимое на каждый чих было бы заметной тратой ресурсов CPU.


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

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


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

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


 




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


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

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