WM_SIZING上的GetClientRect给出了错误的大小

时间:2015-03-27 08:20:48

标签: c# c++ c windows winapi

当调整窗口大小时,我需要获得窗口客户区的正确大小(宽度/高度)。我尝试使用GetClientRect,但它始终给出错误的值(请参阅下面的详细信息)。

User32.RECT clientRECT;
User32.GetClientRect(_handle, out clientRECT);

所以当创建窗口时,我决定在窗口rect(带边框)和客户端rect之间存储x和y-delta,然后将这个delta值与窗口rect相加,从{{1}的lParam接收消息。

WM_SIZING

这个技巧总是给出正确的尺寸。

但是为什么GetClientRect有这么奇怪的行为?所以我编写了这段代码来获取有关正在发生的事情的更多细节。

var windowRECT = (User32.RECT)Marshal.PtrToStructure(lParam, typeof(User32.RECT));
var clientAreaWidth = ((windowRECT.right - windowRECT.left) + _xDelta);
var clientAreaHeight = ((windowRECT.bottom - windowRECT.top) + _yDelta);

然后我开始投影并开始拖动窗口的右下角。这是输出:

Debug.WriteLine("dX: " + (clientRECT.right - clientAreaWidth).ToString() + ", dY: " + (clientRECT.bottom - clientAreaHeight).ToString());

导致这种行为的原因是什么?

1 个答案:

答案 0 :(得分:3)

如果您想使用WM_SIZING,则需要使用lParam中的矩形,而不是GetClientRect的结果