Рисование композитного контрола с doublebuffer-ом
От: Димитриус  
Дата: 06.10.04 13:42
Оценка:
Необходимо избавиться от мелькания композитного контрола при его зарисовке.
Контрол содержит на себе много дочерних.
При рисовании (как с SetStyle(doublebuffer|...) так и без) сперва рисуется фон контрола с вырезанными прямоугольниками на месте дочерних окон, а затем сами эти дочерние контролы по очереди. Причем рисование дочерных контролов происходит достаточно медленно, поэтому виден наглядный процесс появления контролов на форме, что очень нежелательно.
Часть этих контролов не являются WinForms, а обычные ActiveX, часть — обычные WinForms-овские label-ы с прозрачным фоном. Пробовал следующие пути решения проблемы:
1) SetStyle( doublebuffer|userpaint|AllPaintingInWMPaint) — никакого эффекта.
2) Если перегрузить WndProc и просто игнорировать WM_PAINT и WM_ERASEBACKGROUND (не вызывать базовый класс), то пустые прямоугольники на месте дочерних контролов рисуются всё равно.
Похоже, что сообщение к дочерним окошкам летит из PreProcessMessage, но при перегрузке этого метода он почему то вообще не вызывается. В MSDN написано что-то про UIPermission,
но с чем его есть и как это устроить я не понял.

3) Перегрузка OnPaintBackground и OnPaint ничего не дает, ибо как я уже сказал даже если заблокировать вызовы всех Paint-ов пустые прямоугольники всё равно вылезают.

Мой конторл наследуется от UserControl.
Вопросы:
1) Как заставить перегружаться PreProcessMessage ?
2) Где же тогда реализовывать самопальный DoubleBuffer ?
3) Если найдутся ответы на 1 и 2, тогда встаёт вопрос как отрисовать все дочерние контрол на моём буфере (т.е. Graphics g=Graphics.FromImage(...)


Буду очень признателен за помощь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.