【发布时间】:2010-09-16 15:03:52
【问题描述】:
我有一个 WPF 应用程序,它可以捕捉到屏幕边缘(如果您在屏幕边缘的 20 像素内,我只是设置了窗口的 .Top 或 .Left),但我最近添加了一些代码 provided by the WPF SDK Team 到“窗口镶边的混乱”,虽然它工作得很好(screenshot),但它导致“snapto”意外移动窗口(例如:当它应该直接向下捕捉到底部时它会跳到左边)
我已经把它缩小到他们对 WM_NCCALCSIZE 的处理......这真的很奇怪,因为他们基本上什么都不做,他们只是说他们处理它,然后返回 0。
根据 WM_NCCALCSIZE 的文档,这只会导致整个窗口被视为客户端(没有非客户端边缘),但不知何故,这也意味着每当我的 snap-to 代码将窗口向下移动到底部在屏幕上,它也向左移动了大约 134 像素……(移动到其他边缘也有类似的副作用),只要我按住鼠标拖动它,它就会从它应该在的位置来回闪烁。如果我将 WM_NCCALCSIZE 处理注释掉,则 snap-to 会按应有的方式工作(但表单看起来不正确)。
我已经在 WM_NCCALCSIZE 处理程序中尝试了所有我能做的事情,但我无法阻止它向左跳转......当然,WM_NCCALCSIZE 只有在窗口大小发生变化时才会被调用,所以我不明白它首先是如何导致这种情况的!
附:如果要实际看代码,已经是on CodePlex了,在两个文件里找_HandleNCCalcSize和OnWindowLocationChanged
【问题讨论】:
-
当 WM_NCCALCSIZE 处理程序返回 0 时,wParam 和 lParam 是什么?文档说“如果 wParam 为 TRUE 并且应用程序返回零,则保留旧客户区并与新客户区的左上角对齐”,这听起来可能是您正在发生的事情。
-
我从来没有弄清楚这一点,但我确实确定如果我们在 WM_WINDOWPOSCHANGING 消息而不是 WPF WindowPositionChanged 事件期间调整窗口位置,问题就会消失。因此,找到了解决方法。继续生活。
标签: wpf windows winapi pinvoke