我在创建设置大小的客户区时遇到了一些问题。 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.为什么它不能正常显示?
似乎当我画整个窗口时,它都被测量了。原因?我不知道。
也许其他人可以对此有所了解。
答案 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()? 只要您传递正确的样式(和扩展样式),我就没有理由不能正常工作。