61 lines
2.9 KiB
Markdown
61 lines
2.9 KiB
Markdown
# 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`。
|