我想调用 SetWindowPos,使我的窗口(但只是菜单下方的区域)为 400x400。我怎么做?似乎 SetWindowPos 也包括菜单。
基本上我想要一个可以画画的区域,它是 400 x 400。
抱歉,我从来没有做过这样的winAPI GUI编程
SetWindowPos(hWnd, NULL, 0, 0, 400, 400, SWP_NOMOVE | SWP_NOZORDER);
如果那根本不是正确的方法,我愿意接受其他建议。
SetWindowPos()
整体调整整个窗口的大小。相反,您只需要窗口的客户区1的特定大小,让操作系统处理窗口的其余部分surrounding客户区。
1:有关窗口不同组件的说明,请参阅 MSDN 上的关于 Windows。
Win32 API 具有针对这种情况的函数:
AdjustWindowRect()
和AdjustWindowRectEx()
根据客户矩形的所需大小,计算窗口矩形的所需大小。然后可以将窗口矩形传递给 CreateWindowEx 函数以创建一个窗口,其客户区域是所需的大小。
AdjustWindowRectExForDpi()
。
所以,你给他们你想要的客户区的大小,并指定window样式(影响客户区周围的各种边框,边距,间距等,从而影响窗口的宽度和高度), 以及是否存在菜单(这会影响客户区相对于标题栏的定位,从而影响窗口的高度),如果需要,还可以进行 DPI 缩放。
他们会给您返回达到指定客户区大小所需的window大小。然后,您可以将窗口调整为调整后的大小。
例如:
RECT r;
r.left = 0;
r.top = 0;
r.right = 400;
r.bottom = 400;
DWORD dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
DWORD dwExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
AdjustWindowRectEx(&r, dwStyle, TRUE, dwExStyle);
SetWindowPos(hWnd, NULL, 0, 0, r.right - r.left, r.bottom - r.top, SWP_NOMOVE | SWP_NOZORDER);