右边缘未上漆&在非客户区域绘制主题

时间:2012-09-01 18:14:45

标签: windows resize themes border

基本上,问题涉及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大量用于   渲染非客户区域。窗口调整大小很糟糕。

0 个答案:

没有答案