# Fix-BUG-20260409-0003 > 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。 ## 关联信息 - Fix ID: `Fix-BUG-20260409-0003` - 关联 BUG ID: `BUG-20260409-0003` - 修复目标: 取消对合法大跨度最大化的误拦截,仅保留非法尺寸保护 - 状态:已完成 / 待用户回归 - 负责人:Codex 协作修改 - 分支 / 版本:`master` ## 根因分析 - 旧逻辑问题: - `runEventLoop()` 的 resize 收口中存在“跨度保护”: - `abs(finalW - width) > 1000 || abs(finalH - height) > 1000` - 命中后直接跳过整个收口流程。 - 为什么会出问题: - 该判断关注的是“变化跨度”,而不是“尺寸是否合法”。 - 在大屏、窗口初始尺寸较小、直接最大化等正常场景下,跨度超过 `1000` 很常见。 - 为什么之前未必稳定暴露: - 当初始尺寸较大时,最大化跨度较小,不会命中阈值。 - 先手动拉大一点后再最大化,也会避开该阈值。 ## 修复方案 - 修复思路: - 删除“跨度过大即跳过”的保护语义。 - 改成“仅非法客户区尺寸才跳过”。 - 保留关键 `DEBUG` 日志,方便追踪极端尺寸帧。 - 关键改动: - 删除旧的 `>1000` 误拦截分支。 - 引入虚拟桌面尺寸: - `SM_CXVIRTUALSCREEN` - `SM_CYVIRTUALSCREEN` - 仅在以下情况下跳过本次收口: - `actualWidth <= 0` - `actualHeight <= 0` - `actualWidth > max(10000, virtualScreenWidth * 2)` - `actualHeight > max(10000, virtualScreenHeight * 2)` - 对“大跨度但合法”的 resize 增加 `DEBUG` 日志,但继续执行收口。 - 涉及文件 / 类 / 函数: - `Window.cpp` - `Window::runEventLoop()` - 输出日志: - `尺寸调整被非法尺寸保护跳过` - `检测到大跨度尺寸调整,继续执行收口` ## 影响评估 - 对外行为变化: - 有。直接最大化不再被 `>1000` 阈值拦截。 - 兼容性影响: - 正向兼容。正常拖拽 resize、正常最大化都仍然走原有收口流程。 - 风险: - 如果系统偶发产生一次极端异常客户区尺寸,可能会更多依赖当前“非法尺寸保护”而不是原来的跨度阈值。 - 但相较于误杀合法最大化,这个风险更合理。 ## 验证结果 - 验证方式: 1. 在 `>1000` 旧保护分支中先加 `DEBUG` 日志,确认 `KEY == 1 / 2` 命中。 2. 替换为非法尺寸保护后,编译 [`Window.cpp`](D:/programming/imGUI-easyX/imGui-easyX/Window.cpp)。 3. 按 `KEY == 1 ~ 4` 做逻辑推演。 - 理论结果: - `KEY == 1 / 2`:现在应打印“大跨度但继续执行收口”日志,并继续完成 `尺寸调整已完成`。 - `KEY == 3 / 4`:原本正常,行为保持一致。 - 备注: - 当前这轮无法直接替用户跑 GUI 自动化,只能做逻辑推演和源码级编译验证。 ## 落地信息 - Commit: - `f567369`:修改前快照 - 当前工作区:已替换跨度保护,待提交 - 发布版本:待定 - 备注: - 同轮顺手删除了 `Window.cpp` 中一个未使用的 `ExMessage mm;` 遗留变量。