c# - WM_SIZING 上的 GetClientRect 给出了错误的大小

标签 c# c++ c windows winapi

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

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

所以我决定在创建窗口时在窗口矩形(带边框)和客户端矩形之间存储 x 和 y 增量,然后将这个增量值与窗口矩形相加,从 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());

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

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的结果

关于c# - WM_SIZING 上的 GetClientRect 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296121/

相关文章:

c# - 使用委托(delegate)时,有没有办法获取对象响应?

c++ - fatal error C1083 : Cannot open include file: 'opencv2/core.hpp' : No such file or directory

c++ - 避免在 Google Mock 中多次匹配 .WillOnce

c++ - 如何在由许多 C++ 文件组成的程序中设置 gdb 观察点?

c - 当我在其他函数中调用它们时,如何使我的函数停止产生意外效果?

c - 如何对空指针进行算术运算

c - 将 C 结构迁移到 Delphi 记录

c# - Visual Studio 项目中的每个引用都显示为无效

c# - LayoutAwarePage 的 MVVM 够用吗?

c# - 使用 Exact Word 的 LINQ 过滤列表