为什么GetSystemMetrics()返回这些值?

我有一些问题创build一个设置大小的客户区。 AdjustWindowRect()将无法正常工作,所以我决定尝试手动计算窗口的宽度和高度。

那也不pipe用,我想知道为什么我检查了我曾经考虑过的边界等值

#include <iostream> #include <Windows.h> int main(void) { std::cout << "GetSystemMetrics(SM_CYEDGE) = " << GetSystemMetrics(SM_CYEDGE) << std::endl; std::cout << "GetSystemMetrics(SM_CXEDGE) = " << GetSystemMetrics(SM_CXEDGE) << std::endl; std::cout << "GetSystemMetrics(SM_CYBORDER) = " << GetSystemMetrics(SM_CYBORDER) << std::endl; std::cout << "GetSystemMetrics(SM_CXBORDER) = " << GetSystemMetrics(SM_CXBORDER) << std::endl; std::cout << "GetSystemMetrics(SM_CYCAPTION) = " << GetSystemMetrics(SM_CYCAPTION); std::cin.get(); } 

这给了我:

 GetSystemMetrics(SM_CYEDGE) = 2 GetSystemMetrics(SM_CXEDGE) = 2 GetSystemMetrics(SM_CYBORDER) = 1 GetSystemMetrics(SM_CXBORDER) = 1 GetSystemMetrics(SM_CYCAPTION) = 22 

我很确定我的窗口的边界不是那么薄。 我究竟做错了什么?

编辑1:

最初我的窗口使用了WS_OVERLAPPED风格。 由于AdjustWindowRect不允许使用该样式,所以我构build了我想要的相同types的窗口:(WS_BORDER | WS_CAPTION | WS_SYSMENU)。 这是调用AdjustWindowRect和AdjustWindowRectEx(这是一个NULL作为扩展样式,因为我不使用任何)调用时使用的相同样式。 这给了我正确的宽度,但高度是缺less几个像素。

 RECT rect = { 0, 0, 800, 600}; AdjustWindowRectEx( &rect, (WS_BORDER | WS_CAPTION | WS_SYSMENU), FALSE, NULL); CreateWindowEx( ..., rect.right - rect.left, rect.bottom - rect.top, ...); 

这给我800像素宽的客户区,但只有582像素的高度。

编辑2:

CURIOUS,我用GetClientRect(); 它给了我宽度是800和高度是600.它怎么不能正确显示?


看起来,当我把整个窗口画出来的时候,它都被测量出来了。 原因? 我不知道。

也许别人可以对此有所了解。

第一个问题是你使用了错误的度量。 您将需要使用SM_CXSIZEFRAME来获取可调整大小的边框的宽度。

第二个问题是Windows不会给你正确的价值。 Aero上的一个窗口的胖边框是一个严重的appcompat问题。 Windows有意在于窗口矩形和边框大小。 要使旧程序仍能正常工作,它们需要在CreateWindow()调用中指定窗口的大小。 但这是框架的大小,包括边界。 没有谎言,窗户就会以一个客户区太小而告终。

要关闭谎言,你必须告诉Windows你知道 Aero的行为,不需要撒谎。 项目+属性,链接器,命令行,附加选项框,并添加:

 /SUBSYSTEM:CONSOLE,6.0 

版本6.0是Vista版本号,是具有Aero的Windows的第一个版本。 当你这样做时,要小心你的程序不能在XP上运行。

你有没有尝试AdjustWindowRectEx()而不是AdjustWindowRect()? 只要你传递正确的样式(和扩展样式),我没有理由不能正常工作。