Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Перерисовка перекрывающихся окон


Автор: deniska 29.9.2014, 13:36
Собственно суть:
озадачили тут меня, хотят красивостей и экшена на морде программы, 
хотел вот попробовать реализовать простейшую анимацию а-ля "плавно развернуть-свернуть элементы". Есть 4 кнопки, начальные координаты и размер у всех одинаковы. по нажатию на верхнюю из них - плавно вываливаются вниз все кнопки, еще раз нажать - сворачиваются в одну. Проблема в том, что хоть и пытаюсь задать Z-order, в положении когда все кнопки хоть чуть чуть перекрывают друг друга - начинается мерцание, не прорисовка контуров кнопок и прочая бяка. Чтоб не голословить - пример прилагаю. 
1. Чего с этим делать и как быть
2. Правилен ли сам подход к реализации "анимации" или есть другие варианты?

ну и так, факультативно: может кто сталкивался, и такое проще реализовать например в QML/QtQuick 2.0. В выборе платформы я в принципе не ограничен, пугает только то, что при уходе от mfc/winapi придется много кода переписывать((


Спасибо.

Автор: deniska 29.9.2014, 16:11
смотрю число скачиваний примера просто зашкаливает))
попробую на пальцах описАть что там сделано:
задал кнопкам Z-order через SetWindowPos
по нажатию на кнопку запускается оконный таймер, в обработчике которого меняются координаты кнопок в пересчете на кол-во времени с момента запуска таймера. Положение кнопок меняю MoveWindow(..., FALSE) 
после перемещения всех кнопок, вызывается InvalidateRect для каждой, в зависимости от степени видимости.

Проблема в том что когда кнопки частично накладываются друг на друга, не смотря на Z-order, каждая пытается перерисовать себя первой, возникает мерцание и в конечном итоге неправильная отрисовка.

Автор: Amp 30.9.2014, 12:56
Думаю, такие вещи лучше делать на тулкитах с owner-drawn отрисовкой контролов и "изкоробочной" двойной буферизацией всего этого дела (Qt, QtQuick). К тому же в Qt есть вспомогательные классы вроде QPropertyAnimation, с помощью которых анимация делается очень просто без шаманств с таймерами и самописными easing curves. 

Делать такие вещи через WinAPI не очень приятно, тут ведь даже честной прозрачности у контролов нет. Я бы поэтому не сильно полагался на z-order. К тому же на Windows Vista/7 наведение мыши на кнопку вызывает ее анимацию - система с определенной периодичностью начинает перерисовывать кнопку, причем, судя по всему, целиком и z-order в данной ситуации ее не сильно интересует. Да и на XP при наведении она ее тоже всю перерисует, только без анимации. Можешь конечно всю отрисовку взять на себя, рисую контролы через DrawThemeBackground именно так как тебе нужно - но эта еще тонна кода smile

А при уходе с MFC/WinAPI ты много кода просто выкинешь, потому что в современных библиотеках для UI все это делается гораздо проще и лаконичнее.

Автор: deniska 2.10.2014, 08:43
Amp,  спасибо за ответ.

to all, пока тема не помечена, как решенная, я ее мониторю в надежде Ваших мнений/вариантов!!!
пока выходит, что на чистом mfc/winapi реализовать анимацию перемещения элементов, смены окон, прокрутки списков реализовать реально проблематично...

Автор: Amp 2.10.2014, 11:44
Если у тебя есть возможность соскочить на .NET/C#, то настоятельно рекомендую WPF. Он для таких вещей и придуман. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)