Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDI+. Недействительные регионы. Есть ли они? 
:(
    Опции темы
dreamer21
Дата 25.8.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Раньше в GDI были "недействительные регионы", т.е. если часть окна перекрывалась ранее другим окном, то перекрытая часть после этого становилось недействительной, т.е. она требовала перерисовки. И при этом перерисовывалась только эта часть, а не все окно. В моей программе на GDI+ почему-то перерисовывется все окно сразу. Это выглядет не рчень красиво. Можно ли тут сделать что-то подобное "недействительным регионам"???
PM MAIL   Вверх
explorer
Дата 25.8.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Конечно можно. Существует метод Invalidate() (по крайней мере,  это справедливо для C#, но и в С++ это тоже должно быть). Этот метод сообщает системе, что поверхность, с которой он был вызван, более недейстительна и нуждается в перерисовке.
Существует также перегруженный метод Invalidate, который принимает в качестве параметра структуру Region. Эта структура описывает область, которую нужно перерисовать. Единственное неудобство здесь заключается в том, что этот регион придется считать "вручную".
--------------------
 
PM MAIL WWW ICQ   Вверх
dreamer21
Дата 26.8.2009, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Эхь... получается GDI+ сам не просчитывает недействительные регионы... или я не так понял?
Что-то я не могу найти в мсдн этого метода) Не подскажешь, к какому классу GDI+ относится? А как определить вручную недействительный регион? В GDI такие ф-ии были, а вот в GDI+ я их не знаю( 
PM MAIL   Вверх
explorer
Дата 26.8.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот, нашел в MSDN:

Цитата

Invalidate(Boolean)
    Invalidates a specific region of the control and causes a paint message to be sent to the control. Optionally, invalidates the child controls assigned to the control.

Invalidate(Rectangle)    
            Invalidates the specified region of the control (adds it to the control's update region, which is the area that will be repainted at the next paint operation), and causes a paint message to be sent to the control.
    
Invalidate(Region)    
            Invalidates the specified region of the control (adds it to the control's update region, which is the area that will be repainted at the next paint operation), and causes a paint message to be sent to the control.
    
            Invalidate(Rectangle, Boolean)    
Invalidates the specified region of the control (adds it to the control's update region, which is the area that will be repainted at the next paint operation), and causes a paint message to be sent to the control. Optionally, invalidates the child controls assigned to the control.
    
            Invalidate(Region, Boolean)    
Invalidates the specified region of the control (adds it to the control's update region, which is the area that will be repainted at the next paint operation), and causes a paint message to be sent to the control. Optionally, invalidates the child controls assigned to the control.


Это метод, принадлежащий классу Control и его наследникам. Ты же рисуешь на поверхности? (форма, панель, кнопка, UserContol или Control, в общем случае). 
Так  вот, этот метод надо вызывать у того контрола, на котором рисуешь.
Судя по количеству перегруженных версий Invalidate() ни разу он не отслеживает больше ничего smile  Либо рисует все заново, либо строго указанную область.

По поводу определения области для перерисовки сказать ничего не могу. Очень может быть, что в GDI+ сохранились методы из GDI, отвечавшие за это (возможно, у них слегка изменены названия). 

А вообще, если при перерисовке формы беспокоит мерцание, то нужно включать двойную буферизацию (в GDI+ такая уже есть).

Это сообщение отредактировал(а) explorer - 26.8.2009, 09:23
--------------------
 
PM MAIL WWW ICQ   Вверх
dreamer21
Дата 26.8.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Эхь... наверное я еще совсем зеленый в этом) Тебя не совсем понимаю, извиняй) Сохраню эту страничку на диске, как дозрею - может догоню. Я вот все думаю, может как-то в обычном GDI получить дескриптор обновляемого региона, а затем в GDI+ из этого региона создать обьект и сделать по нему clipping... Можно так попробовать? Вот только не могу найти функцию, которая даст мне этот дескриптор. Может ты ее знаешь?  И вообще... что посоветуешь использовать далее GDI или же GDI+, или так и придется их комбинировать???
PM MAIL   Вверх
explorer
Дата 26.8.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё, уточнил, вспомнил, поэтому расскажу сразу как чего делать smile
Во-первых, GDI+ -это оптимизированная обертка над GDI (она реализована классами), поэтому использовать лучше GDI+. Что касается терминологии, то "недействительная область" там называется "областью вырезания". Эта область высчитывается-таки системой и передается в составе PaintEventArgs. 
Доустим, у тебя есть форма, в который ты что-то выводишь, и ты знаешь, какую область занимают на форме твои нарисованный элементы. Тогда делаем так:
Код

protected override void OnPaint(PaintEventArgs e)
{
       Graphics dc = e.Graphics; // создаем объект "графика"
       if (e.ClipRectangle.Contains(rect)) // проверяем, закрыло ли окно нашу область
       {
           вызываем обычную прорисовку
       }
       base.OnPaint(e); // не жадничаем и не забываем о  других нуждающихся в этом событии )))
}

rect - это прямоугольник, описывающий всю область, в которой ты что-либо рисовал.

 Вся информацию по методу Contains лежит здесь.

Это сообщение отредактировал(а) explorer - 26.8.2009, 19:55
--------------------
 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




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


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

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