我正在使用GetWindowRect
函数来获取本机窗口的边界矩形。对于顶级窗口,这似乎包括窗口周围的任何“装饰”,例如在Windows 10上默认启用的阴影。我想排除这些装饰,但我确实想要包括其余的(例如最小化) /最大化按钮)。 (我应该如何?)调整GetWindowRect
返回的几何图形来获得它?
我的第一次尝试是考虑窗口样式,然后使用系统指标CM_CxSIZEFRAME
(为简洁省略了错误处理):
[..]
RECT r;
::GetWindowRect(handle, &r);
const bool isToplevelWindow = (::GetWindowLong(handle, GWL_STYLE) & WS_CHILD) == 0;
if (isToplevelWindow) {
const int frameWidth = ::GetSystemMetrics(SM_CXSIZEFRAME);
const int frameHeight = ::GetSystemMetrics(SM_CYSIZEFRAME);
r.left += frameWidth;
r.right -= frameWidth;
r.top += frameHeight;
r.bottom -= frameHeight;
}
// process `r`
这似乎主要是除了在Windows 10样式上,将帧高度添加到Y坐标(即r.top
)似乎是错误的,它切掉了顶部标题栏。
到目前为止,我注意到::GetSystemMetrics
功能不仅支持查询其他帧指标:
SM_C*DLGFRAME
(又名SM_CxFIXEDFRAME
)SM_CxFRAME
(又名`SM_CxSIZEFRAME)SM_CxBORDER
SM_C*PADDEDBORDER
...还有一个“更新”的GetThemeSysSize
功能,可以访问一些看似相关的指标。
当试图摆脱圆形边缘或阴影等窗户装饰时,有谁知道我应该尊重哪些(如果有的话)?