Глядя на окно подсказки класса tooltips
в Windows, я вижу, что она рисует свою тень вне фактического прямоугольника окна подсказки.
Используя SpyXX - я могу получить прямоугольник окна всплывающей подсказки и стили классов:
![](https://i.stack.imgur.com/SpK7b.png)
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
Вы заметите, что тень, которую вы видите, физически находится за пределами рисуемого окна. Как я могу нарисовать тень снаружи вокруг моего окна, находясь вне моего окна?
Примечание: тень не рисуется с использованием стандартного CS_DROPSHADOW
стиля класса. я подтвердил это экспериментально, а также могу увидеть стиль класса для окна в SpyXX; он не использует CS_DROPSHADOW
:
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
Итак, как я могу рисовать за окном?
Примечание. Попытка рисовать на рабочем столе DC отсутствует. Из перенаправления GDI, Грега Шехтера, Приложения DirectX и WPF:
Рисование и чтение с экрана - Баааад!
Наконец, поскольку мы затронули тему перенаправления, одна особенно опасная практика - это запись на экран либо с использованием GetDC (NULL) и запись в него, либо попытка выполнения строк с резинкой XOR и т. Д. важные причины того, что писать на экран плохо:
Это дорого ... запись на экран сама по себе не дорогая, но она почти всегда сопровождается чтением с экрана, потому что при записи на экран обычно выполняются операции чтения-изменения-записи, такие как XOR. Чтение с поверхности видеопамяти очень дорого, требует синхронизации с DWM и останавливает весь конвейер графического процессора, а также конвейер приложения DWM.
Это непредсказуемо ... если вам каким-то образом удастся добраться до фактического основного и напишите в него, невозможно предсказать, как долго то, что вы написали на первичный компьютер, будет оставаться на экране. Поскольку UCE не знает об этом, он может быть очищен при следующем обновлении кадра или может сохраняться в течение очень долгого времени, в зависимости от того, что еще нужно обновить на экране. (Мы действительно не разрешаем прямую запись на первичный сервер, именно по этой причине ... например, если вы попытаетесь получить доступ к первичному серверу DirectDraw, DWM отключится до тех пор, пока приложение, обращающееся к нему, не закроется)