Главная страница
    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.47 MB
Время: 0.012 c
1-63061
miracle_fox
2004-01-07 01:46
2004.01.20
чем отличаются exit от breake


1-63187
Nesh Briges
2004-01-10 01:20
2004.01.20
Изменение регистра символов


6-63275
Dysan
2003-11-18 13:06
2004.01.20
Connection Closed Gracefully


8-63261
hedgehoge
2003-09-09 15:47
2004.01.20
Распознавание


1-63228
Sergious
2004-01-09 15:39
2004.01.20
А в Delphi 7 есть закладка FastNet?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский