Я создал многослойное окно , добавив 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. Окно подсказок, нарисованное Windows & reg; темы не прямоугольные. Это оставляет небольшой видимый промежуток, где окно прозрачно, но тень не появляется:
Microsoft удалось заставить его работать, как вы можете видеть из этой подсказки из Internet Explorer:
Присмотревшись к окну подсказки класса Windows tooltips
. Используя SpyXX - я могу получить его окно прямоугольным и стили классов:
SpyXX говорит:
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
Таким образом, все указывает на то, что само окно имеет размер 104x20 пикселей, а тень находится за пределами самого окна. (Что соответствует 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.