代码之家  ›  专栏  ›  技术社区  ›  Jaykul

为什么处理wm nccalcSize会导致我的窗口跳转?

  •  5
  • Jaykul  · 技术社区  · 16 年前

    我有一个WPF应用程序可以捕捉到屏幕边缘(如果你在屏幕边缘20像素范围内,我只设置窗口的.top或.left),但是我最近添加了一些代码 provided by the WPF SDK Team 把窗户的铬“弄乱”,尽管它工作得很好( screenshot )导致“快照”意外移动窗口(例如:当窗口应直接向下捕捉到底部时,它会跳到左侧)

    我把范围缩小到他们处理大规模杀伤性武器的规模…这真的很奇怪,因为他们基本上什么都不做,他们只是说他们处理它,然后返回0。

    根据wm nccalcSize的文档,这只会导致整个窗口被视为客户机(没有非客户机边缘),但不知何故,这也意味着每当我的对齐代码将窗口向下移动到屏幕底部时,它也会向左移动约134像素…(移到其他边缘也有类似的副作用)只要我按住鼠标拖动它,它就会从应该的位置来回闪烁。如果我对wm nccalcSize的处理方式进行了注释,则快照的工作方式应该是正确的(但表单看起来不正确)。

    我已经在wm nccalcSize处理程序中尝试了所有我能做的事情,但我不能阻止它向左跳…当然,只有当窗口大小改变时才会调用wm nccalcSize,所以我不明白它是如何导致这种情况的!

    另外,如果你想真正看到代码,它已经 on CodePlex ,在两个文件中,查找 _HandleNCCalcSize OnWindowLocationChanged

    2 回复  |  直到 14 年前
        1
  •  6
  •   community wiki 2 revs Jaykul    16 年前

    发生这种情况的原因是处理 WM_NCCALCSIZE 更改窗口的总体大小…但是如果你在移动窗户,在 WM_MOVE WM_WINDOWPOSCHANGED (对应于WPF WindowPositionChanged 事件)导致另一个 WMnCCALCHIZHEZSIZE 消息…

    WMnCCALCHIZHEZSIZE (即使只是断言您处理了消息)也会导致另一个调用 移动 …这将使您进入一个循环,其中positionChanged消息的“from”部分保持不变(使窗口从其开始的位置“跳转”到在 移动 一次又一次的变化 WMnCCALCHIZHEZSIZE )

    正确的方法

    你要做的是服从陈瑞蒙和 handle WM_WINDOWPOSCHANGING instead . 它发生了 之前 这些其他信息,这样它们就不会互相干扰!

        2
  •  0
  •   Jaykul    16 年前

    wparam似乎总是正确的(1),lparam是nccalcSize_参数…

    其目的是按照您所说的做:强制整个窗口成为“客户机”,然后使用vista dwm API将框架扩展到客户机区域。我只是不明白为什么它会向左转…

    如果我跟踪或中断handlenccalcSize方法,当我调整窗口的大小时(当它在边缘上以便捕捉到激发时),将调用nccalcSize两次:一次调用它应该在的位置,然后向左调用它结束的位置。