Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > AlphaBlend только в тех местах где нет компонентов |
Автор: Delphist 7.6.2007, 14:17 |
У формы есть такое свойство как AlphaBlendValue, которое делает форму прозрачной. Скажите, пожалуйста, как сделать так, чтобы прозрачность не проявлялась на компоненты, которые расположены на этой форме. Т.е. если я размещаю на форме панельку, то AlphaBlendValue делает прозрачной не только форму, но и панель, а мне нужно чтобы только панель. |
Автор: Delphist 7.6.2007, 16:33 |
Или хотя бы для определенного цвета. На форме есть Label белого цвета, и я говорю, что на белый цвет прозрачность не применять, и получится что метка не будет прозрачной. |
Автор: Alexeis 7.6.2007, 20:17 |
Как вариант сделать 2 формы, одну под другой. Форма с контролами будет непрозрачной, только в местах где контролы, а нижняя уже по вкусу ![]() |
Автор: MetalFan 7.6.2007, 22:02 |
а с регионами ничего нельзя тут прикрутить? |
Автор: Sunvas 8.6.2007, 10:45 |
Может аттач натолкнет на какие-то мысли.. |
Автор: Alexeis 8.6.2007, 11:09 |
MetalFan, А что с ними можно сделать кроме дырки? А нужно как раз антипод дырки. Sunvas, мдя этот пример не для слабых видюх. У меня большая задержка на перерисовку. Быстрое решение возможно если использовать UpdateLayeredWindow , но при этом прийдеться все контролы рисовать руками. |
Автор: Sunvas 8.6.2007, 11:19 |
Alexeis, А что, если форму сделать прозрачной, а у элементов прозрачность убрать? Или прозрачность наследуется? |
Автор: Alexeis 8.6.2007, 11:38 |
Прозрачность не устанавливается для детей. |
Автор: Delphist 8.6.2007, 12:19 |
Как её убрать? Добавлено через 1 минуту и 4 секунды Не правда! Все контролы лежщие на форме также делаются прозрачными, если формы прозрачна, а надо бы запретить. Добавлено через 9 минут и 3 секунды Нужно подобие примера Sunvas'a только чтобы отрисовка выполнялась без тормозов. |
Автор: Delphist 8.6.2007, 16:21 | ||
Ну так как решить мой вопрос? |
Автор: misha_mike 8.6.2007, 16:46 |
Можно подумать на тему OnPaint. При помощи PaintTo рисовать контролы прямо на DC рабочего стола. Только со стиранием прийдется повозиться, но думаю реально. |
Автор: Mephisto 8.6.2007, 17:00 | ||
Вот как дельфина делает альфабленд:
Что вам мешает проделать то же с каждым из компонентов? Каждому сказать что он не альфаблендится? Попробуй по крайней мере! |
Автор: bems 8.6.2007, 17:10 |
Mephisto, SetLayeredWindowAttributes работает только с top-level окнами |
Автор: Alexeis 8.6.2007, 17:36 | ||
Пробовал. :( Рисует криво (Без XP стиля). |
Автор: Delphist 8.6.2007, 18:07 |
Ну покажи, хотя бы напримере 2-х компонентов |
Автор: Sunvas 8.6.2007, 21:31 |
Общем долго-долго я над этим игрался. Использовал всю мощь сего форума - никак не получается для контролов на форме сделать. Как-то видно винда определяет что не форма это. Мой приговор - невозможно. |
Автор: misha_mike 9.6.2007, 00:56 |
Ну почему сразу невозможно? Тут уже предлагали: делаем два одинаковых по размеру окна, одно с альфа-каналом без контролов, а над ним второе с контролами и WS_EX_TRANSPARENT. Остается синхронизировать все операции над ними и обеспечить всегда правильный взаимный z-order. Изврат, но если заказчик так хочет изврат -- пусть его и получает, кто ж ему лекарь? |
Автор: Delphist 9.6.2007, 10:44 |
Ну а как же заставка AutoCad 2006 |
Автор: Alexeis 9.6.2007, 10:55 |
Я даже попробовал его. Трудновато А так выглядит очень даже ничего. |
Автор: sw04 9.6.2007, 19:25 |
Чем Вам не угодил пример из статьи прозрачности форм? получается ровно так как надо - все компоненты изображены нормально, а сама форма прозрачная. Есть минус в перерисовке при любом движении окна, но другого решения пока не видел. |
Автор: Alexeis 9.6.2007, 19:44 |
Так она наверное без конролов совсем. |
Автор: Yanis 9.6.2007, 22:17 |
Вот какой изврат я нарисовал ![]() Прежде чем качать можете глянуть http://yanis.front.ru/images/screen.jpg. Основной принцип заключается в создании второй прозрачной формы, которая всегда располагается под основной формой. Дырки в основной форме я добился с помощью её свойсвта Transparent и TransparentColor. Скачивайте, смотрите. |
Автор: Alexeis 9.6.2007, 22:40 |
Yanis, Ну ты бы хоть рассказал вкратце, что главная форма у тебя полностью прозрачная и на ней все компоненты, а нижняя форма полупрозрачная и пустая с убранным заголовком. Вот только есть один ньюанс, когда по форме кликаешь, то она чуток подмигивает, но обработчик быстро поднимает на верх нужную форму. Теперь можно нижнюю сделать вообще с изменяющейся прозрачностью. Работает быстро и почти безупречно. Зачет. |
Автор: Yanis 9.6.2007, 22:43 |
Alexeis Всё таки лучше один раз потрогать, чем сто раз прочитать ![]() Я думаю, что с не VCL-евскими окошками вообще летать будет. |
Автор: Yanis 9.6.2007, 23:55 | ||||||
Alexeis Твои слова
![]() Достаточно заменить:
на
Исправленный исходник прилагается. В этот раз только код. |
Автор: ivan219 10.6.2007, 10:56 |
Eсли можно раскажите суть метода а то я так и непонял ![]() |
Автор: Yanis 10.6.2007, 11:24 | ||||
А ты скачай. Там же всё просто. Попробуй такой код на пустой форме:
Все контролы с цветом clPurple, расположенные теперь на этой форме будут дырявить форму. Если дописать:
![]() Что бы нельзя было кликнуть «под формой», я располагаю форму с прозрачностью 1 под главной формой. |
Автор: Alexeis 10.6.2007, 12:41 | ||
Более того нижнюю форму можно сделать с градиентной прозрачностью, т.е. плавно растворяющуюся к краям. Это делается при помощи UpdateLayeredWindow. В ней можно задать прозрачность каждого пиксела. Как я понял эта функция была введена для создания стартовых окошек, потому на ней не видны контролы. Но она очень даже подошла бы как фон к примеру Яниса. |
Автор: Alexeis 10.6.2007, 14:00 | ||||
Вот гибрид на основе примеров Яниса и Гирдера. Теперь в качестве фона у нас круговой градиент похожий на стекло бутылки.
|
Автор: Yanis 10.6.2007, 15:08 |
Alexeis![]() А где Girder такой пример давал? |
Автор: aktuba 10.6.2007, 15:20 |
Alexeis, жестоко глючит пример!!!![]() |
Автор: ivan219 10.6.2007, 15:23 |
Симпатично ![]() |
Автор: Alexeis 10.6.2007, 19:59 |
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=100336 Раскрой секрет как это удалось сделать? Явно формы разделились. ![]() ![]() |
Автор: Yanis 10.6.2007, 20:06 |
Это может быть у кого угодно. Главное что бы побольше прог было запущено и комп тормозил ![]() |
Автор: Alexeis 10.6.2007, 20:32 | ||
Не это не влияет. Я запустил 2 экземпляра проги
И раскидал по обоим процам. (добился 100% загрузки). И начал гонять эту прогу. Она тормозила жутко на перемещении, но такого поймать мне не удалось ![]() |
Автор: aktuba 10.6.2007, 21:52 | ||
Скачал и запустил из архива. Никакого секрета, никакой загрузки компа... |
Автор: Alexeis 10.6.2007, 22:56 |
Винда XP? |
Автор: aktuba 10.6.2007, 23:13 | ||
Да. |
Автор: Delphist 13.6.2007, 09:32 |
Yanis, спасибо за пример, есть один недостаток - не работает OnClick панели, и формы. Помоги это исправить. |
Автор: Alexeis 13.6.2007, 09:56 | ||||
Все нормально, только не нужно создавать лишних обработчиков, ведь клики формы уже обрабатываются тут. Дописать свой код вместо showmessage('Form_click'); и все.
|
Автор: GELEAF 1.11.2007, 22:47 |
Я поставил полупрозрачную png картинку на форму при запуску она небыла полупрозрачна...почему? И вообше мне кажется надо не дырку в форме сделать а полу прозрачную форму с полностью непрозрачными контролами |
Автор: Alexeis 1.11.2007, 22:56 | ||
Потому что такого механизма нет. Нужно pngшку превратить в bmpшку 32 бита на цвет и задать ее в UpdateWindowLayer, как это делается в примере. |
Автор: MetalFan 10.2.2008, 18:26 |
поковырял тут на тему решения сабжа с пом. UpdateLayeredWindow. вот, что получилось: ![]() замеченные баги: не отрисовывается курсор в edit. не отображается ItemIndex в ListBox... и пр. |
Автор: windbear 17.4.2008, 00:09 |
MetalFan, пример хорош, но тормозит ужасно... по крайней мере полной отрисовки не происходит.. при фокусе на едите, каретка не отображается |
Автор: MetalFan 17.4.2008, 08:32 | ||
странное у тебя понятие "тормозов" это мы и так знаем |
Автор: kr3v3tkus 9.3.2009, 12:08 |
народ сори, я смотрю тема относительно старая, мб появились новые, более простые решения? или также только подстановка форм и самостоятельная перерисовка? |
Автор: Delphist 10.3.2009, 13:30 | ||
а с чего они вдруг появяться? |
Автор: kr3v3tkus 11.3.2009, 02:53 |
ну я не слишком секу![]() |
Автор: Delphist 11.3.2009, 11:37 | ||
Ага ![]() |
Автор: Alexeis 11.3.2009, 12:41 |
Все это делается средствами ОС. Если можно было бы такое сделать, то ввели бы. |
Автор: Teleport 15.3.2009, 06:45 |
выкладываю давно найденный мною пример - может кому интересен будет. Компонет + demo пример. На 2007 делфи поставился без проблем. Правда перерисовка тормозит при перетаскивании окна. Не ругайте если не понравится ![]() |
Автор: Teleport 15.3.2009, 06:49 |
+ часть 2 |