![]() |
|
![]() ![]() ![]() |
|
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
Собственно суть:
озадачили тут меня, хотят красивостей и экшена на морде программы, хотел вот попробовать реализовать простейшую анимацию а-ля "плавно развернуть-свернуть элементы". Есть 4 кнопки, начальные координаты и размер у всех одинаковы. по нажатию на верхнюю из них - плавно вываливаются вниз все кнопки, еще раз нажать - сворачиваются в одну. Проблема в том, что хоть и пытаюсь задать Z-order, в положении когда все кнопки хоть чуть чуть перекрывают друг друга - начинается мерцание, не прорисовка контуров кнопок и прочая бяка. Чтоб не голословить - пример прилагаю. 1. Чего с этим делать и как быть 2. Правилен ли сам подход к реализации "анимации" или есть другие варианты? ну и так, факультативно: может кто сталкивался, и такое проще реализовать например в QML/QtQuick 2.0. В выборе платформы я в принципе не ограничен, пугает только то, что при уходе от mfc/winapi придется много кода переписывать(( Спасибо. Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
смотрю число скачиваний примера просто зашкаливает))
попробую на пальцах описАть что там сделано: задал кнопкам Z-order через SetWindowPos по нажатию на кнопку запускается оконный таймер, в обработчике которого меняются координаты кнопок в пересчете на кол-во времени с момента запуска таймера. Положение кнопок меняю MoveWindow(..., FALSE) после перемещения всех кнопок, вызывается InvalidateRect для каждой, в зависимости от степени видимости. Проблема в том что когда кнопки частично накладываются друг на друга, не смотря на Z-order, каждая пытается перерисовать себя первой, возникает мерцание и в конечном итоге неправильная отрисовка. |
|||
|
||||
Amp |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
Думаю, такие вещи лучше делать на тулкитах с owner-drawn отрисовкой контролов и "изкоробочной" двойной буферизацией всего этого дела (Qt, QtQuick). К тому же в Qt есть вспомогательные классы вроде QPropertyAnimation, с помощью которых анимация делается очень просто без шаманств с таймерами и самописными easing curves.
Делать такие вещи через WinAPI не очень приятно, тут ведь даже честной прозрачности у контролов нет. Я бы поэтому не сильно полагался на z-order. К тому же на Windows Vista/7 наведение мыши на кнопку вызывает ее анимацию - система с определенной периодичностью начинает перерисовывать кнопку, причем, судя по всему, целиком и z-order в данной ситуации ее не сильно интересует. Да и на XP при наведении она ее тоже всю перерисует, только без анимации. Можешь конечно всю отрисовку взять на себя, рисую контролы через DrawThemeBackground именно так как тебе нужно - но эта еще тонна кода ![]() А при уходе с MFC/WinAPI ты много кода просто выкинешь, потому что в современных библиотеках для UI все это делается гораздо проще и лаконичнее. |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
Amp, спасибо за ответ.
to all, пока тема не помечена, как решенная, я ее мониторю в надежде Ваших мнений/вариантов!!! пока выходит, что на чистом mfc/winapi реализовать анимацию перемещения элементов, смены окон, прокрутки списков реализовать реально проблематично... |
|||
|
||||
Amp |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
Если у тебя есть возможность соскочить на .NET/C#, то настоятельно рекомендую WPF. Он для таких вещей и придуман.
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |