# Fix-BUG-20260415-0007 > 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。 ## 关联信息 - Fix ID: Fix-BUG-20260415-0007 - 关联 BUG ID: BUG-20260415-0007 - 修复目标: 让托管 coverage 与 overlay 补画基于实际绘制范围,而非控件本体 bounds - 状态:已完成 - 负责人: Codex - 分支 / 版本: 当前工作区 ## 根因分析 - 根因: `Window / Canvas / TabControl` 的 coverage 计算链默认使用 `getBoundsRect()`,没有把 Tooltip 这类附加绘制区域纳入。 - 触发条件: 控件本体未与 overlay 相交,但附加绘制区域超出本体并写入更上层区域。 - 为什么之前没发现: 第一轮主要解决普通控件和顶层 overlay;Tooltip 属于本体外附加绘制,直到 C / D 交界回归才稳定暴露。 - 关键证据: - 顶层按钮 Tooltip 正常,但容器内按钮 Tooltip 压到 D 橙区 - 根因与按钮本体 bounds 无关,与 Tooltip 超出范围有关 ## 修复方案 - 修复思路: 引入“实际绘制 coverage”接口,让托管重绘与局部提交统一走真实覆盖范围。 - 关键改动: - 在 `Control` 增加 `getManagedRepaintCoverageRect()` - `Button` 在 Tooltip 可见时返回“按钮矩形 + Tooltip 矩形”的并集 - `Canvas / TabControl / Table` 将可见内部绘制单元 coverage 递归并入 - `Window::requestManagedRepaint()` 和顶层 overlay 重组改为走 coverage 接口 - 涉及文件 / 类 / 函数: - `Control.h / Control.cpp` - `Button.h / Button.cpp` - `Canvas.h / Canvas.cpp` - `TabControl.h / TabControl.cpp` - `Table.h / Table.cpp` - `Window.cpp` - 影响的 API / 行为:新增内部 virtual 接口,无公开 API 变化 - 关键约束 / 不变量: - Tooltip 智能选位不在本次修复范围内 - overlay 补画继续按父容器真实绘制顺序工作 - 回滚点 / 开关:无 ## 影响评估 - 影响范围: Tooltip、overlay 补画、复杂容器内附加绘制区域 - 兼容性影响:无 - 行为变化:有(Tooltip 与 overlay 层级恢复正确) - 性能影响:有(coverage 更保守,可能触发更多 overlay 补画) - 回归风险: - coverage 扩大后顶层/容器层局部提交会多画一些 overlay - 需重点回归 Tooltip 与多跳 overlay 场景 ## 验证结果 - 验证步骤: 1. 编译 `Control.cpp / Button.cpp / Canvas.cpp / TabControl.cpp / Table.cpp / Window.cpp / z-testDome.cpp` 2. 在 KEY5 中验证 C 米区容器内按钮 Tooltip 与 D 橙区的遮挡关系 3. 回归顶层按钮 Tooltip、页签按钮 Tooltip、浮层按钮 Tooltip - 验证结果: 编译通过;逻辑推演闭合;GUI 需用户本机手测 - 回归检查:KEY5 C/D 交界区、TabControl 页签、三层嵌套按钮 Tooltip - 验证证据:编译级验证通过 ## 落地信息 - Commit: 未单独提交 - PR:[可选] - 发布版本:[可选] - 备注:Tooltip 智能选位明确延期,本次只修“coverage 正确性”