| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 именно так как тебе нужно - но эта еще тонна кода А при уходе с MFC/WinAPI ты много кода просто выкинешь, потому что в современных библиотеках для UI все это делается гораздо проще и лаконичнее. |
| Автор: deniska 2.10.2014, 08:43 |
| Amp, спасибо за ответ. to all, пока тема не помечена, как решенная, я ее мониторю в надежде Ваших мнений/вариантов!!! пока выходит, что на чистом mfc/winapi реализовать анимацию перемещения элементов, смены окон, прокрутки списков реализовать реально проблематично... |
| Автор: Amp 2.10.2014, 11:44 |
| Если у тебя есть возможность соскочить на .NET/C#, то настоятельно рекомендую WPF. Он для таких вещей и придуман. |