![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Анимированне обои раб.стола [D6, D7, Win2k, WinXP]
П7 © (2004-10-12 17:50:00)Теория понятна: Делаем Flash-ролик и отрисовываем его на канве раб стола за иконками. Вся проблема в том, что никак не удаётся добраться до этой самой канвы. Всё, что удалось достич - это получание HDC ЛистБокса, в котором эти иконки располагаются. Но в этом случае иконки так страшно обновляются, что пропадает всякое желание... (:
Уважаемые товарищи, есть ли решение этой проблемы? Поможите пожалуйста, кто чем может. (:
П7 (2004-10-14 10:44:00) [1]ну чтоже, если без статьи не обойтись, значит сейчас сяду читать, потом отчитаюсь... (:
DVM (2004-10-13 23:51:00) [2]
> Т.е. если иконка тоже будет иметь пару пикселей цвета фона
> - на них тоже будет отрисовка идти?
Да, но цвет обычно выбирают таким, чтобы он вряд ли где встречался. Какой-нибудь грязно-болотно-зеленый-бурый. Потому совпадения исключены.
> Слухай, а что вообще такое, этот оверлей? (: Можно ли его
> как-нибудь поиметь без DirectDraw?
Можно. Только насчет скорости не уверен, медленно будет. Суть в следующем. Делать надо только на API.
1) Берем изображение с экрана.
2) Сканируем его в цикле и выделяем точки с нашим цветом (GetPixel).
3) Если есть наш цвет, то заменяем его на точку с нашего изображения (SetPixel)
Мерцать оно может и не будет. Но медленно это (Get/SetPixel).
DirectDraw напрямую работает с оборудованием и драйвером потому его скорость на 2 порядка выше.
Sapersky (2004-10-13 23:47:00) [3]Слухай, а что вообще такое, этот оверлей?
Вообще-то, там (в статье) всё написано :)
Но если уж совсем не хочется вникать - можно и не, хотя такой подход настоятельно не рекомендуется :). В примере всё что нужно есть - можно просто заменить рисование огня на рисование флэша:
OleDraw(Flash.OleObject, 1, FDIB.hDC, Flash.BoundsRect);
FDIB - битмап, в который рисуется (в данном случае TFastDIB). Затем битмап копируется в оверлей (DXOverlay.DrawImage).
Можно ли его как-нибудь поиметь без DirectDraw?
Теоретически - через OpenGL.
П7 (2004-10-13 22:51:00) [4]Т.е. если иконка тоже будет иметь пару пикселей цвета фона - на них тоже будет отрисовка идти?
Слухай, а что вообще такое, этот оверлей? (: Можно ли его как-нибудь поиметь без DirectDraw?
DVM (2004-10-13 21:25:00) [5]
> У меня подозрение, что фон SysListView прозрачный, а за
> ним есть нечто, где отрисовывается обоина или ActiveDesctop.
Нет, он не прозрачный. Он отрисовывает свой фон сам. Это нечто - это еще одно окно, которое тоже отрисовывает свой фон. Ниже всего - десктоп, на нем лежит картинка (если она bmp).
> Ну вот я видел достаточно быструю реализацию отрисовки Flash'а.
100% сделано через оверлей. Проверить можно так. Открой свойства экрана. Посмотри там цвет фона рабочего стола. Везде, где на экране будет такой цвет должна крутиться флэшка.
П7 (2004-10-13 21:14:00) [6]Ну вот я видел достаточно быструю реализацию отрисовки Flash'а.
У меня подозрение, что фон SysListView прозрачный, а за ним есть нечто, где отрисовывается обоина или ActiveDesctop. Но как до туда добраться?
DVM (2004-10-13 19:18:00) [7]
> В принципе, можно подменить только перерисовку. Задать ему
> свою оконную процедуру или хук поставить. Отлавливать WM_PAINT
> (или WM_ERASEBACKGROUND - хорошо, если обои по этому сообщению
> рисуются, но такое счастье маловероятно :)), рисовать что
> надо, остальные сообщения отправлять в стандартную процедуру.
> Только вот сомнительно, что в динамике оно будет нормально
> работать, допустим, если пользователь перетаскивает иконку...
Обои действительно рисуются по WM_ERASEBACKGROUND окнами Progman и SysListView32 и рисуются они функцией PaintDesktop() если не включен ActiveDesktop. Если включен - я вообще не понимаю как рисуется такой фон в виде веб-страницы в фоне ListView. Работать то оно будет, но не надо забывать, что картина анимированная и экран надо обновлять. Обновлять часто. Если фон мы худо-бедно нарисуем (хотя BitBlt здесь будет работать на грани своих возможностей), то SysListView свои значки будет выводить на порядок дольше и все будет дико мерцать. Вывод один - не трогать значки и РИСОВАТЬ МЕЖДУ НИМИ. Будет казаться что фон анимирован. Тут вот и нужен оверлей. Штука весьма шустро работающая и DirectX быстрее BitBlt(), но Flash на полный экран - тормоз еще тот.
П7 (2004-10-13 18:18:00) [8]Видео - мастдай для данной задумки. Слишком много весит. Собственно видео будет примерно равно ГИФу, может немного меньше. Опять же в видео не добавишь некой доли рендомайзера для эффектов (дождя, например, снега и т.д.)
Подумалось:
Я не совсем разбираюсь, что же такое оверлей, но ведь он тоже где-то отрисовывает себя? (: Может я тудаже буду Flash отрисовывать?
WondeRu (2004-10-13 18:10:00) [9]Было бы прикольно, но жутко отвлекает от основных компутерных работ)
тогда лучше взять любой стандартный проигрыватель, который вопроизводит видео на десктопе... DivX Player н-р
П7 (2004-10-13 18:08:00) [10]Это вероятно была какая-то очень низкопробная картинка. А если сделать, скажем, водопад с брызгами на фоне ночного неба с сыпящимися каметами, и чтобы звук можно было присобачить. И чтобы зверьё бродило какое... Там ГИФ получится на пару десятков метров... (:
WondeRu (2004-10-13 17:52:00) [11]П7 (13.10.04 17:49) [14]
Да ты издеваешься?
совсем нет! у меня месяц на рабочем столе дохлый Дед Мороз висел))) вокруг него мухи летали)))
П7 (2004-10-13 17:49:00) [12]
> WondeRu © (13.10.04 17:27) [13]
Да ты издеваешься? ГИФ у тебя столько ресурсов будет отжирать, что я лучше сразу format c:... (:
Нет, тут нужно что-нибудь хитрожопое придумать!!! (:
WondeRu (2004-10-13 17:27:00) [13]ЛЮДИ!!!!! АУУУ!
Делаете анимированный ГИФ и кидаете на рабочий стол!
Sapersky (2004-10-13 17:15:00) [14]Полностью свой рабочий стол, включая обработку ввода - это, ИМХО, сложнее (и уж точно объёмнее), чем оверлей.
В принципе, можно подменить только перерисовку. Задать ему свою оконную процедуру или хук поставить. Отлавливать WM_PAINT (или WM_ERASEBACKGROUND - хорошо, если обои по этому сообщению рисуются, но такое счастье маловероятно :)), рисовать что надо, остальные сообщения отправлять в стандартную процедуру.
Только вот сомнительно, что в динамике оно будет нормально работать, допустим, если пользователь перетаскивает иконку...
П7 (2004-10-13 13:48:00) [15]Но этоже изврат - выводить Flash через DirectDraw... Опять же Flash нужен для удобного создания этих самых обоин. Не писать же собственный формат и редактор. Я же не Macromedia... (: Я лопну один такое написать. Но ведь кто-то сделал это. Значит и остальные должны.
Можно было бы написать полностью свой Рабочий стол. Т.е. схавать всю инфу о текущем Раб.столе и затем всё это отрисовать в своей программе. Но как затем подменить имеющийся Раб.стол своей формой?
Sapersky (2004-10-13 12:48:00) [16]Да, мне тоже говорили, что через ActiveDesktop тормозит.
DVM (2004-10-13 11:47:00) [17]Самый безглючный способ - так как описано в статье. Все остальное - шаманство, работающее не во всех версиях системы и тормозящее тоже прилично.
П7 (2004-10-13 10:43:00) [18]Ну так вот как??? (:
KSergey (2004-10-13 07:17:00) [19]Ну или свой ActiveX туда пихнуть...
KSergey (2004-10-13 07:15:00) [20]ММ....
А мне всегда казалось, что этот флеш суется в HTML-код и на раб. столе - ActiveDesktop.... Само вроде работать должно.