Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

Анимированне обои раб.стола   Найти похожие ветки 

 
П7   (2004-10-12 17:50) [0]

Теория понятна: Делаем Flash-ролик и отрисовываем его на канве раб стола за иконками. Вся проблема в том, что никак не удаётся добраться до этой самой канвы. Всё, что удалось достич - это получание HDC ЛистБокса, в котором эти иконки располагаются. Но в этом случае иконки так страшно обновляются, что пропадает всякое желание... (:
Уважаемые товарищи, есть ли решение этой проблемы? Поможите пожалуйста, кто чем может. (:


 
П7   (2004-10-12 18:22) [1]

Нда, видимо переработался, даже не смог правильно заголовок написать... "Анимированные обои рабочего стола". ВотЪ! (:
Ну хоть чем-нибудь помогите...


 
DVM ©   (2004-10-12 18:50) [2]

http://www.delphimaster.ru/articles/directx/index.html


 
Sapersky   (2004-10-12 22:09) [3]

Угу. Вполне реально, хотя и муторно (сначала рисовать флэш в битмап, потом копировать в оверлей...). Копирование при разумных размерах оверлея тормозит не очень (особенно если 16 bpp - через LUT), гораздо больше - сам флэш. Или мне ролики такие попадались тормозные?
Видел реализацию флэша на OpenGL ( http://tulrich.com/geekstuff/gameswf.html ) - но на Си, и, как признаёт автор, довольно глючную.


 
TUser ©   (2004-10-12 23:48) [4]


> не удаётся добраться до этой самой канвы. Всё, что удалось
> достич - это получание HDC ЛистБокса, в котором эти иконки
> располагаются.

Рабочий стол - понятие системы, а канва - понятие Delphi, так же как и листбокс.


 
П7   (2004-10-13 01:34) [5]


> TUser ©   (12.10.04 23:48) [4]

Это я всё образно, для понятности.

> Всё, что удалось достич - это получание HDC ЛистБокса

Вот. Через него, родимого, и рисовал.

Почему Flash? Просто видел реализацию подобного через Flash. Но такое удовольствие стоит от $15. Поиметь хочется ничего не отдавая взамен, кроме своего времени на писание программы. Плюс опять же народу может пригодится сей исходник и возможность создавать свои анимированные обои.


 
KSergey ©   (2004-10-13 07:15) [6]

ММ....
А мне всегда казалось, что этот флеш суется в HTML-код и на раб. столе - ActiveDesktop.... Само вроде работать должно.


 
KSergey ©   (2004-10-13 07:17) [7]

Ну или свой ActiveX туда пихнуть...


 
П7   (2004-10-13 10:43) [8]

Ну так вот как??? (:


 
DVM ©   (2004-10-13 11:47) [9]

Самый безглючный способ - так как описано в статье. Все остальное - шаманство, работающее не во всех версиях системы и тормозящее тоже прилично.


 
Sapersky   (2004-10-13 12:48) [10]

Да, мне тоже говорили, что через ActiveDesktop тормозит.


 
П7   (2004-10-13 13:48) [11]

Но этоже изврат - выводить Flash через DirectDraw... Опять же Flash нужен для удобного создания этих самых обоин. Не писать же собственный формат и редактор. Я же не Macromedia... (: Я лопну один такое написать. Но ведь кто-то сделал это. Значит и остальные должны.
Можно было бы написать полностью свой Рабочий стол. Т.е. схавать всю инфу о текущем Раб.столе и затем всё это отрисовать в своей программе. Но как затем подменить имеющийся Раб.стол своей формой?


 
Sapersky   (2004-10-13 17:15) [12]

Полностью свой рабочий стол, включая обработку ввода - это, ИМХО, сложнее (и уж точно объёмнее), чем оверлей.

В принципе, можно подменить только перерисовку. Задать ему свою оконную процедуру или хук поставить. Отлавливать WM_PAINT (или WM_ERASEBACKGROUND - хорошо, если обои по этому сообщению рисуются, но такое счастье маловероятно :)), рисовать что надо, остальные сообщения отправлять в стандартную процедуру.
Только вот сомнительно, что в динамике оно будет нормально работать, допустим, если пользователь перетаскивает иконку...


 
WondeRu ©   (2004-10-13 17:27) [13]

ЛЮДИ!!!!! АУУУ!

Делаете анимированный ГИФ и кидаете на рабочий стол!


 
П7   (2004-10-13 17:49) [14]


> WondeRu ©   (13.10.04 17:27) [13]

Да ты издеваешься? ГИФ у тебя столько ресурсов будет отжирать, что я лучше сразу format c:... (:
Нет, тут нужно что-нибудь хитрожопое придумать!!! (:


 
WondeRu ©   (2004-10-13 17:52) [15]

П7   (13.10.04 17:49) [14]
Да ты издеваешься?

совсем нет! у меня месяц на рабочем столе дохлый Дед Мороз висел))) вокруг него мухи летали)))


 
П7   (2004-10-13 18:08) [16]

Это вероятно была какая-то очень низкопробная картинка. А если сделать, скажем, водопад с брызгами на фоне ночного неба с сыпящимися каметами, и чтобы звук можно было присобачить. И чтобы зверьё бродило какое... Там ГИФ получится на пару десятков метров... (:


 
WondeRu ©   (2004-10-13 18:10) [17]

Было бы прикольно, но жутко отвлекает от основных компутерных работ)
тогда лучше взять любой стандартный проигрыватель, который вопроизводит видео на десктопе... DivX Player н-р


 
П7   (2004-10-13 18:18) [18]

Видео - мастдай для данной задумки. Слишком много весит. Собственно видео будет примерно равно ГИФу, может немного меньше. Опять же в видео не добавишь некой доли рендомайзера для эффектов (дождя, например, снега и т.д.)

Подумалось:
Я не совсем разбираюсь, что же такое оверлей, но ведь он тоже где-то отрисовывает себя? (: Может я тудаже буду Flash отрисовывать?


 
DVM ©   (2004-10-13 19:18) [19]


> В принципе, можно подменить только перерисовку. Задать ему
> свою оконную процедуру или хук поставить. Отлавливать WM_PAINT
> (или WM_ERASEBACKGROUND - хорошо, если обои по этому сообщению
> рисуются, но такое счастье маловероятно :)), рисовать что
> надо, остальные сообщения отправлять в стандартную процедуру.
> Только вот сомнительно, что в динамике оно будет нормально
> работать, допустим, если пользователь перетаскивает иконку...

Обои действительно рисуются по WM_ERASEBACKGROUND окнами Progman и SysListView32 и рисуются они функцией PaintDesktop() если не включен ActiveDesktop. Если включен - я вообще не понимаю как рисуется такой фон в виде веб-страницы в фоне ListView. Работать то оно будет, но не надо забывать, что картина анимированная и экран надо обновлять. Обновлять часто. Если фон мы худо-бедно нарисуем (хотя BitBlt здесь будет работать на грани своих возможностей), то SysListView свои значки будет выводить на порядок дольше и все будет дико мерцать. Вывод один - не трогать значки и РИСОВАТЬ МЕЖДУ НИМИ. Будет казаться что фон анимирован. Тут вот и нужен оверлей. Штука весьма шустро работающая и DirectX быстрее BitBlt(), но Flash на полный экран  - тормоз еще тот.


 
П7   (2004-10-13 21:14) [20]

Ну вот я видел достаточно быструю реализацию отрисовки Flash"а.
У меня подозрение, что фон SysListView прозрачный, а за ним есть нечто, где отрисовывается обоина или ActiveDesctop. Но как до туда добраться?


 
DVM ©   (2004-10-13 21:25) [21]


> У меня подозрение, что фон SysListView прозрачный, а за
> ним есть нечто, где отрисовывается обоина или ActiveDesctop.

Нет, он не прозрачный. Он отрисовывает свой фон сам. Это нечто - это еще одно окно, которое тоже отрисовывает свой фон. Ниже всего - десктоп, на нем лежит картинка (если она bmp).

> Ну вот я видел достаточно быструю реализацию отрисовки Flash"а.

100% сделано через оверлей. Проверить можно так. Открой свойства экрана. Посмотри там цвет фона рабочего стола. Везде, где на экране будет такой цвет должна крутиться флэшка.


 
П7   (2004-10-13 22:51) [22]

Т.е. если иконка тоже будет иметь пару пикселей цвета фона - на них тоже будет отрисовка идти?
Слухай, а что вообще такое, этот оверлей? (: Можно ли его как-нибудь поиметь без DirectDraw?


 
Sapersky   (2004-10-13 23:47) [23]

Слухай, а что вообще такое, этот оверлей?

Вообще-то, там (в статье) всё написано :)
Но если уж совсем не хочется вникать - можно и не, хотя такой подход настоятельно не рекомендуется :). В примере всё что нужно есть - можно просто заменить рисование огня на рисование флэша:

