Winapi Win32:如何在我的窗外画画?

Winapi Win32:如何在我的窗外画画?,winapi,dropshadow,layered-windows,ws-ex-layered,Winapi,Dropshadow,Layered Windows,Ws Ex Layered,查看Windows工具提示类提示窗口,我看到它在提示窗口的实际矩形外绘制其下拉阴影 使用SpyXX-我可以获得工具提示的窗口矩形和类样式: Rectangle: (440, 229)-(544, 249), 104x20 Restored Rect: (440, 229)-(544, 249), 104x20 Client Rect: (0, 0)-(104, 20), 104x20 您会注意到,您看到的投影实际上位于正在绘制的窗口之外。当我在窗外时,我怎么能在窗外画一个影子呢

查看Windows
工具提示
类提示窗口,我看到它在提示窗口的实际矩形外绘制其下拉阴影

使用SpyXX-我可以获得工具提示的窗口矩形和类样式:

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

您会注意到,您看到的投影实际上位于正在绘制的窗口之外。当我在窗外时,我怎么能在窗外画一个影子呢

注意:我已经通过实验证实了这一点,并且还可以在SpyXX中看到窗口的类样式;它不使用
CS\u 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的:

在屏幕上绘图和读取 --巴阿德

最后,因为我们正在重新定向 一个特别危险的话题 练习就是在屏幕上写字, 或者通过使用GetDC(NULL) 写信或试图 有XOR橡皮筋线等吗 有两大原因让我们写信给 屏幕坏了:

它很贵。。。写信给 屏幕本身并不昂贵,但它 几乎总是伴随着 从屏幕上阅读,因为 通常是读修改写 写入时执行类似XOR的操作 屏幕。阅读视频 内存表面非常昂贵, 需要与DWM同步, 并暂停整个GPU管道,如图所示 以及DWM应用管道。
这是不可预测的。。。如果你 设法达到实际的主要目的 写信给它,不可能 可预测的是你要做什么 向主服务器写入的内容将保持打开状态 屏幕。因为UCE不知道 关于它,它可能会在未来得到澄清 下一帧刷新,或者它可能会持续 很长一段时间,取决于 网站上还需要更新哪些内容 屏幕。(我们真的不允许直接 不管怎样,写信给小学 这就是原因…如果你想 访问DirectDraw主目录,例如 例如,DWM将在 正在访问的应用程序(退出)


如果阴影与窗口管理器本身紧密相连,我不会感到惊讶;毕竟,是窗口管理者决定了窗口可以绘制哪些部分,以及何时可以绘制。我不认为画出阴影是一门火箭科学,如果你能控制所有获得的东西,那就是窗口管理器所拥有的。

你不能以你描述的方式画出窗外

如果右键单击桌面,则转到属性/外观/效果并取消选中“在菜单下显示阴影”。。。你将不再有阴影


归根结底,这是窗口管理器的产品,而不是您的程序。

Q:如何在一个窗口外绘制?在另一个窗口内画画

首先要注意的是,tooltip类实际上使用了
CS\u DROPSHADOW
样式,但请注意,这是一种类样式,而不是窗口样式,因此您必须查看Spy++属性对话框中的类选项卡才能找到它。您将看到
工具提示\u class32
窗口确实有此功能,还有一些其他功能

但这就引出了下一个问题——它是如何工作的?嗯,Windows似乎通过创建一个助手HWND来绘制阴影来实现这一点-可能它正在创建另一个弹出窗口,其大小和形状与其阴影相同,填充灰色,将其直接放置在主窗口下方,并将其设置为窗口,以便阴影可以透明,并使用alpha混合在边缘周围淡出。如果你想在自己的窗口中添加不同类型的阴影效果,没有什么可以阻止你自己使用相同或类似的技术

长话短说:如果您想在自己的窗口外绘制,请在要绘制的常规区域中创建一个辅助对象透明窗口,然后改为在该辅助对象窗口上绘制

--

现在,如果您试图在Spy++中找到这些帮助程序阴影窗口中的一个,您将不会找到太多。与
工具提示\u class32
窗口不同,这些窗口寿命长,只需根据需要隐藏/显示自己,这些阴影窗口是一种更难以捉摸的生物:它们只在需要的时间内创建,因此当有工具提示或弹出菜单或其他使用阴影显示的窗口时,您必须刷新Spy+,这很棘手,因为只要移动鼠标切换到Spy++,大多数工具提示和菜单就会消失。但是Spy++自己的工具栏上的工具提示会一直存在:所以启动Spy++,将鼠标悬停在工具栏中的某个项目上,然后在工具提示和阴影出现时点击
F5
刷新HWND树。现在向下滚动,您应该会看到树中第三个和第四个可见的HWD是工具提示本身,紧接着是一个
SysShadow
窗口。不幸的是,由于工具提示和阴影现在已经消失,如果您尝试获取该HWND的属性对话框,您将获得一个带有“无效窗口”消息的“获取空白属性”对话框。如果你真的想看看SysShadow是如何工作的,它本身使用什么样式等等,你可以创建一个目标应用程序,它带有一个使用
CS\u DROPSHADOW
的长期弹出窗口,然后你可以在Spy++中随意浏览


(最后,请注意,这些阴影与自Vista以来,当一个应用程序窗口位于另一个应用程序窗口之上时所看到的阴影完全不同:这种阴影是Aero Glass模式的一部分,由添加玻璃标题栏效果的窗口处理,并且不使用或不需要辅助窗口来实现阴影。)

工具提示通用控件图形在其窗口外是如何绘制的?或者,它要求Windows具有什么功能