Вопрос к коллегам
Sep. 14th, 2010 10:37 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я по ходу дела много раз сталкивался с задачей отрисовки окон без мелькания при перемещении/скрытии/появлении.
Специально подчеркну: речь не идет об устранении мелькания при отрисовке вообще, и про технологию 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
Date: 2010-09-14 07:10 pm (UTC)Хотя, готов поспорить, у тебя не дотнет. =)
no subject
Date: 2010-09-14 07:29 pm (UTC)no subject
Date: 2010-09-16 09:51 pm (UTC)WS_CLIPSIBLINGS
иWS_CLIPCHILDRED
. По идее, они одлжны помочь избежать отрисовки несколько раз. Кроме того, можно еще попробовать художественно обрабатыватьWM_ERASEBKGND
(но, кажется, еще есть стили, которые благотворно влияют на его дефолтную обработку).