WM_SIZING 上的 GetClientRect 给出了错误的大小
GetClientRect on WM_SIZING gives wrong size
当 window 调整大小时,我需要获得 window 客户区的正确大小(宽度/高度)。我尝试使用 GetClientRect
,但它总是给出错误的值(请参阅下面的详细信息)。
User32.RECT clientRECT;
User32.GetClientRect(_handle, out clientRECT);
所以我决定在创建 window 时在 window 矩形(带边框)和客户端矩形之间存储 x- 和 y-delta,然后用 window rect,从 WM_SIZING
消息的 lParam 接收。
var windowRECT = (User32.RECT)Marshal.PtrToStructure(lParam, typeof(User32.RECT));
var clientAreaWidth = ((windowRECT.right - windowRECT.left) + _xDelta);
var clientAreaHeight = ((windowRECT.bottom - windowRECT.top) + _yDelta);
这个技巧总是提供正确的尺寸。
但为什么 GetClientRect 有如此奇怪的行为?所以我写了这段代码来获得更多关于正在发生的事情的细节。
Debug.WriteLine("dX: " + (clientRECT.right - clientAreaWidth).ToString() + ", dY: " + (clientRECT.bottom - clientAreaHeight).ToString());
然后我开始项目,开始拖动window的右下角。这是输出:
dX: 16, dY: 17 // fast dragging in NW-direction
dX: 21, dY: 16
dX: 34, dY: 25
dX: 92, dY: 62
dX: 110, dY: 75
dX: 94, dY: 65
dX: 60, dY: 48
dX: 22, dY: 19
...
dX: 0, dY: 1 // slow dragging in NW-direction
dX: 0, dY: 2
dX: 0, dY: 1
dX: 0, dY: 1
dX: 0, dY: 1
dX: 1, dY: 1
dX: 0, dY: 1
dX: 1, dY: 2
dX: 0, dY: 1
...
dX: -16, dY: -12 // fast dragging in SE-direction
dX: -68, dY: -65
dX: -77, dY: -75
dX: -53, dY: -43
dX: -22, dY: -17
dX: -5, dY: -4
...
dX: -1, dY: 0 // slow dragging in SE-direction
dX: -1, dY: 0
dX: -1, dY: 0
dX: -1, dY: -1
dX: -1, dY: 0
dX: -1, dY: -1
dX: -1, dY: 0
dX: 0, dY: -1
dX: -1, dY: 0
dX: 0, dY: -1
导致此行为的原因是什么?
如果要使用WM_SIZING
,需要使用lParam
中携带的rect,而不是GetClientRect
的结果
当 window 调整大小时,我需要获得 window 客户区的正确大小(宽度/高度)。我尝试使用 GetClientRect
,但它总是给出错误的值(请参阅下面的详细信息)。
User32.RECT clientRECT;
User32.GetClientRect(_handle, out clientRECT);
所以我决定在创建 window 时在 window 矩形(带边框)和客户端矩形之间存储 x- 和 y-delta,然后用 window rect,从 WM_SIZING
消息的 lParam 接收。
var windowRECT = (User32.RECT)Marshal.PtrToStructure(lParam, typeof(User32.RECT));
var clientAreaWidth = ((windowRECT.right - windowRECT.left) + _xDelta);
var clientAreaHeight = ((windowRECT.bottom - windowRECT.top) + _yDelta);
这个技巧总是提供正确的尺寸。
但为什么 GetClientRect 有如此奇怪的行为?所以我写了这段代码来获得更多关于正在发生的事情的细节。
Debug.WriteLine("dX: " + (clientRECT.right - clientAreaWidth).ToString() + ", dY: " + (clientRECT.bottom - clientAreaHeight).ToString());
然后我开始项目,开始拖动window的右下角。这是输出:
dX: 16, dY: 17 // fast dragging in NW-direction
dX: 21, dY: 16
dX: 34, dY: 25
dX: 92, dY: 62
dX: 110, dY: 75
dX: 94, dY: 65
dX: 60, dY: 48
dX: 22, dY: 19
...
dX: 0, dY: 1 // slow dragging in NW-direction
dX: 0, dY: 2
dX: 0, dY: 1
dX: 0, dY: 1
dX: 0, dY: 1
dX: 1, dY: 1
dX: 0, dY: 1
dX: 1, dY: 2
dX: 0, dY: 1
...
dX: -16, dY: -12 // fast dragging in SE-direction
dX: -68, dY: -65
dX: -77, dY: -75
dX: -53, dY: -43
dX: -22, dY: -17
dX: -5, dY: -4
...
dX: -1, dY: 0 // slow dragging in SE-direction
dX: -1, dY: 0
dX: -1, dY: 0
dX: -1, dY: -1
dX: -1, dY: 0
dX: -1, dY: -1
dX: -1, dY: 0
dX: 0, dY: -1
dX: -1, dY: 0
dX: 0, dY: -1
导致此行为的原因是什么?
如果要使用WM_SIZING
,需要使用lParam
中携带的rect,而不是GetClientRect