Roo*_*oot 8 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();
}
Run Code Online (Sandbox Code Playgroud)
这给了我:
GetSystemMetrics(SM_CYEDGE) = 2
GetSystemMetrics(SM_CXEDGE) = 2
GetSystemMetrics(SM_CYBORDER) = 1
GetSystemMetrics(SM_CXBORDER) = 1
GetSystemMetrics(SM_CYCAPTION) = 22
Run Code Online (Sandbox Code Playgroud)
我很确定窗户的边框不是那么薄.我究竟做错了什么?
编辑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, ...);
Run Code Online (Sandbox Code Playgroud)
这给了我800像素宽的客户区,但高度只有582像素.
编辑2:
CURIOUS,我使用了GetClientRect(); 它给了我宽度为800,高度为600.为什么它显示不正确?
似乎当我画整个窗口时,它都被测量了.原因?我不知道.
也许其他人可以对此有所了解.
Han*_*ant 23
第一个问题是您使用了错误的指标.您需要使用SM_CXSIZEFRAME来获取可调整大小边框的宽度.
第二个问题是Windows不会给你正确的值.Aero窗口的胖边界是一个严重的appcompat问题.Windows故意围绕窗口矩形和边框大小.要求旧程序仍能正常工作,它们在CreateWindow()调用中指定窗口的大小.但那是框架的大小,包括边框.如果没有谎言,窗口最终将会出现一个太小的客户区域.
要关闭谎言,您必须告诉Windows您了解 Aero行为并且不需要撒谎.项目+属性,链接器,命令行,附加选项框并添加:
/SUBSYSTEM:CONSOLE,6.0
Run Code Online (Sandbox Code Playgroud)
版本6.0是Vista版本号,是拥有Aero的Windows的第一个版本.请注意,当您执行此操作时,您的程序将不再在XP上运行.