Files
StellarX-kaifa/开发记录/BUG/BUG-20260109-0001-TextBox-setText进入事件循环前调用崩溃.md
T

67 lines
2.5 KiB
Markdown
Raw 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-0001
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
## 基本信息
- ID: BUG-20260109-0001
- 标题: TextBox::setText 进入事件循环前调用崩溃
- 状态:已修复
- 严重性:S1
- 优先级:P0
- 模块: TextBox
- 版本 / 分支: v2.3.2(基础版 EasyX + Win32)
- 环境: Windows 10/11 x64 + Visual Studio 2022(MSVC)Debug / Release
- 发现人: 用户
- 关联 Fix ID: Fix-BUG-20260109-0001
## 问题描述
- 现象: 在 Window 尚未创建或图形上下文尚未初始化时调用 `TextBox::setText()` 设置默认文本,会触发 `TextBox::draw()`,进而进入依赖 EasyX 图形上下文的绘制 / 抓屏逻辑,导致访问冲突或中断。
- 影响范围: 所有“先创建控件并设置默认文本,再创建 Window / 挂载控件树”的初始化流程。
- 期望结果: `setText()` 只更新控件状态并标记需要重绘,不应在生命周期未就绪时主动绘制。
- 实际结果: `setText()` 内部直接调用 `draw()`,绘制链路在图形上下文未就绪时崩溃。
## 复现信息
- 前置条件:[可选] Window / EasyX 图形上下文尚未初始化。
- 复现步骤:
1. 在创建 Window 或首次 `draw()` 前创建 TextBox。
2. 调用 `TextBox::setText()` 设置默认文本。
3. 随后才创建 Window 或将 TextBox 添加到 Canvas / Window。
4. 观察程序在 `setText()` 阶段崩溃。
- 复现概率:必现
- 最小复现 Demo:
```cpp
Window window(1024, 768, NULL, RGB(255, 255, 255), "StellarX Application");
auto initLibPathBox = std::make_unique<TextBox>(230, 230, 700, 30);
initLibPathBox->setText("textText");
window.addControl(std::move(initLibPathBox));
window.draw();
return window.runEventLoop();
```
- 证据:PDF 历史记录描述 `setText()` 触发 `draw()` 后进入 `saveBackground()` / `getimage()` 等图形上下文相关逻辑。
## 初步分析
- 疑似位置: `TextBox::setText()`
- 触发条件: 控件属性设置发生在 Window 绘制 / EasyX 图形上下文初始化之前。
- 相关线索:
- setter 不应带有依赖图形上下文的即时绘制副作用。
- `draw()` 会进入背景快照与图像抓取链路。
- 最近相关改动:[可选]
## 跟踪信息
- 首次发现时间: 2026-01-09
- 最后更新时间: 2026-09-19(从 PDF 整理入库)
- 修复版本: v3.0.0
- 验证版本:[可选] v3.0.0
- 备注:[可选] 来源原始 ID 为 `BUG-20260109`;同日另有 Table 重影问题,入库时按顺序拆为 `0001` 与 `0002`。