Re[4]: Отрисовка GUI в MFC.
От: Аноним  
Дата: 11.07.12 03:54
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

А>>Спасибо. Это уже освоено. У меня больше интересует ключевое слово WM_ERASEBKGND,

А>>что бы оптимизировать отрисовку большого количества дочерних окон.

SVZ>Гм, WM_ERASEBKGND вместе с "большим количеством дочерних окон" — интересное сочетание.

SVZ>Скины?
SVZ>Т.к. задача не ясна, а ты не колешься, то для начала напомню про флаг WS_CLIPCHILDREN.

SVZ>Если дочерних контролов действительно много и это действительно необходимо, то возможно стоит перейти на windowless контролы. Например посмотреть в сторону htmlayout. С MFC оно хорошо стыкуется.


Ситуация в следующем.
Имеется самописный сплитер (стиль сплитера WS_CLIPSIBLINGS | WS_CLIPCHILDREN).
В правой части которого размещается окно(стиль окна WS_CLIPSIBLINGS). Окно содержит стандартные элементы управления и OwnerDraw лист-контрол. В процессе работы периодически в Окно прилетает WM_ERASEBKGND . Оно приходит на изменения размера и еще в некоторых случаях (например после того как пропадает тул-тип на лист-контроле). Если я оставляю обработку WM_ERASEBKGND стандартную, то после пропадания тул-типа остается очищенная область лист-контрола и перерисовка лист-контролу не приходит.
1-ый вариант:
В обработчик WM_ERASEBKGND Окна я добавил принудительную перерисовку лист-контрола.
Все Ок! Но выяснилось НО, когда подключаемся удаленно то видим, что лист-контрол после каждого тул-типа заметно перерисовывается(мерцает).
2-ой вариант:
В обработчике WM_ERASEBKGND Окна я убрал перерисовку и всегда возвращаю TRUE. Мерцание прекратилось. Возникла другая проблема. Когда мы уменьшаем размер Окна сплитером, т.е. сдвигаем его вправо, лист-контрол сдвигается вправо и заезжает на ту область окна которую лист-контрол не занимает.
При этом лист-контрол сам себя корректно отрисовывает в новых размерах. Когда увеличиваем размер окна, т.е. двигаем сплитер влево, то Окно перерисовывается корректно и мусор исчезает.

По требованию использовать windowless контролы нельзя.

Во в связи с этим мне бы и хотелось узнать больше про WM_ERASEBKGND и про механизм перерисовки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.