# Fix-BUG-20260415-0005 > 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。 ## 关联信息 - Fix ID: Fix-BUG-20260415-0005 - 关联 BUG ID: BUG-20260415-0005 - 修复目标: 收口局部重绘提交后的 overlay 兄弟补画机制 - 状态:已完成 - 负责人: Codex 协作修改 - 分支 / 版本: 当前工作区 ## 根因分析 - 根因: - 局部重绘提交只重画了 dirty root 或 dirty child,没有按父容器真实绘制顺序把 coverage 上方相交的兄弟补画回来。 - 触发条件: - 下层区域写入像素后,上层 sibling 与本次 coverage 相交。 - 为什么之前没发现:[可选] - 旧场景多集中在对话框覆盖链,普通 sibling overlay 问题没有被系统化回归。 - 关键证据:[可选] - `KEY5` 中 `Table` 翻页覆盖顶层粉色浮层可稳定复现。 - 同父 `Canvas` 相交子控件在局部重绘后会出现相同症状。 ## 修复方案 - 修复思路: - 不做控件之间的长期联动标记。 - 改为由父容器在局部重绘提交后,按真实绘制顺序动态补画 coverage 上方相交的直接绘制单元。 - 关键改动: - `Window`:补画普通顶层控件 overlay,而不再只补 `Dialog` - `Canvas`:补画 coverage 上方相交的直接子控件 - `TabControl`:按自己的真实绘制顺序补画页签按钮与页面 - overlay 补画前统一 `invalidateBackgroundSnapshot()`,避免旧快照反贴旧背景 - 涉及文件 / 类 / 函数: - [`Window.cpp`](D:/programming/imGUI-easyX/imGui-easyX/Window.cpp) - [`Canvas.cpp`](D:/programming/imGUI-easyX/imGui-easyX/Canvas.cpp) - [`TabControl.cpp`](D:/programming/imGUI-easyX/imGui-easyX/TabControl.cpp) - 影响的 API / 行为:[可选] - 无对外 API 变化 - 局部重绘行为更严格遵守视觉合成顺序 - 关键约束 / 不变量:[可选] - 父容器只处理自己的直接绘制单元 - overlay 补画顺序必须与实际 `draw()` 顺序一致 - 不升级为整窗 / 整容器重绘,除非父容器自身快照或 dirty 条件不满足 - 回滚点 / 开关:[可选] - 无单独开关,回滚需回退相关局部重绘提交逻辑 ## 影响评估 - 影响范围: - `Window / Canvas / TabControl` 的局部重绘提交路径 - 兼容性影响:无 - 行为变化:有(局部重绘后会补画上层 overlay) - 性能影响:有(增加必要的 overlay 补画),但仍显著小于整窗 / 整容器重绘 - 回归风险: - 若 coverage 计算不准,仍可能遗漏或多画 - `TabControl` 局部重绘顺序必须和真实 `draw()` 顺序保持一致 ## 验证结果 - 验证步骤: 1. 编译 [`Window.cpp`](D:/programming/imGUI-easyX/imGui-easyX/Window.cpp)、[`Canvas.cpp`](D:/programming/imGUI-easyX/imGui-easyX/Canvas.cpp)、[`TabControl.cpp`](D:/programming/imGUI-easyX/imGui-easyX/TabControl.cpp) 2. 编译 [`z-testDome.cpp`](D:/programming/imGUI-easyX/imGui-easyX/z-testDome.cpp) `KEY=5` 3. 回归 `Table` 翻页、相交 `Canvas`、`TabControl` 页签/页面遮挡场景 - 验证结果: - 编译级验证通过 - GUI 手动回归需继续在本机确认 - 回归检查:[可选] - `Table` 分页按钮与页码链已同步收口 - 验证证据:[可选] - `KEY5` 已新增更明确的 overlay 专项场景 ## 落地信息 - Commit: 未提交(当前工作区) - PR:[可选] - 发布版本:[可选] - 备注:[可选] - `Dialog` 旧 synthetic move 逻辑本轮保留,后续可再评估是否纳入通用清理模型。