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

时间:2012-07-29 02:50:51

标签: c++ windows winapi

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

这也没有用,我想知道为什么所以我检查了我以前考虑边界等的值。

#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不允许将该样式与它一起使用,因此我构造了我想要的相同类型的窗口:(WS_BORDER | WS_CAPTION | WS_SYSMENU)。这是我在调用AdjustWindowRect和AdjustWindowRectEx时使用的相同样式(这个样式以NULL作为扩展样式,因为我不使用任何样式)。这给了我正确的宽度,但高度缺少几个像素。

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和高度IS 600.为什么它不能正常显示?


似乎当我画整个窗口时,它都被测量了。原因?我不知道。

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

2 个答案:

答案 0 :(得分:23)

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

第二个问题是Windows不会为您提供正确的值。 Aero窗口的胖边界是一个严重的appcompat问题。 Windows故意围绕窗口矩形和边框大小。要求旧程序仍能正常工作,它们在CreateWindow()调用中指定窗口的大小。但那是框架的大小,包括边框。没有谎言,窗口最终将会有一个太小的客户区。

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

/SUBSYSTEM:CONSOLE,6.0

6.0版是Vista版本号,是拥有Aero的Windows的第一个版本。请注意,当您执行此操作时,您的程序将不再在XP上运行。

答案 1 :(得分:2)

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