Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];

Вниз

OnPaint окна приложения   Найти похожие ветки 

 
Kettle of delphi   (2004-01-10 15:50) [0]

Вопрос возник из-за плохого понимания механизма отрисовки формы.

На событие OnPaint реагирует обработчик, который рисует на DC структуры, которая есть class(TForm).
DC определяется в событии OnCreate примерно так:

DC := GetDC(handle);
hrc := wglCreateContext(DC);

В общем, все прекрасно работает. Указанный способ используется, чтобы рисовать средствами OpenGL. Теперь проблема: при морфинге изображения, используется упрощенная модель, которая перестает быть упрощенной, как только морфинг прекращается. Другими словами, как только модель становится статичной, она рисуется со всеми подробностями => ДОЛГО.

Так вот, если перетаскивать форму по рабочему столу, перерисовка не происходит (а изображение прекрасно перетаскивается!). Как только поверх формы рисуется другая форма (т.е., оконная форма другого приложения перекрывает часть поверхности), начинается перерисовка => заметно тормозит.

Вопрос такой: как ГРАМОТНО убрать эффект перерисовки? У меня есть такие мысли: в момент потери фокуса, отследить это событие и поместить в буфер текущее изображение. После этого, как только произойет событие OnPaint, посмотреть, есть ли фокус на форме? Если фокуса нет, поместить на форму буферное изображение, отключив строитель сложной поверхности OpenGL. Меня смущает некая "топорность" такого подхода.

Посоветуйте другие варианты..


 
YuRock   (2004-01-10 15:54) [1]

Не надо делать GetDC() для формы ни в коем случае!
Надо либо в оконной процедуре сообщение WM_PAINT перехватывать, и там получать DC с помощью BeginPaint, а удалять ч-з EndPaint, либо в OnPaint использовать готовый TForm.Canvas.Handle - это и есть уже (правильно) полученный DC формы.


 
Kettle of delphi   (2004-01-10 16:44) [2]

Я использую готовый шаблон для задания контекста вывода. Он упоминается у многих авторов и именно так у меня. В этом смысле, все прекрасно работает. А вообще, интересно, от чего такой совет?


 
YuRock   (2004-01-10 17:00) [3]

> Kettle of delphi (10.01.04 16:44) [2]

Надо документацию почитывать. Используя GetDC будет перерисовываться вся форма. BeginPaint обходит эту проблему - работает быстрее.

У каких авторов написано, что DC формы надо получать ч-з GetDC в OnPaint? :))


 
Kettle of delphi   (2004-01-10 17:16) [4]

Не знаю, у каких авторов это написано.
Наверно, я плохо объясняю..

>DC определяется в событии OnCreate примерно так:
>
> DC := GetDC(handle);
> hrc := wglCreateContext(DC);

Здесь я имею ввиду, что DC определяется ОДИН РАЗ, во время создания формы (т.е., когда происходит событие OnCreate).

В событии OnPaint, DC НЕ определяется.


 
Юрий Зотов   (2004-01-10 17:22) [5]

Form.Canvas.Handle

Это и есть DC. Уже готовый. Можно использовать где угодно.


 
YuRock   (2004-01-10 17:30) [6]

> Kettle of delphi (10.01.04 17:16) [4]

Вот все, что я могу сказать и посоветовать. Хотите - воспользуйтесь советом.

1. Если использовать OnPaint - DC определять ненужно! Даже нельзя! В этом случае оно уже определено дельфями и равно Canvas.Handle (советую нажать F1 на Canvas.Handle);

2. Если хотите, чтобы все работало максимально быстро и правильно - перекройте оконную процедуру и при сообщении WM_PAINT пишите:


var
Ps: TPaintStruct;
DC: HDC;
hrc: HGLRC;
begin
DC := BeginPaint(Handle, Ps);
hrc := wglCreateContext(DC);
...
wglDeleteContext(hrc);
EndPaint(Handle, Ps);
end;


И это наилучший (быстрейший) вариант.


 
yurchello   (2004-01-10 20:34) [7]

>Если фокуса нет, поместить на форму буферное изображение, >отключив строитель сложной поверхности OpenGL. Меня смущает >некая "топорность" такого подхода.

идея что при потери фокуса переводить прорисовку не сложную а из буфера хорошая, если токо на форме не изменяется содежимое. Но буфер (bitmap) должен быть не больше формы, чтобы стретч не вызывать (тормозит).

Были грабли в том что DC может перекрейчиватся после крейта формы, и тогда при прорисовке у тебя будет старый DC и ошибка доступа к памяти появится. Так что лучше при onPaint пределять его.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.01 c
1-63184
oens
2004-01-10 08:52
2004.01.20
шрифт


1-63146
Инкогнито
2004-01-07 10:30
2004.01.20
окошечко


14-63358
Борец Анатолий
2003-12-10 15:44
2004.01.20
Где взять Delphi 7 Help на Русском?


1-63134
Konstantin
2004-01-10 20:58
2004.01.20
Как сохранить содержимое Timage как монохромный рисунок?


3-62986
Rafe
2003-12-23 13:11
2004.01.20
Что-то непонятное стало происходить с параметрами...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский