我将为您翻译编程相关内容。在查看 Windows 工具提示类提示窗口时,我发现它的阴影是绘制在提示窗口实际矩形框外部的。使用 SpyXX,我可以获取工具提示窗口的窗口矩形和类样式:
你会注意到,你看到的下拉阴影实际上是被绘制窗口外部的。我怎样能够在我的窗口外部绘制一个阴影呢? 注意: 这个阴影不是使用标准的
我该如何在窗口外绘图?
注意:在桌面DC上绘制是不行的。根据Greg Schechter的 Redirecting GDI,DirectX和WPF应用程序所述:
画图和屏幕读写--非常糟糕!最后,由于我们正在谈论重定向主题,一种特别危险的做法是将内容写入屏幕,通过使用GetDC(NULL)并在其上书写,或尝试进行XOR橡皮筋线等操作。有两个重要原因使得在屏幕上写入内容变得糟糕:它很昂贵...写入屏幕本身并不昂贵,但它几乎总是伴随着从屏幕读取,因为当写入屏幕时,通常会执行类似于XOR的读取-修改-写入操作。从视频内存表面读取非常昂贵,需要与DWM同步,并阻塞整个GPU管道以及DWM应用程序管道。它是不可预测的...如果你设法到达实际的主屏幕并写入它,那么你所写入的内容能保持多长时间就无法预测了。由于UCE不知道这一点,它可能会在下一帧刷新中被清除,或者根据其他需要更新的屏幕内容而持续存在很长时间。(出于这个原因,我们实际上不允许直接写入主屏幕...例如,如果你尝试访问DirectDraw主屏幕,DWM将在访问应用程序退出之前关闭)
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
你会注意到,你看到的下拉阴影实际上是被绘制窗口外部的。我怎样能够在我的窗口外部绘制一个阴影呢? 注意: 这个阴影不是使用标准的
CS_DROPSHADOW
类样式来绘制的。 我已经通过实验证实了这一点,并且也可以在中看到窗口的类样式;它不使用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上绘制是不行的。根据Greg Schechter的 Redirecting GDI,DirectX和WPF应用程序所述:
画图和屏幕读写--非常糟糕!最后,由于我们正在谈论重定向主题,一种特别危险的做法是将内容写入屏幕,通过使用GetDC(NULL)并在其上书写,或尝试进行XOR橡皮筋线等操作。有两个重要原因使得在屏幕上写入内容变得糟糕:它很昂贵...写入屏幕本身并不昂贵,但它几乎总是伴随着从屏幕读取,因为当写入屏幕时,通常会执行类似于XOR的读取-修改-写入操作。从视频内存表面读取非常昂贵,需要与DWM同步,并阻塞整个GPU管道以及DWM应用程序管道。它是不可预测的...如果你设法到达实际的主屏幕并写入它,那么你所写入的内容能保持多长时间就无法预测了。由于UCE不知道这一点,它可能会在下一帧刷新中被清除,或者根据其他需要更新的屏幕内容而持续存在很长时间。(出于这个原因,我们实际上不允许直接写入主屏幕...例如,如果你尝试访问DirectDraw主屏幕,DWM将在访问应用程序退出之前关闭)