Wpf 窗口闪烁

Wpf 窗口闪烁,wpf,windows,winapi,Wpf,Windows,Winapi,我一直在深入研究Win32(我机器上的Windows 7)的核心,试图消除在调整窗口大小或最大化窗口时出现的闪烁现象。基本上,当您调整窗口大小时,win32通过在新客户端区域的左上角点选当前窗口内容来提供“帮助”。当然,这是现在很少需要的,正确的调整大小的版本很快就会出现,但闪烁的blit仍然令人讨厌,特别是因为WPF已经很好地解决了其他场景中的许多闪烁问题。第二种是当手动重新调整窗口时,通常会在右边缘和下边缘周围出现黑色条带或条带,以及控件抖动。这似乎是WPF布局管理器跟不上DirectX 作

我一直在深入研究Win32(我机器上的Windows 7)的核心,试图消除在调整窗口大小或最大化窗口时出现的闪烁现象。基本上,当您调整窗口大小时,win32通过在新客户端区域的左上角点选当前窗口内容来提供“帮助”。当然,这是现在很少需要的,正确的调整大小的版本很快就会出现,但闪烁的blit仍然令人讨厌,特别是因为WPF已经很好地解决了其他场景中的许多闪烁问题。第二种是当手动重新调整窗口时,通常会在右边缘和下边缘周围出现黑色条带或条带,以及控件抖动。这似乎是WPF布局管理器跟不上DirectX

作为我尝试过的解决方案:

拦截WM_NCCALCSIZE-经过几个小时的修补,似乎没有任何好处。 尝试不同的窗口样式-WS\u弹出窗口、WS\u边框、WS\u重叠窗口等。 截取最大化最小化大小,并使用SetWindowPos手动调整大小。 将SetWindowPos与SWP|U NOREDRAW | SWP|U一起使用。 在移动窗口之前发送WM_SETDRAW FALSE

似乎什么都不起作用-闪电战是HWND的核心和不可控制的内部吗?也许我可以深入研究directx,或者对User32.dll进行反向工程并对其进行修补。(对后者只是半开玩笑)

致以最良好的祝愿,
Steve

要完全消除闪烁是不可能的,但通过将重绘调整为“原子”操作,可以大大改善闪烁。我的意思是,所有新控件的大小都应该使用
SWP_NOREDRAW
标志来设置,以防止它们在调整大小时被重新绘制。然后使用
WM_PRINTCLIENT
将新窗口绘制为屏幕外位图。最后,点击显示。不幸的是,要让它工作起来比听起来要困难得多,但这是我找到的最好的方法。不确定这里是否存在这种情况,但从WM_ERASEBKGND返回TRUE,消除了背景绘制。