Files
StellarX-kaifa/开发记录/BUG/BUG-20260109-0002-TabControl切换后Table新旧内容重叠.md

61 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# BUG-20260109-0002
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
## 基本信息
- ID: BUG-20260109-0002
- 标题: TabControl 切换后 Table 新旧内容重叠
- 状态:已修复
- 严重性:S2
- 优先级:P1
- 模块: TabControl / Canvas / Table / 背景快照 / 脏标记重绘链路
- 版本 / 分支: 基础版(EasyX + Win32)/ v2.3.2
- 环境: Windows x64 / Visual Studio 2022 / EasyX(Debug / Release 均可能)
- 发现人: 用户
- 关联 Fix ID: Fix-BUG-20260109-0002
## 问题描述
- 现象: 运行 TabControl 示例后,切换到“按钮1”页签并触发“重置表格数据”,随后打开 / 关闭其他页签再切回“按钮1”,Table 稳定出现旧内容与新内容叠加;偶发情况下重置数据当次即出现重影。
- 影响范围: 使用背景快照擦除与局部重绘组合的容器 / 控件,尤其是 Table 透明文字背景与 Null 填充模式场景。
- 期望结果: 切换页签、关闭页签、重置数据后,Table 只显示当前数据,不残留旧像素。
- 实际结果: Table 区域出现旧行文本像素残留,与新内容叠在同一位置。
## 复现信息
- 前置条件:[可选] TabControl 示例中包含 Table 和“重置表格数据”按钮。
- 复现步骤:
1. 运行测试程序(TabControl 示例)。
2. 切换到“按钮1”页签。
3. 点击“重置表格数据”(清空并重新 `setData()`)。
4. 随意切换到其他页签,可伴随关闭页签操作。
5. 再切回“按钮1”。
6. 观察 Table 区域是否出现旧内容与新内容重叠。
- 复现概率:必现;重置数据当次直接重影为偶现。
- 最小复现 Demo:`z-testDome.cpp` 中 TabControl + Table + 重置按钮场景;Null FillMode 与透明文字背景更明显。
- 证据:日志显示 Canvas 快照刚丢弃或未就绪时,Table 可见性恢复立即触发局部重绘,随后 `saveBackground()` 把已绘制像素截入背景快照。
## 初步分析
- 疑似位置:
- `Control::setIsVisible(true)`
- `Canvas::requestRepaint()`
- `TabControl::requestRepaint()`
- 触发条件: 页签切换 / 关闭期间,父容器快照未就绪或 dirty 未清理时,子控件抢跑执行局部绘制。
- 相关线索:
- `show=true` 时立即向上 `requestRepaint()`。
- `Canvas::requestRepaint()` 在 `hasSnap=0` / `dirty=1` 状态下仍允许对子控件局部 `draw()`。
- 页签切换期间尺寸变化会触发丢背景快照和标脏。
- 最近相关改动:[可选] `Control::setIsVisible(true)` 变为立即请求重绘。
## 跟踪信息
- 首次发现时间: 2026-01-09
- 最后更新时间: 2026-09-19(从 PDF 整理入库)
- 修复版本: v3.0.0
- 验证版本:[可选] v3.0.0
- 备注:[可选] 来源原始 ID 为 `BUG-20260109`;同日另有 TextBox 生命周期问题,入库时按顺序拆为 `0001` 与 `0002`。