Repository navigation
v1.2.8
🐛 黑闪真因修复:之前一直修错了窗口
v1.2.3 的诊断是错的。 当时认为黑闪来自 DWM 最大化缩放动画的合成层,
于是做了「类画刷 + WM_ERASEBKGND + 关闭 DWM 动画」三件套——
但黑闪始终没消失。
实测诊断(_scratch/diag_top.py)
winfo_id() -> class=TkChild (Tk 的内部子窗口)
GetAncestor(GA_ROOT) -> class=TkTopLevel (真正的顶层窗口)
root.winfo_id() 返回的不是顶层 HWND,而是 Tk 用来承载控件的内部子窗口
TkChild。所以那三件套全都作用在了 TkChild 上,真正的顶层窗口 TkTopLevel
从未被修复过——它一直是 brush=0x0(无画刷 → 系统默认黑)
外加 CS_HREDRAW | CS_VREDRAW。
本版修复(四管齐下)
- 拿到真正的顶层 HWND:新增
_top_level_hwnd(),用
GetAncestor(GA_ROOT)从 TkChild 上溯到 TkTopLevel。 - 对 TkTopLevel 与 TkChild 两层都应用修复——两层都有同样的问题。
- 清除
CS_HREDRAW | CS_VREDRAW(v1.2.3 完全漏掉的关键一步)。
这两个窗口类标志会让 Windows 在尺寸变化时强制擦除并重绘整个客户区,
是 Win32 闪烁最经典的根因。 - 保留类画刷替换、
WM_ERASEBKGND子类化、DWM 关动画,
但 DWM 那步现在作用于真实顶层 HWND。
验证(_scratch/verify_winfix.py)
| 修复前 | 修复后 | |
|---|---|---|
| TkTopLevel 类样式 | 0x0003(HREDRAW+VREDRAW) |
0x0000(已清除) |
| TkTopLevel 背景画刷 | 0x0(无 → 系统黑) |
已设为应用浅色 |
| TkChild | 同样问题 | 同样修复 |
结果 VERIFY_OK。exe 启动存活测试通过。
需要你确认
黑闪属纯视觉效果,无界面环境无法自证。请实测:反复最大化 / 还原 /
拖拽拉伸窗口。
若黑闪已消失但你想要回平滑的缩放动画,告诉我——清除了重绘标志后
很可能已经不需要靠"关动画"来兜底了。