| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > GDI+. Недействительные регионы. Есть ли они? |
| Автор: dreamer21 25.8.2009, 19:12 |
| Раньше в GDI были "недействительные регионы", т.е. если часть окна перекрывалась ранее другим окном, то перекрытая часть после этого становилось недействительной, т.е. она требовала перерисовки. И при этом перерисовывалась только эта часть, а не все окно. В моей программе на GDI+ почему-то перерисовывется все окно сразу. Это выглядет не рчень красиво. Можно ли тут сделать что-то подобное "недействительным регионам"??? |
| Автор: explorer 25.8.2009, 19:32 |
| Конечно можно. Существует метод Invalidate() (по крайней мере, это справедливо для C#, но и в С++ это тоже должно быть). Этот метод сообщает системе, что поверхность, с которой он был вызван, более недейстительна и нуждается в перерисовке. Существует также перегруженный метод Invalidate, который принимает в качестве параметра структуру Region. Эта структура описывает область, которую нужно перерисовать. Единственное неудобство здесь заключается в том, что этот регион придется считать "вручную". |
| Автор: dreamer21 26.8.2009, 06:55 |
| Эхь... получается GDI+ сам не просчитывает недействительные регионы... или я не так понял? Что-то я не могу найти в мсдн этого метода) Не подскажешь, к какому классу GDI+ относится? А как определить вручную недействительный регион? В GDI такие ф-ии были, а вот в GDI+ я их не знаю( |
| Автор: explorer 26.8.2009, 09:16 | ||
Вот, нашел в MSDN:
Это метод, принадлежащий классу Control и его наследникам. Ты же рисуешь на поверхности? (форма, панель, кнопка, UserContol или Control, в общем случае). Так вот, этот метод надо вызывать у того контрола, на котором рисуешь. Судя по количеству перегруженных версий Invalidate() ни разу он не отслеживает больше ничего По поводу определения области для перерисовки сказать ничего не могу. Очень может быть, что в GDI+ сохранились методы из GDI, отвечавшие за это (возможно, у них слегка изменены названия). А вообще, если при перерисовке формы беспокоит мерцание, то нужно включать двойную буферизацию (в GDI+ такая уже есть). |
| Автор: dreamer21 26.8.2009, 16:20 |
| Эхь... наверное я еще совсем зеленый в этом) Тебя не совсем понимаю, извиняй) Сохраню эту страничку на диске, как дозрею - может догоню. Я вот все думаю, может как-то в обычном GDI получить дескриптор обновляемого региона, а затем в GDI+ из этого региона создать обьект и сделать по нему clipping... Можно так попробовать? Вот только не могу найти функцию, которая даст мне этот дескриптор. Может ты ее знаешь? И вообще... что посоветуешь использовать далее GDI или же GDI+, или так и придется их комбинировать??? |
| Автор: explorer 26.8.2009, 19:54 | ||
| Всё, уточнил, вспомнил, поэтому расскажу сразу как чего делать Во-первых, GDI+ -это оптимизированная обертка над GDI (она реализована классами), поэтому использовать лучше GDI+. Что касается терминологии, то "недействительная область" там называется "областью вырезания". Эта область высчитывается-таки системой и передается в составе PaintEventArgs. Доустим, у тебя есть форма, в который ты что-то выводишь, и ты знаешь, какую область занимают на форме твои нарисованный элементы. Тогда делаем так:
rect - это прямоугольник, описывающий всю область, в которой ты что-либо рисовал. Вся информацию по методу Contains лежит http://msdn.microsoft.com/ru-ru/library/system.drawing.rectangle.contains.aspx. |