| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Полупрозрачные окна |
| Автор: bems 14.6.2006, 00:23 |
| Хочу поизвращаться с дизайном окна. Я просто замечательно придумал как это должно выглядеть, но не имею понятия как это сделать. Идея такова: полупрзрачное окно неправильной формы. На нем область с другим AlphaBlend, и тоже неправильной формы. и в этой области и в остальной части окна больше чем один цвет. Сделать это нужно только на апи. Подскажите какой-нить изврат, пожалуйста... |
| Автор: ~FoX~ 14.6.2006, 13:49 |
| Неправильная форма - работа с регионами. Полупрозрачность - SetLayeredWindowAttributes Юзаем поиск и ФАК, темы поднимались не однократно! |
| Автор: bems 15.6.2006, 00:36 |
| Для больше, чем одного значения прозрачности на одном окне, не знаю как преминять. И поиск и MSDN не дают ответа на вопрос. |
| Автор: Snowy 15.6.2006, 08:18 |
| Не. На всё окно одна прозрачность. А для раздельной ничего стандартного нет. Тут уже идут глючные извращения. |
| Автор: Romikgy 15.6.2006, 09:04 |
| bems, имхо нужно создать не одно окно , а несколько |
| Автор: bems 15.6.2006, 10:20 |
да, буду извращаться таким образом. А как сделать это безглючно? В большом окне сделаю дырку для маленького. Как сделать чтобы оно всегда оставалось в этой дырке и в Z - порядке всегда было рядом? WM_WINDOWPOSCHANGED вроде не всегда получаю. Хотя в оконной процедуре у меня не без боков... |
| Автор: urix 15.6.2006, 14:24 |
| можете глянуть это: http://urixsoft.nm.ru/ru/index.htm?soft-ScrMon&frameleft_s и это http://urixsoft.nm.ru/ru/index.htm?soft-StartPPC&frameleft_s (с исходниками). Всё нехватает времени засесть за оптимизацию скорости, потому что работает значительно медленнее, чем я предполагаю возможно. Ну, и конечно же - как же без глюков... (в висте, например, эта реализация не работает, в XP - дефекты, когда друг над другом,...) |
| Автор: bems 18.6.2006, 09:40 |
| А вот теперь - ДА! UpdateLayeredWindow рулит |
| Автор: bems 19.6.2006, 10:16 | ||||
Есть функция UpdateLayeredWindow. Но разобраться с ней на 100% не выходит. В теории все выглядит так: нужно создать контекст устройства, битмап, выбрать битмап в контекст и в битмап напрямую (не в ДиСи) записывать значения прозрачности для каждой точки. Потом вызвать UpdateLayeredWindow с этим контекстом и общим значением прозрачности для всего окна. Реальная прозрачность в каждой точке должна быть результирующей между индивидуальной и общей. Это в теории. А на практике:из теории делаю вывод что одинаковое значение прозрачности для каждой точки($30 к примеру) и полная непрозрачность всего окна должны дать тот же результат, что и отсутствующая прозрачность точек со значением $30 для всего окна. Но не сходиться! я написал такой вот код:
При значения PerPixelAlpha:=$FF и ConstantAlpha:=$50 все выглядит так как я и ожидал (ничем не лучше и не хуже SetLayeredWindowAttributes). А если поменять эти значения, то картинка почему-то меняется, и у меня складывается впечатление, что откуда-то вмешался в картинку прозрачности какой-то слой белого цвета. Давайте вместе что-нить придумаем... |
| Автор: urix 20.6.2006, 11:51 |
| вот, работающий правильно пример: http://www.codeproject.com/gdi/pxalphablend.asp |
| Автор: Girder 20.6.2006, 12:25 | ||
PS: Или ReverseA:=false; |
| Автор: bems 20.6.2006, 15:32 |
| urix, Girder, списибо ребята, я уже разобрался. Нагуглил этот пример с codeproject. Весь фокус был в предумноженном цвете (как перевести premultipled?) Я думал так никто и не откликнется. Спасибо вам еще раз и "+" |
| Автор: Wolf 4.5.2009, 13:59 |
| Хм, а теперь как бы на этом всём контролы какие нибуть рисовать? Что-то они не охотно рисуются ) |
| Автор: vovaok 1.12.2010, 12:07 |
| вот-вот.. я знаю 2 варианта.. рисовать контролы вручную, либо сделать дырку в LayeredWindow а под ней помещать обычную форму с контролами |