SetWindowPos - 仅调整菜单条下方矩形的大小

问题描述 投票:0回答:1

我想调用 SetWindowPos,使我的窗口(但只是菜单下方的区域)为 400x400。我怎么做?似乎 SetWindowPos 也包括菜单。

基本上我想要一个可以画画的区域,它是 400 x 400。

抱歉,我从来没有做过这样的winAPI GUI编程

SetWindowPos(hWnd, NULL, 0, 0, 400, 400, SWP_NOMOVE | SWP_NOZORDER);

如果那根本不是正确的方法,我愿意接受其他建议。

c++ winapi gdi
1个回答
0
投票

正如您所注意到的,

SetWindowPos()
整体调整整个窗口的大小。相反,您只需要窗口的客户区1的特定大小,让操作系统处理窗口的其余部分surrounding客户区。

1:有关窗口不同组件的说明,请参阅 MSDN 上的关于 Windows

Win32 API 具有针对这种情况的函数:

AdjustWindowRect()
AdjustWindowRectEx()

根据客户矩形的所需大小,计算窗口矩形的所需大小。然后可以将窗口矩形传递给 CreateWindowEx 函数以创建一个窗口,其客户区域是所需的大小。

如果您的应用程序是 DPI 感知的,那么也有

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);
© www.soinside.com 2019 - 2024. All rights reserved.