Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2010, 05:14   #1
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
Лампочка Эффекты формы Aero Show и Aero Hide

Доброго времени суток! Вопрос к знатокам!
Я делаю программку и пытаюсь реализовать эффекты формы Aero Show и Aero Hide в Windows XP так же как это делают AlphaSkins... Вот вроде бы получилось, но как всегда свои заморочки...

Вот здесь выкладываю свой код проекта!

А здесь демку... чтобы увидеть эффект Aero выберите какую-нибудь картинку формата так 300х300 и откройте... и увидите эффект... Закрыть форму можно просто кликнув по ней левой кнопкой мышки...

Вопрос: Как узнать момент когда форма пропадает... Чтобы сделать скриншот указанной области и чтобы форма не попала в этот скриншот?

Я делаю так:
Код:
Form1.Hide;
Sleep(100);

//...
И дальше пошел код, но на слабом компе мне кажется форма не исчезнет за эти 100 МС и нужно выставить побольше, а на сильном форма пропадёт в момент, а эти 100 МС форма будет спать... хотелось бы чтобы только форма скрылась - узнаем этот момент и делаем скриншот заданной области! Как такое можно реализовать? Как отловить момент полного исчезновения формы?

И другой вопрос: Все кто смотрел данный код, скажите плз правильно реализовано или мб. есть другой более простой способ?..

Заранее спасибо!
Вложения
Тип файла: rar Код AeroShowHide.rar (8.8 Кб, 88 просмотров)
Тип файла: rar Откомпилированное Demo.rar (677.5 Кб, 131 просмотров)

Последний раз редактировалось SalasAndriy; 04.10.2010 в 15:53.
SalasAndriy вне форума Ответить с цитированием
Старый 04.10.2010, 19:45   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

неплохая реализация! и твои опасения не подтвердились, у меня комп слабый, но никаких ошибок и недостатков не было замечено
ZuBy вне форума Ответить с цитированием
Старый 04.10.2010, 23:33   #3
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
эффекты формы Aero Show и Aero Hide в Windows XP так же как это делают AlphaSkins...
А если я например не видел как делает AlphaSkins? Можно более наглядный пример/описание требуемого?))
Цитата:
Вопрос: Как узнать момент когда форма пропадает... Чтобы сделать скриншот указанной области и чтобы форма не попала в этот скриншот?
Эм... Зачем? о__О

* ушёл изучать исходник *
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 05.10.2010, 19:21   #4
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Цитата:
А если я например не видел как делает AlphaSkins? Можно более наглядный пример/описание требуемого?))
Вот наглядный пример:


Цитата:
Эм... Зачем? о__О
Потому чтобы сделать такой эффект я сначала делаю скрин заданной области потом на GetDC(0) рисую с определённой прозрачностью картинку своего окошка... Постепенное появление и увеличении как я наглядно и показал... Такой эффект есть в Win7... А при закрытии формы так же нужно спрятать, отскринить заданную область и снова рисовать всё только в обратном направлении угасания...
SalasAndriy вне форума Ответить с цитированием
Старый 05.10.2010, 20:03   #5
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

эмм... на мой взгляд нужно реализовывать в отдельных нитях всех и использовывать TEvent
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 05.10.2010, 20:44   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Ну так нужно просто уменьшать окно, зачем скрин-то? о__О
Всё что потребуется - изображение всего своего окна, но это думаю через PrintWindow лучше...

А AnimateWindow "уже не то"?))

Ща попробую...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 05.10.2010, 20:46   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Потому чтобы сделать такой эффект я сначала делаю скрин заданной области потом на GetDC(0) рисую с определённой прозрачностью картинку своего окошка... Постепенное появление и увеличении как я наглядно и показал... Такой эффект есть в Win7... А при закрытии формы так же нужно спрятать, отскринить заданную область и снова рисовать всё только в обратном направлении угасания...
1. Такие эффекты надо делать с помощью Layered окон
2. В Win7/Vista за это отвечает DWM (Dynamic Windows Manager), именно он рендерит все окна в памяти и в конце концов формирует целевое изображение, но исходя из того, что это системная библиотека скрывающая куча API от нас, то и работает она намного быстрее, и в уровне пользователя не выйдет достичь такой скорости и качества.
3. То что вы делаете, это грубо говоря "извращение", т.к. создавать дополнительную нагрузку (скриншот, рисование на контексте целевого изображения (окна)), ну сами подумайте
4. если речь идет о реализации собственной библиотеки, которая предоставляла бы подобные эффекты, и была бы не зависима от платформы (имеется ввиду не менее NT) то лучше реализуйте не исходя из логики VCL, а сразу из Layered (слоев), т.е. каждый контрол уже сразу слой, не пытайтесь строить на основе VCL, это жесть вы не первый.
BOBAH13 вне форума Ответить с цитированием
Старый 05.10.2010, 21:23   #8
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

ВОВАН13 я всё понимаю поэтому и задал вопрос:
Цитата:
Все кто смотрел данный код, скажите плз правильно реализовано или мб. есть другой более простой способ?..
я не "извращаюсь" а пытаюсь решить поставленную задачу любым способом... это первое что пришло на ум)) но я уверен в том что этот способ плохой, поэтому и прошу помощи...

Мне не нужно окно на слоях, а мне нужен только сам эффект пусть даже он будет с помощью Layered окон, допустим так: показываю эффект и по окончанию его я поверх вывожу уже готовую форму VCL, а Layered оконо закрываю... Но получится ли так как мне нужно? подскажите в каком направлении копать?)

Я пробовал это делать с помощью Form.AlphaBlendValue... И получилось ужасное зрелище... у меня комп не очень сильный... и наблюдал тормоза... а быстрее получилось рисовать на контексте... вот...

Цитата:
А AnimateWindow "уже не то"?))
Там совсем не тот эффект что мне нужен...

Последний раз редактировалось SalasAndriy; 05.10.2010 в 21:34.
SalasAndriy вне форума Ответить с цитированием
Старый 05.10.2010, 21:42   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Там совсем не тот эффект что мне нужен...
Там ж их много...)
Слегка не подумал сначала - нужно именно с полупрозрачностью чтоб? Я почему-то решил что не обязательно...)
Цитата:
Я пробовал это делать с помощью Form.AlphaBlendValue...
Такой эффект? Это как же?
Цитата:
реализуйте не исходя из логики VCL, а сразу из Layered (слоев), т.е. каждый контрол уже сразу слой
М... На этот раз как-то не очень понял что вы имеете ввиду... %)
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 05.10.2010, 21:50   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
М... На этот раз как-то не очень понял что вы имеете ввиду... %)
Ну имеется ввиду порядок сообщений, WM_ERASEBACKGND (или как там) потом WM_PAINT, потом NC сообщения и еще куча, ну тот же API Windows GDI, а слои логика совсем другая - нарисовал (хоть вообще один раз) в память на HDC, потом обновил раз и забыл. Если исходить из логики VCL, т.е. для "как бы" обратной связи для Layered Windows, то ничего хорошего не выйдет, поверьте

А разве создание Layered окна и манипуляции скрытия/показа это не "извращение" ? ну да ладно, пробуйте разные идеи, и реализуйте, больше опыта получите.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форма Aero GBAXA Общие вопросы Delphi 7 22.08.2010 13:53
Windows 7. Как сменить обои и цвет прозрачности Aero программно? TwiX Помощь студентам 1 02.11.2009 17:59
Windows Vista\7 Aero - проблемы! Vol666 Общие вопросы Delphi 7 06.09.2009 12:52
Проблема с DWM Aero Ivan_32 Win Api 0 25.06.2009 22:06