【问题标题】:GetClientRect on WM_SIZING gives wrong sizeWM_SIZING 上的 GetClientRect 给出错误的大小
【发布时间】:2015-05-31 12:17:05
【问题描述】:

在调整窗口大小时,我需要获取窗口客户区的正确大小(宽度/高度)。我尝试使用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

是什么导致了这种行为?

【问题讨论】:

    标签: c# c++ c windows winapi


    【解决方案1】:

    如果要使用WM_SIZING,需要使用lParam中携带的rect,而不是GetClientRect的结果

    【讨论】:

    • 为什么?而GetClientRect函数的结果何时正确?
    • 调整大小完成后可以使用GetClientRect(WM_SIZE之后)
    • 可能是您编写了一些代码,干扰了大小消息的正常处理。它发生在我身上!在stackoverflow.com/posts/36700340/revisions 上,您会看到我添加了对父方法的调用,因为视图的某些绘图依赖于GetClientRect 函数。那些图纸的位置不对,但是当我添加这个调用时,事情开始正常了!
    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多