# 功能变更 ID: Feature-20260511-0012 > 适用场景:记录小到中等规模的功能、接口、行为、默认值或配置变化。 > 不适用场景:新增核心模块、重大模块重构、架构级设计,请使用“新增功能模块”模板。 ## 基本信息 - ID: Feature-20260511-0012 - 标题: 发布前托管重绘与 KEY6 封版收口 - 状态:已完成 - 类型:修改 - 级别:L3 重大 - 模块: Window / Canvas / TabControl / Tooltip / Dialog / 测试用例 - 版本 / 分支: 当前工作区 - 环境: Windows / EasyX - 负责人: Codex ## 变更背景 - 背景: - 发布前封版阶段需要稳定现有布局、托管重绘、Dialog / overlay / hover 状态同步链路。 - KEY6 补充覆盖后暴露了非模态 Dialog、Tooltip、跨 root dirty、透明 Label 快照等组合问题。 - 目标: - 修复确定性小问题。 - 收口 Dialog / overlay 后鼠标状态同步语义。 - 让 KEY6 覆盖已实现但原主回归未覆盖的分支。 - 修复托管局部重绘中 coverage 和背景快照语义混用导致的问题。 - 不做什么:[可选] - 不实现焦点系统。 - 不实现键盘事件系统。 - 不做 Tooltip 智能选位。 - 不做 Table 纵向 Stretch。 - 不实现 Table 内部局部重绘体系。 ## 变更内容 - 变更摘要: - 修复 `TabControl::indexOf()` 未命中返回值。 - 抽取 Dialog / overlay 后鼠标状态同步辅助函数。 - 新增 KEY6 分支覆盖用例。 - `Window` 增加局部 root 提交后 overlay coverage 保守兜底。 - `Window` 事件尾补收集跨 root dirty 子树。 - 托管重绘拆分完整 coverage 与持久 coverage,避免 Tooltip 污染背景快照。 - 新增项:[可选] - `Window::syncMouseStateAfterOverlayChanged(...)` - `Window::collectDirtyRootsForManagedRepaint()` - `Control::getManagedRepaintPersistentCoverageRect()` - KEY6 测试入口 - 修改项:[可选] - `Canvas / TabControl` 局部 overlay 补画策略。 - `Button` Tooltip coverage 语义。 - `Table` 托管 coverage 语义补充。 - 删除 / 废弃项:[可选] - 无 - 受影响的文件 / 类 / 函数: - `Window.h / Window.cpp` - `Control.h / Control.cpp` - `Button.h / Button.cpp` - `Canvas.h / Canvas.cpp` - `TabControl.h / TabControl.cpp` - `Table.h / Table.cpp` - `z-testDome.cpp` - 对外 API / 属性变化:[可选] - 无公开用户 API 变化。 - 新增接口均为内部托管重绘语义。 ## 行为对照 - 变更前: - `indexOf()` 未命中返回最后索引。 - Dialog 关闭 / 非模态 Dialog 吞鼠标移动后的 synthetic move 逻辑散落在 `runEventLoop()`。 - 局部 root 内部 coverage 扩张后,Window 可能漏补 Dialog。 - 跨 root 回调改脏后,目标 root 可能等下一次事件才刷新。 - Tooltip 临时浮层与持久 coverage 混用,可能污染或擦除兄弟控件快照。 - 变更后: - `indexOf()` 未命中返回 `-1`。 - overlay 后鼠标状态同步由语义函数集中处理。 - Window 对可局部提交 root 的上层补画判断更保守。 - 事件尾会补收集未登记但已 dirty 的 root。 - Tooltip 进入完整 coverage,但不进入持久 coverage;只命中临时浮层的兄弟控件不再补画。 - 兼容性说明:兼容 - 迁移说明:[可选] - 用户代码无需迁移。 ## 验证与落地 - 验证方式: - 编译核心变更文件。 - 编译 `z-testDome.cpp` 的 `KEY1 ~ KEY6`。 - 根据用户手测反馈修正 KEY6 Tooltip / Dialog / Label 组合问题。 - 验证结果: - `Control.cpp / Button.cpp / Canvas.cpp / TabControl.cpp / Table.cpp / Window.cpp` 编译通过。 - `KEY1 ~ KEY6` 编译通过。 - GUI 行为需继续由用户在本机手测确认。 - 关联 BUG / Fix:[可选] - BUG-20260511-0009 / Fix-BUG-20260511-0009 - BUG-20260511-0010 / Fix-BUG-20260511-0010 - BUG-20260511-0011 / Fix-BUG-20260511-0011 - BUG-20260511-0012 / Fix-BUG-20260511-0012 - Commit: 未提交 - PR:[可选] - 发布版本:[可选] - 备注:[可选] - 下版本建议引入 `commitManagedRepaint()` actual coverage 返回值,替代当前 root coverage 保守兜底。 - 下版本建议建立正式 coverage 诊断日志开关,避免再临时散加日志。