3bca3b1201f74595d0513b755ac303bc3ed58869
一、列表滚动越界绘制(SignalPanel + PaintUtil) 根因:UiText 走 GDI DrawTextW,而 GDI 文本不遵循 GDI+ 的 Graphics::SetClip。 列表虽然用 g.SetClip(m_listRect) 裁剪,但被滚出视口的「部分可见」行(分组行、信号名) 仍会把文字画到列表上方的筛选框区域(用户报告 MF4 多信号场景);UiFillRect 对大面积的 不透明矩形会改走 GDI FillRect,同样越界。 修法: * PaintUtil 新增 UiTextClipped(g, text, font, rect, argb, align, clipRect) ——在同一个 HDC 上 SaveDC + IntersectClipRect + RestoreDC;UiText 重构为转发 clip = nullptr,行为与旧实现完全一致。 * SignalPanel 新增 PaintRowText()(裁剪到 m_listRect)与 FillRowRect()(夹取到 m_listRect),分组行与信号行的全部文本、行底色/选中底色都改走它们。 二、两个边沿计数浮动面板「鼠标不动就不刷新」(PlotView::PanelSlotKey) 根因:浮动面板使用像素图层缓存(m_panelDc + m_panelSlots + PanelSlotKey),而界面上显示的 「上升沿 / 下降沿」是分帧推进出来的中间结果,PanelSlotKey 里没有这些数字 ⇒ 统计推进不会 让键变化 ⇒ 面板一直贴旧像素 ⇒ 显示停在「统计中…」或某个中间值,只有移动鼠标(改变面板 层序 / 悬停 / 鼠标坐标等其它键)才会重绘并显示早已算完的正确结果;扫描推进本身并没有停。 修法:PanelSlotKey 内按面板实际显示的条目回调 EdgeCountsFor(COUNT 面板)/ EdgeCenterCountsFor(CENTER 面板),把 (rising, falling, complete) 一并 mix 进键。 三、验证(离屏 .preflight/check:SW_HIDE 窗口、不注入真实鼠标键盘、进程/线程 BELOW_NORMAL) 39/39 通过(连跑两次稳定): * [A] 40 信号同一网格、滚轮下滚:列表上边界以上区域逐像素 0 变化,列表内部仍有变化 (证明是裁剪而不是整块不画); * [B] 3 信号 × 300 万采样、两种统计同时开启:面板像素图层缓存键在扫描期间持续变化, 且不注入任何鼠标消息即可 complete; * [C] 真实 TestData/MF4-Record.MF4(124 信号 / 3 条时间轴):同样 0 像素变化。 A/B:git stash 回退本轮修复后重跑 ⇒ [A] 1571 像素被污染、[B] 两个面板的缓存键均不推进, 如实失败。 make release 零警告(用户正在运行 Target.exe,链接用临时 -o 名字验证通过)。 四、规则同步 Documents/agent_mem.md 新增 §9.28、§11.2 第 53/54 条硬约束与变更日志。
Languages
C++
99.5%
Makefile
0.5%