基本上,问题涉及Windows上窗口大小调整期间的边界闪烁
我的第一个目标是在调整对话期间重新定位对话框
我认为在这个操作过程中我没有几乎任何闪烁的动态重新定位,但在这里我说的是主窗口边界闪烁。
但是,我根本无法消除它
为了简化示例,尝试使用提供的默认代码VS创建一个简单的win32应用程序
我正在使用默认主题(Windows 7基本版,无透明度)和VS2008在Window 7(64位)上进行测试。
1)不要在应用程序中添加代码
2)在调试模式下运行它
3)将窗口的左边缘慢慢向屏幕左侧拖动,同时注意窗口的右边缘。您应该看到重新绘制的行动
4)重复步骤3快速移动鼠标,您应该看到右边缘的闪烁更清晰。
如果颠倒边缘,即移动窗口的右边缘,则左边缘会牢牢固定在那里,没有未涂漆的区域。 顶边边界与底边边界相同。
现在,启用经典主题(类似于Win2000)并再次重复上述步骤。右边完全没有闪烁! 如果在调试模式下运行时密切关注Visual Studio的输出窗口,您应该会看到与exe一起加载的dll列表。如果您使用默认主题在调试模式下运行,您将看到加载了uxtheme.dll。相反,启用经典主题后,未加载uxtheme.dll(始终加载dwmapi.dll)。可能uxtheme.dll在运行时加载,基于桌面设置,它会重新绘制Windows非客户区域。
您可以使用另一个技巧来查看此闪烁的效果是为WM_NCPAINT添加一个大小写并返回0来调用DefWindowProc()。重复上述步骤并快速移动,您应该看到窗口右边缘的很大一部分被背景窗口完全擦除。顶部和底部都不会发生这种情况。
有什么想法解决这个闪烁问题吗?
谢谢!
更新2012 \ 09 \ 04:
- 使用Windows经典主题:
uxtheme.dll在启动时加载,但dwmapi.dll没有。然而,Uxtheme.dll似乎是
没有参与任何窗口渲染过程。窗口大小调整是完美的
- 使用Windos 7主题(边框透明度):
uxtheme.dll和dwmapi.dll在启动时加载。 Uxtheme.dll似乎没有涉及到
非客户区的任何部分,除了从窗口顶部和主菜单中的一些部分
但我不确定最后一次。窗口大小调整是完美的
- 与Window 7基本主题:
uxtheme.dll和dwmapi.dll在启动时加载。 Uxtheme.dll大量用于
渲染非客户区域。窗口调整大小很糟糕。