# Fix-BUG-20260929-0001 > 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。 ## 关联信息 - Fix ID: Fix-BUG-20260929-0001 - 关联 BUG ID: BUG-20260929-0001 - 修复目标: 避免 Table 运行期重置后的分页按钮旧快照覆盖新页码 - 状态:已完成 - 负责人: Codex - 分支 / 版本: 当前工作区 ## 根因分析 - 根因: `Table::draw()` 先通过 `drawPageNum()` 绘制新页码,随后 `drawButton()` 才重新定位上一页和下一页按钮。按钮的 `setX()/setY()` 会回贴旧位置背景快照;当旧按钮区域与新页码位置相交时,新页码被局部擦除。 - 触发条件: 运行期替换表头或数据后,表格宽度和分页控件位置发生变化。 - 为什么之前没发现: 既有检查覆盖普通翻页重绘,但没有覆盖“表格结构尺寸变化 + 三个分页控件同帧搬移”的首帧顺序。 - 关键证据: 后续 hover 只触发重绘、不再改变分页控件位置,此时页码立即恢复完整,说明页码内容和设脏逻辑本身有效。 ## 修复方案 - 修复思路: 将分页内部控件的布局刷新前移到 Table 新一帧绘制之前。先更新页码文本,再统一移动页码 Label 和两个分页按钮并清理旧快照,最后绘制表体、页码和按钮。 - 关键改动: - 集中生成当前页码文本,避免布局阶段和绘制阶段使用不同字符串。 - 当分页布局失效时,在 Table 回贴并重绘自身之前完成页码 Label 的尺寸、位置和文本更新。 - 在同一预布局阶段完成上一页、下一页按钮的位置更新,确保旧快照不会覆盖本帧已经绘制的分页元素。 - 保留最终“表体 -> 页码 -> 分页按钮”的绘制顺序。 - 涉及文件 / 类 / 函数: - `src/StellarX/Table.cpp` - `Table::draw()` - `Table::drawPageNum()` - 影响的 API / 行为: 无公共 API 变化;仅修正运行期重置后的首帧绘制结果。 - 关键约束 / 不变量: Table 内部控件因布局变化产生的旧快照回贴必须发生在父 Table 绘制新内容之前。 - 回滚点 / 开关: 回退 `Table::draw()` 中的分页预布局块及统一页码文本生成函数。 ## 影响评估 - 影响范围: Table 数据、表头、每页行数变化后的分页区重绘。 - 兼容性影响:无 - 行为变化:有(重置后的首帧直接显示完整页码) - 性能影响:可忽略,仅在分页布局失效时提前执行原有位置刷新。 - 回归风险: - 透明 Table 背景下的分页区快照恢复顺序变化。 - 页码位数变化造成 Label 宽度变化时,需要确认左右按钮仍与页码保持正确间距。 - 隐藏分页按钮后再恢复显示时,需要确认按钮仍能初始化并正确定位。 ## 验证结果 - 验证步骤: 1. 执行 `scripts/test.ps1 -Suite NonUI`。 2. KEY1 页签 1 点击页内按钮后,不移动鼠标立即检查完整页码。 3. 连续重置三次,并执行上一页、下一页切换。 4. hover 页签 2、页签 3 并切换后返回,确认分页区无残影。 - 验证结果: 2026-09-29 执行 `scripts/test.ps1 -Suite NonUI`,Debug x64、Debug x64 ASan、Release x64、Debug Win32 均为 15/15 通过;ASan 未报告内存错误;KEY1 至 KEY6 均编译、链接通过。用户于 2026-09-30 完成 KEY1 至 KEY6 手工回归,暂未发现明显问题。 - 回归检查: KEY1 表格重置与翻页;KEY5 Table 分页、页码和上层浮层。 - 验证证据:[可选] ## 落地信息 - Commit: 未提交 - PR:[可选] - 发布版本:[可选] - 备注: UI 像素结果已由用户按 `TESTING.md` 完成人工验收。