当调整窗口大小时,我需要获得窗口客户区的正确大小(宽度/高度)。我尝试使用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());
导致这种行为的原因是什么?
答案 0 :(得分:3)
如果您想使用WM_SIZING
,则需要使用lParam
中的矩形,而不是GetClientRect
的结果