Прозрачные окна верхнего уровня - PullRequest
3 голосов
/ 17 февраля 2009

Я хотел бы создать окно верхнего уровня (т.е. не WS_CHILD) с прозрачностью. Однако я не хочу, чтобы это была простая маска, где данный пиксель либо полностью прозрачен, либо полностью непрозрачен. И я не хочу, чтобы оно было таким, чтобы у всего окна был какой-то альфа-уровень. Скорее, я бы хотел, чтобы окно было по существу полностью прозрачным, с растровым изображением, нарисованным на нем с альфа-каналом, так, чтобы растровое изображение сливалось с любыми окнами, которые могут находиться за ним. Представьте, скажем, солнечные лучи, где собственная альфа-часть изображения смешивается от непрозрачной до полностью прозрачной наружу от центра.

Я нашел два метода, которые оба приближаются к тому, что я хочу сделать, но не совсем. Используя регионы, я могу вырезать раздел, который нарисован полностью прозрачным. Используя многослойные окна, я также могу сделать что-то подобное (или даже сделать все окно слегка прозрачным, но это совсем не то, что я хочу). Я изучил другие стили, такие как WS_EX_TRANSPARENT и WS_EX_COMPOSITE, но безрезультатно.

Я могу заставить этот вид эффекта отлично работать на дочерних окнах, так как они смешиваются с родительскими окнами в пределах области своих родителей. Мне так же не удается заставить его работать аналогично для окон верхнего уровня.

Я знаю, что это можно сделать, поскольку люди уверяли меня, что видели это в других программах. Я чувствую, что просто не совсем понимаю что-то простое в рисовании окон.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2009

Многослойные окна (WS_EX_LAYERED) должны выполнять эту работу, имея в виду, что вы должны использовать UpdateLayeredWindow() и несколько необычный формат растрового изображения (32-битный, предварительно умноженная альфа) для указания альфа-значений на пиксель (SetLayeredWindowAttributes() позволит вам указать только одно альфа-значение для всего окна или цветовой клавиши).

Вы говорите, что уже пробовали это - с какими проблемами вы столкнулись?

1 голос
/ 17 февраля 2009

Единственный известный мне способ получения альфа-изображения на пиксел в окне - это UpdateLayeredWindow ().
Проверьте эту ссылку MSDN: http://msdn.microsoft.com/en-us/library/ms997507.aspx

Обратите внимание, что при использовании UpdateLayeredWindow приложению не нужно отвечать на WM_PAINT или другие сообщения рисования, поскольку оно уже предоставило визуальное представление для окна, и система позаботится о сохранении этого изображения, его компоновке и визуализации это на экране. UpdateLayeredWindow довольно мощный, но часто требует изменения способа рисования существующим приложением Win32 .

Могу поспорить, что это проблемы, с которыми вы столкнулись.

...