я создал многоуровневое окно, добавив расширенный стиль WS_EX_LAYERED:
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows будет использовать черный в качестве значения цвета хроматического ключа. Я собираюсь оставить большую черную границу, чтобы сделать проблему очевидной:
После того, как окно построено, я говорю ему использовать черный в качестве цвета хроматического ключа:
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
Теперь всплывающее многослойное окно выглядит частично прозрачным:
Проблема - последний шаг. я хочу использовать стиль класса CS_DROPSHADOW, доступный начиная с Windows XP, для создания тени:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
Появляется тень, но тень окружает исходное прямоугольное окно и не учитывает прозрачность окна, обеспечиваемую многослойным окном:
Кто-нибудь знает, какую магическую опцию я пропустил где-нибудь, чтобы заставить тень отбрасывать непрямоугольное многослойное окно?
Еще один пример возникновения этой проблемы - это когда вы не добавляете отступы 6px/margin. Окно подсказок, нарисованное темами Windows®, не прямоугольное. Это оставляет небольшой видимый промежуток, где окно прозрачно, но тень не появляется:
Microsoft удалось заставить его работать, как вы можете видеть из подсказки Internet Explorer:
Присмотревшись ближе к окну tooltips
класса tooltips
Windows. Используя SpyXX - я могу получить прямоугольник окна и стили классов:
SpyXX говорит:
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
Таким образом, все указывает на то, что само окно имеет размер 104х20 пикселей, а тень находится за пределами самого окна. (Что соответствует CS_DROPSHADOW
.)
Далее я могу взглянуть на стили класса окна tooltips
:
Windows Styles: 94000001
WS_POPUP 80000000
WS_VISIBLE 10000000
WS_CLIPSIBLINGS 4000000
TTS_ALWAYSTIP 1
Extended Styles: 00080088
WS_EX_LAYERED 80000
WS_EX_TOOLWIN 80
WS_EX_TOPMOST 8
Интересно, что он не использует CS_SAVEBITS
(0x800
); что полезно для небольших, недолговечных окон.
Он также не использует CS_DROPSHADOW
(0x20000
). Так что теперь мне интересно, как он рисует за пределами своего собственного окна?
Примечание. Прозрачные многослойные окна задокументированы как предпочтительный метод по сравнению с регионами.
Изменить: Многоуровневая Windows была с Windows 2000. CS_DropShadow был добавлен с XP.