如何为重叠窗口设置准确的客户区大小?(winapi)

4

我想在创建普通的“重叠”窗口时设置精确的客户端大小(例如300 x 300)。

有一个名为AdjustWindowRectEx()的函数,可以传递所需的客户端区域并获取大小,然后将其传递给CreateWindowEx函数,但是文档中说不应该将其用于重叠窗口,我不理解原因。

当我传递300 x 300时,它返回306 x 326,而当我收到 WM_SIZE 时,客户端大小为298 x 298,因此太小了2个像素。

如何创建具有精确给定客户端大小的重叠窗口?

2个回答

2

我的错误是以下内容:

AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS, FALSE, WS_OVERLAPPEDWINDOW);

改为以下内容即可解决该问题:

AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS, FALSE, 0);

2
你的答案使用了五个函数参数,但是AdjustWindowRectEx只接受四个。 - NathanAldenSr

1

我不知道为什么AdjustWindowRect不起作用(除非您的客户区域包含一个带有一像素边框的子窗口)。

请注意,您可以将此函数用于重叠窗口。文档说您不能使用WS_OVERLAPPED样式(我猜是因为它的值为零),但您可以使用WS_OVERLAPPEDWINDOW。

作为替代方案,您可以调用GetWindowRect和GetClientRect,计算边框的宽度/高度(两个矩形的宽度/高度之差),将其添加到所需的客户端大小并设置窗口大小。我相信您可以在窗口显示之前执行此操作。


所以,我理解你的意思是AdjustWindowrectEx应该可以工作????(后来我在做一些客户端大小的更改(因为我要将其blit到上面,并且如果客户端未对齐到4个像素,则显示的blit不起作用-我有点迷失其中,但我认为这就是原因,因为它可能没有被调用-但会检查它) - grunge fightr
似乎没问题,我从调整中得到了306 325,然后在第一个WM_SIZE中得到了298 298,但仍然没有原因。 - grunge fightr
就像我在上一段所说的,如果因为某些原因AdjustWindowRect无法工作,你可以自己计算边框大小。 - arx
边框为8(2x4)(在paint.net和窗口宽度-客户端宽度中检查也是8)。问题是对于300,AdjustWindoeRectEx给出306,然后CreateWindowEx给出298:/(然后GetWindowsRect和GetClientRect报告相同),看起来是AdjustWindowEx的问题。 - grunge fightr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接