Sep. 14th, 2010

psilogic: (Default)
Я по ходу дела много раз сталкивался с задачей отрисовки окон без мелькания при перемещении/скрытии/появлении.

Специально подчеркну: речь не идет об устранении мелькания при отрисовке вообще, и про технологию double buffer я, естественно, знаю. Речь идет об устранении мелькания при массовом изменении расположения и видимости окон.

Обычно это относится к child-окнам в пределах одного parent-окна. Например, есть закладка (в Tab Control), на которой десяток кнопок, edit-box-ов и тому подобного, и есть другая закладка, тоже насыщенная небольшими окнами. И вот между этими закладками мы быстро переключаемся (скажем, зажав Ctrl-Tab). Другой вариант: в верхней части диалога имеется combo-box, при прокрутке которого (стрелками или колесом мыши) меняется нижняя часть диалога: какие-то кнопки исчезают, какие-то появляются, какие-то смещаются или увеличиваются в размерах.

При этом возникают разные, иногда достаточно раздражающие эффекты мелькания.

В Windows имеется механизм BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos, который работает, но не всегда так хорошо, как хотелось бы.

Мне интересно, какие методы используют (если вообще используют) по этому поводу френды-коллеги. Возможно, есть какие-то хорошие методы, о которых я не знаю. Я в конце-концов дошел до создания собственного алгоритма, который жестко минимизирует всяческую перерисовку, и тем самым устраняет мелькание. Алгоритм работает хорошо, но получился достаточно нетривиальным, поэтому мне интересно насчет других подходов.
Page generated Sep. 13th, 2025 11:31 pm
Powered by Dreamwidth Studios