Как правильно работать с контекстами дисплея
От: Аноним  
Дата: 25.10.03 20:57
Оценка:
Как прально организовать работу с контекстом окна, чтобы не было заметно моргания изображения при обновлении клиентской области окна. (Так при прокрутке полосами прокрутки окна проиходит моргание изображения).

Как от этого избавиться?
Re: Как правильно работать с контекстами дисплея
От: AndreyFedotov Россия  
Дата: 27.10.03 09:51
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>Как от этого избавиться?


Не за счёт "правильной" работы с контекстом изображения. Если окно отрисовывается и не происходит утечки ресурсов, то вероятнее всего Вы работаете с контекстом изображения правильно.
Проверьте — очищается ли фон окна по сообщению WM_ERASEBKGND. Например, если окно имеет голубой фон который отрисовывается на WM_PAINT, а при этом задана очистка фона окна на WM_ERASEBKGND и цвет фона например серый, то будет происходить мелькание. Если очищать фон на WM_ERASEBKGND, то окно будет мелькать, какими бы средствами Вы не пользовались.
Поэтому что можно сделать:
На WM_ERASEBKGND — ничего не делать, перехватывать это сообщение, что бы фон окна не чистился, но ничего не рисовать.
На WM_PAINT:
Рисуем окно в памяти, затем выводим его как единое целое на экран.
Для этого:
— Создаём новый контекст изображения с помощью CreateCompatibleDC
— Создаём изображение в памяти, с размерами равными размерам окна с помощью CreateCompatibleBitmap
— Выбираем созданное изображение в созданный контекст.
— Рисуем все что нужно в этом контексте
— Теперь выводим изображение на котором нарисовано всё что нужно на экран (то есть в исходный контекст рисования) с помощью BitBlt
— Помним о том, что нужно не только брать, но и отдавать — отдаём ресурсы системе.

С Уважением, Андрей
Re: Как правильно работать с контекстами дисплея
От: aik Австралия  
Дата: 27.10.03 09:55
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>Как от этого избавиться?


— рисовать в контекст памяти и потом bitblt'ить полученное на экран.
— на WM_PAINT обновлять только то, что отдает GetUpdateRect.
— почитать и проникнуться стилями окна WS_CLIPCHILDREN и WS_CLIPSIBLINGS.
— игнорировать WM_ERASEBKGND.
— удалить у класса окна CS_HREDRAW и CS_VREDRAW (мог напутать, это флаги класса окна).

выбирай по вкусу
последствия применения последних двух пунктов надо будет фиксить, но при правильном подходе моргать ничего не должно.
Re: Как правильно работать с контекстами дисплея
От: B_A_D Израиль  
Дата: 27.10.03 10:35
Оценка:
Double buffering это называется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.