OleDraw(Flash.OleObject, 1, FDIB.hDC, Flash.BoundsRect);

FDIB - битмап, в который рисуется (в данном случае TFastDIB). Затем битмап копируется в оверлей (DXOverlay.DrawImage).

Можно ли его как-нибудь поиметь без DirectDraw?

Теоретически - через OpenGL.


 
DVM ©   (2004-10-13 23:51) [24]


> Т.е. если иконка тоже будет иметь пару пикселей цвета фона
> - на них тоже будет отрисовка идти?

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

> Слухай, а что вообще такое, этот оверлей? (: Можно ли его
> как-нибудь поиметь без DirectDraw?

Можно. Только насчет скорости не уверен, медленно будет. Суть в следующем. Делать надо только на API.

1) Берем изображение с экрана.
2) Сканируем его в цикле и выделяем точки с нашим цветом (GetPixel).
3) Если есть наш цвет, то заменяем его на точку с нашего изображения (SetPixel)

Мерцать оно может и не будет. Но медленно это (Get/SetPixel).
DirectDraw напрямую работает с оборудованием и драйвером потому его скорость на 2 порядка выше.


 
П7   (2004-10-14 10:44) [25]

ну чтоже, если без статьи не обойтись, значит сейчас сяду читать, потом отчитаюсь... (:



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.035 c
14-1097478870
TeNY
2004-10-11 11:14
2004.10.31
Дескриптор<->TObject;


3-1096900734
ANT1
2004-10-04 18:38
2004.10.31
Как в сессии изменить значение NLS_LANG ?


1-1098096942
Term
2004-10-18 14:55
2004.10.31
Сервер при приёме файла падает


3-1096545389
asdfgh
2004-09-30 15:56
2004.10.31
Упаковка DBF-файла


1-1097584420
Aleksandr.
2004-10-12 16:33
2004.10.31
Что случилось с Excel.Application?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский