![]() |
|
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]()
|
|
| dreamer21 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Раньше в GDI были "недействительные регионы", т.е. если часть окна перекрывалась ранее другим окном, то перекрытая часть после этого становилось недействительной, т.е. она требовала перерисовки. И при этом перерисовывалась только эта часть, а не все окно. В моей программе на GDI+ почему-то перерисовывется все окно сразу. Это выглядет не рчень красиво. Можно ли тут сделать что-то подобное "недействительным регионам"???
|
|||
|
||||
| explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Конечно можно. Существует метод Invalidate() (по крайней мере, это справедливо для C#, но и в С++ это тоже должно быть). Этот метод сообщает системе, что поверхность, с которой он был вызван, более недейстительна и нуждается в перерисовке.
Существует также перегруженный метод Invalidate, который принимает в качестве параметра структуру Region. Эта структура описывает область, которую нужно перерисовать. Единственное неудобство здесь заключается в том, что этот регион придется считать "вручную". --------------------
|
|||
|
||||
| dreamer21 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Эхь... получается GDI+ сам не просчитывает недействительные регионы... или я не так понял?
Что-то я не могу найти в мсдн этого метода) Не подскажешь, к какому классу GDI+ относится? А как определить вручную недействительный регион? В GDI такие ф-ии были, а вот в GDI+ я их не знаю( |
|||
|
||||
| explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Вот, нашел в MSDN:
Это метод, принадлежащий классу Control и его наследникам. Ты же рисуешь на поверхности? (форма, панель, кнопка, UserContol или Control, в общем случае). Так вот, этот метод надо вызывать у того контрола, на котором рисуешь. Судя по количеству перегруженных версий Invalidate() ни разу он не отслеживает больше ничего По поводу определения области для перерисовки сказать ничего не могу. Очень может быть, что в GDI+ сохранились методы из GDI, отвечавшие за это (возможно, у них слегка изменены названия). А вообще, если при перерисовке формы беспокоит мерцание, то нужно включать двойную буферизацию (в GDI+ такая уже есть). Это сообщение отредактировал(а) explorer - 26.8.2009, 09:23 --------------------
|
|||
|
||||
| dreamer21 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Эхь... наверное я еще совсем зеленый в этом) Тебя не совсем понимаю, извиняй) Сохраню эту страничку на диске, как дозрею - может догоню. Я вот все думаю, может как-то в обычном GDI получить дескриптор обновляемого региона, а затем в GDI+ из этого региона создать обьект и сделать по нему clipping... Можно так попробовать? Вот только не могу найти функцию, которая даст мне этот дескриптор. Может ты ее знаешь? И вообще... что посоветуешь использовать далее GDI или же GDI+, или так и придется их комбинировать???
|
|||
|
||||
| explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Всё, уточнил, вспомнил, поэтому расскажу сразу как чего делать
Во-первых, GDI+ -это оптимизированная обертка над GDI (она реализована классами), поэтому использовать лучше GDI+. Что касается терминологии, то "недействительная область" там называется "областью вырезания". Эта область высчитывается-таки системой и передается в составе PaintEventArgs. Доустим, у тебя есть форма, в который ты что-то выводишь, и ты знаешь, какую область занимают на форме твои нарисованный элементы. Тогда делаем так:
rect - это прямоугольник, описывающий всю область, в которой ты что-либо рисовал. Вся информацию по методу Contains лежит здесь. Это сообщение отредактировал(а) explorer - 26.8.2009, 19:55 --------------------
|
|||
|
||||
![]()
|
| Вы можете найти полезным что... | |
|
|
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |