修复浮动面板事件穿透 / 自由标记总是预览最近信号 / 固定点位于GX与图例之下 / 预览曲线取值插值;体积红线放宽到900KB

1) 浮动面板不得被右键与中键穿透(用户报告:在面板上右键会弹出下面网格的右键菜单)
   - 新增 PlotView::OnRButtonDown:TopPanelAtPoint 命中即置顶并消费该次右键;
     Application::WM_RBUTTONDOWN 在「绘图区右键 → 网格菜单」之前调用它。
   - OnMButtonDown 开头同样判定面板:命中即消费,不再进入平移。

2) 「自由标记点选取」总是预览网格内离鼠标较近的信号(用户报告:单信号时也必须贴近曲线)
   - ProbeFreeMarker 删除 `if (!hitCurve) continue;`,改为两候选取更近:
     ① 鼠标到画出来的折线的垂直距离(阶跃竖直段只有它能命中);
     ② 同一时刻(鼠标时刻吸附最近采样)采样点的屏幕纵向距离。
   - 门槛 tolerance 只用于「已吸附」圆环;固定点仍恒吸附到真实采样时刻。

3) 固定标记点位于 GX 编号徽标与图例之下(用户要求:数据显示不得遮挡它们)
   - PaintFreeMarker 把 m_legendHits 托底矩形与 LaneBadgeRect 用 gd::Region::Exclude
     排除出绘制区;仅在确有固定点/预览时才计算。
   - PaintFreeMarkerCapsule 新增 vectorText:胶囊与遮挡矩形相交时文字改走 GDI+
     (GDI DrawTextW 不认 GDI+ 裁剪区)。

4) 预览曲线(中心轴/均值滤波/弱峰调整)的光标取值点落回曲线
   - paintDerivedCapsule 改为在光标准确时刻按时间线性插值,且先 ApplyDrawTransform 再插值
     (绝对值/垂直镜像非线性,先插值会偏离折线);双光标增量同样插值。

5) 产物体积红线由 800KB 放宽到 900KB(到达阈值时提醒,不是禁止超过)。

验证(全离屏,未占用鼠标/键盘/屏幕):仓库外临时探针 25/25(A 面板右键/中键不穿透且面板外仍生效;
B 远离曲线可预览与单击固定、两信号按纵向距离择优;C 图例与 GX 区域像素差 0、整幅差异 5 万像素;
D 阶跃区标注点与曲线差 0.0px,插值点与最近采样点相差 39px/197px);A/B 恢复旧门槛 ⇒ 5 项失败,
改回最近采样取值 ⇒ 均值/中心轴各偏 36px 失败。make release / make debug 零警告;
Target.exe 860,672 字节(840.5 KiB)。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-27 20:14:49 +08:00
1 parent 14b18d5c39
commit df715a035e
6 files changed
+442 -60

No files matched your search

+17 -1
View File
@@ -224,6 +224,18 @@ namespace jdi
*/
bool OnLButtonUp(int x, int y);
/**
* @brief 处理鼠标右键按下(**只处理浮动面板**)。
*
* 浮动面板压在波形之上,属最上层元素:右键落在面板上必须被面板消费,
* 不得穿透到下面的网格(否则会在面板上弹出网格的 Y 轴菜单)。
*
* @param [IN] x 客户区横坐标。
* @param [IN] y 客户区纵坐标。
* @return 命中浮动面板(已消费该次右键)返回 true;否则返回 false,由宿主继续处理。
*/
bool OnRButtonDown(int x, int y);
/**
* @brief 处理鼠标中键按下:与左键在常规模式下一致,进入自由平移(水平平移时间轴 +
* 纵向偏移当前网格幅值)。**任何缩放模式下都可用**,用于在不改变当前模式的
@@ -1969,10 +1981,14 @@ namespace jdi
* @param [IN] close ✕ 按钮矩形(宽度为 0 表示不画)。
* @param [IN] closeHot ✕ 是否处于悬停态。
* @param [IN] alphaScale 整体不透明度系数(1 = 不透明;固定点受「标记透明度」控制)。
* @param [IN] vectorText 强制用 GDI+(`DrawString`)画文字,即使完全不透明。
* ⚠️ GDI `DrawTextW`(`UiText`)**不认 GDI+ 裁剪区**;胶囊压在网格的 GX 标签 /
* 图例上时必须走 GDI+,否则文字会“穿透”到图例上方(用户 2026-10-27 要求标记点
* 显示在 GX 标签与图例之下)。正常情形仍用 `UiText`(与既有像素保持一致)。
*/
void PaintFreeMarkerCapsule(gd::Graphics& g, const gd::RectF& label, const std::wstring& text,
std::uint32_t color, const gd::RectF& close, bool closeHot,
float alphaScale = 1.0f);
float alphaScale = 1.0f, bool vectorText = false);
/**
* @brief 计算某个固定点相对**同信号**前一个固定点的增量与其时间间隔。