如何获取顶级窗口的窗口几何图形,不包括阴影等任何装饰?

时间:2016-06-27 10:28:53

标签: c++ windows winapi themes

我正在使用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功能,可以访问一些看似相关的指标。

当试图摆脱圆形边缘或阴影等窗户装饰时,有谁知道我应该尊重哪些(如果有的话)?

0 个答案:

没有答案