Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
14-63352
Amigo Sv
2003-12-29 08:09
2004.01.20
Добавление записи


6-63289
Тимохов
2003-11-19 10:51
2004.01.20
Вопрос про выбор технологии обмена данными по сети.


1-63175
HolyMan
2004-01-09 22:00
2004.01.20
Задачки с использованием COM


3-62978
GIL
2003-12-24 11:09
2004.01.20
Значения по умолчанию


1-63178
Kostya
2004-01-11 10:55
2004.01.20
артинка на кнопку