Skip to content

v1.2.8

Choose a tag to compare

@cv-superding cv-superding released this 01 Sep 10:03
· 3 commits to main since this release

🐛 黑闪真因修复:之前一直修错了窗口

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。

本版修复(四管齐下)

  1. 拿到真正的顶层 HWND:新增 _top_level_hwnd(),用
    GetAncestor(GA_ROOT) 从 TkChild 上溯到 TkTopLevel。
  2. 对 TkTopLevel 与 TkChild 两层都应用修复——两层都有同样的问题。
  3. 清除 CS_HREDRAW | CS_VREDRAW(v1.2.3 完全漏掉的关键一步)。
    这两个窗口类标志会让 Windows 在尺寸变化时强制擦除并重绘整个客户区,
    是 Win32 闪烁最经典的根因。
  4. 保留类画刷替换、WM_ERASEBKGND 子类化、DWM 关动画,
    但 DWM 那步现在作用于真实顶层 HWND。

验证(_scratch/verify_winfix.py)

修复前 修复后
TkTopLevel 类样式 0x0003(HREDRAW+VREDRAW) 0x0000(已清除)
TkTopLevel 背景画刷 0x0(无 → 系统黑) 已设为应用浅色
TkChild 同样问题 同样修复

结果 VERIFY_OK。exe 启动存活测试通过。

需要你确认

黑闪属纯视觉效果,无界面环境无法自证。请实测:反复最大化 / 还原 /
拖拽拉伸窗口。

若黑闪已消失但你想要回平滑的缩放动画,告诉我——清除了重绘标志后
很可能已经不需要靠"关动画"来兜底了。