了解DwmGetWindowAttribute和DWMWA_EXTENDED_FRAME_BOUNDS

问题描述 投票:0回答:1

我通过使用

{top=0 bottom=393 left=7 right=393}
调用
DwmGetWindowAttribute
获得了
DWMWA_EXTENDED_FRAME_BOUNDS
,但无法理解为什么在窗口顶部可以看到
top=0
时会看到阴影。

如果

RECT
不包括它周围的阴影区域,顶部怎么可能是0呢?我认为它应该是相对于
RECT
给出的
GetWindowRect
,并且应该等于左边,即7。

如果坐标是相对于左上角的,为什么左边不为0?相对于什么坐标?

我能找到的最详细的参考资料位于 https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute)

DWMWA_EXTENDED_FRAME_BOUNDS

DwmGetWindowAttribute
一起使用。检索屏幕空间中的扩展框架边界矩形。检索到的值的类型为
RECT

关于 获取窗口的投影尺寸的一些有用的单词说:

请注意,扩展帧边界采用物理像素坐标,不受 Windows 缩放功能的影响。您可能需要转换回虚拟坐标,或将虚拟坐标转换为物理坐标以使它们匹配。

我想知道这是不是真的。

任何更详细的文件将不胜感激。

winapi
1个回答
0
投票

就我而言,窗口 RECT (GetWindowRect) 和窗口扩展框架边界 RECT (DwmGetWindowAttribute with DWMWA_EXTENDED_FRAME_BOUNDS) 是不同的。

根据 GetWindowRect 文档:

在 Windows Vista 及更高版本中,窗口矩形现在包括投影占据的区域。

调用 GetWindowRect 将有不同的行为,具体取决于窗口是否曾经显示过。如果窗口之前没有显示过,GetWindowRect 将不包括阴影区域。

要获取不包括投影的窗口边界,请使用 DwmGetWindowAttribute,并指定 DWMWA_EXTENDED_FRAME_BOUNDS。


如果坐标是相对于左上角的,为什么左边不为0?相对于什么坐标?

我建议您可以参考该帖子:https://github.com/dotnet/winforms/issues/4776

此行为是设计使然。

从字面上切换到边缘上 1 像素的非客户区域是行不通的,因为用鼠标抓住边缘太难了。因此,边缘上的非客户端空间量保留为 8 像素宽,但该空间的 7 像素现在是透明的。窗口的编程边缘现在与窗口的可见边缘处于不同的位置。

这是窗户侧面和底部的情况,但顶部边缘没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.