1

基本上,问题涉及在 Windows 上调整窗口大小期间的边框闪烁。
我的第一个目标是在调整对话框大小时重新定位对话框上的控件。
我认为我在此操作期间获得了良好的动态重新定位,几乎没有任何闪烁,但这里我说的是主窗口边框闪烁。
但是,我根本无法消除它。
为了简化示例,请尝试使用提供的默认代码 VS 创建一个简单的 win32 应用程序。
我正在使用默认主题(Windows 7 basic,无透明度)和 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 添加一个 case 并返回 0 来调用 DefWindowProc()。重复上述步骤并快速移动,您应该会看到窗口右边缘的很大一部分被背景窗口完全擦除。顶部和底部不会发生这种情况。

任何想法来解决这个闪烁?

谢谢!

更新 2012\09\04:
- 使用 Windows 经典主题:
uxtheme.dll 在启动时加载,但 dwmapi.dll 不加载。然而,Uxtheme.dll 似乎
没有参与任何窗口渲染过程。调整窗口大小是完美的。
- 使用 Windos 7 主题(边框透明):
uxtheme.dll 和 dwmapi.dll 在启动时加载。Uxtheme.dll 似乎不涉及
非客户区的任何部分,除了一些来自窗口顶部和主菜单的部分。
但我不确定最后一个。调整窗口大小是完美的。
- 使用Window 7 Basic 主题:
uxtheme.dll 和 dwmapi.dll 在启动时加载。Uxtheme.dll 大量用于
非客户区的渲染。窗口大小调整很糟糕。

4

0 回答 0