Entry tags:
Вопрос к коллегам
Я по ходу дела много раз сталкивался с задачей отрисовки окон без мелькания при перемещении/скрытии/появлении.
Специально подчеркну: речь не идет об устранении мелькания при отрисовке вообще, и про технологию double buffer я, естественно, знаю. Речь идет об устранении мелькания при массовом изменении расположения и видимости окон.
Обычно это относится к child-окнам в пределах одного parent-окна. Например, есть закладка (в Tab Control), на которой десяток кнопок, edit-box-ов и тому подобного, и есть другая закладка, тоже насыщенная небольшими окнами. И вот между этими закладками мы быстро переключаемся (скажем, зажав Ctrl-Tab). Другой вариант: в верхней части диалога имеется combo-box, при прокрутке которого (стрелками или колесом мыши) меняется нижняя часть диалога: какие-то кнопки исчезают, какие-то появляются, какие-то смещаются или увеличиваются в размерах.
При этом возникают разные, иногда достаточно раздражающие эффекты мелькания.
В Windows имеется механизм BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos, который работает, но не всегда так хорошо, как хотелось бы.
Мне интересно, какие методы используют (если вообще используют) по этому поводу френды-коллеги. Возможно, есть какие-то хорошие методы, о которых я не знаю. Я в конце-концов дошел до создания собственного алгоритма, который жестко минимизирует всяческую перерисовку, и тем самым устраняет мелькание. Алгоритм работает хорошо, но получился достаточно нетривиальным, поэтому мне интересно насчет других подходов.
Специально подчеркну: речь не идет об устранении мелькания при отрисовке вообще, и про технологию double buffer я, естественно, знаю. Речь идет об устранении мелькания при массовом изменении расположения и видимости окон.
Обычно это относится к child-окнам в пределах одного parent-окна. Например, есть закладка (в Tab Control), на которой десяток кнопок, edit-box-ов и тому подобного, и есть другая закладка, тоже насыщенная небольшими окнами. И вот между этими закладками мы быстро переключаемся (скажем, зажав Ctrl-Tab). Другой вариант: в верхней части диалога имеется combo-box, при прокрутке которого (стрелками или колесом мыши) меняется нижняя часть диалога: какие-то кнопки исчезают, какие-то появляются, какие-то смещаются или увеличиваются в размерах.
При этом возникают разные, иногда достаточно раздражающие эффекты мелькания.
В Windows имеется механизм BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos, который работает, но не всегда так хорошо, как хотелось бы.
Мне интересно, какие методы используют (если вообще используют) по этому поводу френды-коллеги. Возможно, есть какие-то хорошие методы, о которых я не знаю. Я в конце-концов дошел до создания собственного алгоритма, который жестко минимизирует всяческую перерисовку, и тем самым устраняет мелькание. Алгоритм работает хорошо, но получился достаточно нетривиальным, поэтому мне интересно насчет других подходов.
no subject
Хотя, готов поспорить, у тебя не дотнет. =)
no subject
no subject
WS_CLIPSIBLINGS
иWS_CLIPCHILDRED
. По идее, они одлжны помочь избежать отрисовки несколько раз. Кроме того, можно еще попробовать художественно обрабатыватьWM_ERASEBKGND
(но, кажется, еще есть стили, которые благотворно влияют на его дефолтную обработку).