Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перерисовка перекрывающихся окон, мерцание 
:(
    Опции темы
deniska
Дата 29.9.2014, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



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

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


Спасибо.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  AnimatedMovement.zip 976,63 Kb
PM MAIL ICQ   Вверх
deniska
Дата 29.9.2014, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



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

Проблема в том что когда кнопки частично накладываются друг на друга, не смотря на Z-order, каждая пытается перерисовать себя первой, возникает мерцание и в конечном итоге неправильная отрисовка.
PM MAIL ICQ   Вверх
Amp
Дата 30.9.2014, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



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

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

А при уходе с MFC/WinAPI ты много кода просто выкинешь, потому что в современных библиотеках для UI все это делается гораздо проще и лаконичнее.
PM MAIL   Вверх
deniska
Дата 2.10.2014, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Amp,  спасибо за ответ.

to all, пока тема не помечена, как решенная, я ее мониторю в надежде Ваших мнений/вариантов!!!
пока выходит, что на чистом mfc/winapi реализовать анимацию перемещения элементов, смены окон, прокрутки списков реализовать реально проблематично...
PM MAIL ICQ   Вверх
Amp
Дата 2.10.2014, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Если у тебя есть возможность соскочить на .NET/C#, то настоятельно рекомендую WPF. Он для таких вещей и придуман. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.