Snapshot before max-resize threshold diagnosis

This commit is contained in:
Codex
2026-04-09 03:23:10 +08:00
parent 77a8fe568a
commit f567369300
25 changed files with 1489 additions and 36 deletions
@@ -0,0 +1,73 @@
# BUG-20260409-0001
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
## 基本信息
- ID: BUG-20260409-0001
- 标题: 对话框重绘、快照残留与遮挡交互异常
- 状态:已修复 / 待持续回归
- 严重性:S2
- 优先级:P0
- 模块:Window / Dialog / Canvas / Button / TextBox
- 版本 / 分支:`master`
- 环境:Windows + EasyX + VS2022
- 发现人:协作过程静态审查与测试用例回归
- 关联 Fix IDFix-BUG-20260409-0001
## 问题描述
- 现象:
- 非模态对话框打开后,底层被遮挡控件仍可能收到鼠标事件。
- 模态或非模态对话框在窗口尺寸变化后,可能出现背景快照残留。
- 模态对话框标题区域曾出现抓到底层背景的问题。
- 对话框关闭后,底层按钮 hover 状态可能不能立即恢复。
- 多个按钮快速 hover 切换时,对话框补画链容易闪烁。
- 影响范围:
- 对话框交互正确性
- 重绘层级稳定性
- hover 与点击行为一致性
- 期望结果:
- 对话框始终位于正确层级。
- 被对话框覆盖的底层控件不会误交互。
- resize / 打开 / 关闭过程中无残影、无错位。
- 实际结果:
- 曾出现穿透、残影、错误快照、关闭后 hover 残留、频繁补画闪烁等问题。
## 复现信息
- 前置条件:存在非模态或模态对话框,且下层有可交互控件
- 复现步骤:
1. 打开包含按钮、Canvas、TabControl 的测试窗口。
2. 弹出非模态或模态对话框。
3. 在对话框遮挡区域附近快速移动鼠标,或拖动窗口大小。
- 复现概率:高概率 / 偶现(不同问题不同)
- 最小复现 Demo`z-testDome.cpp``KEY == 2 / 3 / 4`
- 证据:日志、静态推演、用户回归观察
## 初步分析
- 疑似位置:
- `Dialog::handleEvent`
- `Dialog::draw / recenterInHostWindow / clearControls`
- `Window::runEventLoop / pumpResizeIfNeeded / flushManagedRepaint`
- `Button::handleEvent`
- 触发条件:
- 对话框覆盖底层控件
- 窗口 resize
- hover 高频切换
- 对话框打开/关闭后的层级切换
- 相关线索:
- “快照作废”和“回贴旧背景”语义混用
- 事件阶段与绘制阶段原先分离不彻底
- 非模态对话框区域内鼠标事件吞掉后,底层控件拿不到离开消息
## 跟踪信息
- 首次发现时间:本轮协作初期
- 最后更新时间:2026-04-09
- 修复版本:[当前工作区]
- 验证版本:[当前工作区]
- 备注:快速划过多个按钮时一帧内偶发双高亮的问题暂未彻底消除,属于已接受的底层限制
@@ -0,0 +1,71 @@
# BUG-20260409-0002
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
## 基本信息
- ID: BUG-20260409-0002
- 标题: 基础控件生命周期与边界条件问题
- 状态:已修复 / 待持续回归
- 严重性:S2
- 优先级:P1
- 模块:Control / Window / Table / Label / Button / TextBox / MessageBox
- 版本 / 分支:`master`
- 环境:Windows + EasyX + VS2022
- 发现人:静态审查
- 关联 Fix IDFix-BUG-20260409-0002
## 问题描述
- 现象:
- `Window` 析构时可能先关闭图形环境,再让控件析构访问绘图接口。
- `Table` 在空表头、空数据、列数不一致时存在越界或空状态问题。
- `Label::setText()` 后尺寸与背景快照不能及时同步。
- `MessageBox` 外层曾直接干预 `Dialog` 初始化流程。
- 一些资源所有权和析构职责不够清晰。
- 影响范围:
- 基础稳定性
- 边界输入正确性
- 维护成本
- 期望结果:
- 生命周期安全、边界输入可防御、接口语义清晰
- 实际结果:
- 存在潜在崩溃、越界、状态不一致和维护负担
## 复现信息
- 前置条件:特定表格输入、动态修改文本、窗口关闭、MessageBox 使用链
- 复现步骤:
1. 静态审查相关代码路径。
2. 构造空表头、长于表头的数据行、动态变更 Label 文本。
3. 观察关闭窗口或销毁相关对象时的析构顺序。
- 复现概率:高概率 / 必现(不同问题不同)
- 最小复现 Demo[可选]
- 证据:静态分析、日志、编译验证
## 初步分析
- 疑似位置:
- `Window::~Window`
- `Control` 析构与背景快照恢复链
- `Table::initTextWaH / setData / drawHeader / drawTable`
- `Label::setText`
- `MessageBox::showAsync / showModal`
- 触发条件:
- 边界数据输入
- 动态文本变化
- 对象销毁 / 窗口关闭
- 相关线索:
- 所有权层次混乱
- 空状态防御不足
- 接口暴露超出真实职责
## 跟踪信息
- 首次发现时间:本轮协作初期
- 最后更新时间:2026-04-09
- 修复版本:[当前工作区]
- 验证版本:[当前工作区]
- 备注:字符集相关问题暂未处理,仍按 MBCS 假设工作