В: Как вы рисуете за пределами одного окна? A: Нарисуйте внутри другое окно!
Первое, что нужно отметить, это то, что класс всплывающей подсказки действительно использует стиль CS_DROPSHADOW
- но учтите, что это стиль class , а не окно style, поэтому вам нужно взглянуть на вкладку Class в диалоге свойств Spy ++, чтобы найти ее. Вы увидите, что окна tooltips_class32
действительно имеют это - и некоторые другие.
Но это только приводит к следующему вопросу - как это работает? Что ж, похоже, что Windows реализует это, создавая вспомогательный HWND для рисования тени - предположительно, он создает другое всплывающее окно того же размера и формы, что и затененное, заполняет его серым, помещает его непосредственно под главное окно и устанавливает это как WS_EX_LAYERED окно, так что тень может быть прозрачной и исчезать по краям, используя альфа-смешение. И ничто не мешает вам использовать те же или похожие методы самостоятельно, если вы хотите добавить другой тип эффекта тени к одному из своих окон.
Итак, короткая история: если вы хотите рисовать вне своего собственного окна, создайте прозрачное вспомогательное окно в общей области, на которой вы хотите рисовать, и вместо этого нарисуйте это вспомогательное окно.
-
Теперь, если вы попытаетесь найти одно из этих вспомогательных теневых окон в Spy ++, вы не найдете много. В отличие от окон tooltip_class32
, которые являются долгоживущими и просто скрывают / показывают себя по мере необходимости, эти теневые окна являются более неуловимым существом: они создаются только столько времени, сколько необходимо, поэтому вам придется обновлять Spy ++, пока есть всплывающая подсказка или всплывающее меню или другое окно, в котором используется тень - и это сложно, поскольку большинство подсказок и меню исчезают, как только вы перемещаете мышь, чтобы переключиться на Spy ++. Но оказывается, что всплывающие подсказки на собственной панели инструментов Spy ++: запустите Spy ++, наведите курсор мыши на элемент на панели инструментов и нажмите F5
, чтобы обновить дерево HWND, пока присутствуют подсказка и тень. Теперь прокрутите вниз, и вы увидите, что третий и четвертый видимые HWND в дереве - это сама всплывающая подсказка, а сразу после этого окно SysShadow
. К сожалению, поскольку всплывающая подсказка и тень к настоящему времени исчезли, если вы попытаетесь открыть диалоговое окно свойств для этого HWND, вы получите пустое диалоговое окно свойств с сообщением «Неверное окно». Если вы действительно хотите поэкспериментировать и посмотреть, как работает этот SysShadow, какие стили он сам использует и т. Д., Вы можете создать целевое приложение с долгоживущим всплывающим окном, использующим CS_DROPSHADOW
, которое затем можно исследовать в Spy ++ на досуге.
(Наконец, обратите внимание, что эти тени - это нечто совершенно иное, чем тени, которые вы видите, когда одно окно приложения находится поверх другого над другим с Vista: этот тип тени является частью режима Aero Glass и обрабатывается тот же Desktop Composition Manager , который добавляет эффект стеклянного заголовка, и он не использует или не нуждается во вспомогательных окнах для реализации теней.)