交互修正:悬停提示跟随鼠标、信号拖拽手掌/抓握光标、增量只显示在右侧光标

- 信号悬停提示改为真正跟随鼠标(PaintSignalInteraction 用 m_mouseX/m_mouseY 定位,
  删除 m_hoverAnchorX/m_hoverAnchorY)。
  根因:OnMouseMove 只在状态变化时返回 changed,仅鼠标位置变化时返回 false,
  宿主不重绘 → 提示停在上一帧位置。现补上
  `if (m_hoverSignal.IsValid() && mouseMoved) changed = true;`(mouseMoved 由前后坐标比较得出),
  鼠标在可拖拽区域内持续移动时提示条会跟随。

- 可拖拽信号的光标响应参考 Photoshop 平移元素:
  悬停时用手掌光标(IDC_HAND),按住左键拖拽途中用抓握光标(IDC_SIZEALL)。

- 双光标增量差值:改为**只**由"右侧光标"(时间较大的那条)显示,
  按差值显式给出正负号(+ / -,不再固定用 ±);把右光标拖到左侧后,
  增量会自动改由新的右侧光标显示。(判定改用时间比较,不再用 m_activeCursor。)

- 光标时间读数标签与 Δt 差值标签:悬停(未按下)时不再改变鼠标光标,
  真正拖拽时统一使用左右箭头(IDC_SIZEWE)。
  两个标签都叠在光标线正上方,因此在 QueryCursor 中必须先于光标线判定返回 nullptr,
  否则会命中光标线给出 SIZEWE。

- Δt 差值文案由 "Δt " 改为 "Δt:"(全角冒号)。

- 一并移除遗留的 TEMP-PROBE 调试输出(HitTestSignal / PaintSignalInteraction /
  OnMouseMove 探针)与已不再使用的 m_dragOnLabel。

验证(TestData/VERY_BIG_DATA.CSV,编码器A相密集方波,125%、1725x996):
- 提示跟随:悬停 (700,250)→(700,400)→(760,620)→(900,700) 后,
  提示条出现在最后一次鼠标位置旁(截图核对),不再停留在首次出现处。
- 光标形态探测:信号悬停 = HAND;拖拽信号 = SIZEALL;
  时间读数标签/Δt 标签悬停 = ARROW(不改变);Δt 标签拖拽 = SIZEWE;
  时间读数标签拖拽 = SIZEWE;光标线上方悬停 = SIZEWE。
- 增量归属:默认双光标左 4.9417(无增量)/ 右 4.9425 , +0.0008;
  把右光标拖到左侧后变为左 0.288688(无增量)/ 右 4.9417 , +4.65301;
  把右光标拖到低电平处得到 4.80724 , -0.134458(负号正确)。
- Δt 文案:截图确认显示 "Δt: 15s 457.214ms"。
- 回归([1].CSV 双光标):左 426.316(无增量)/ 右 538.583 , +112.267;
  Δt:151ms 200us。
- make clean && make all 无警告无错误。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-08 21:51:16 +08:00
1 parent ed13aa7d49
commit a566d98bab
2 files changed
+34 -80

No files matched your search

-3
View File
@@ -913,7 +913,6 @@ namespace jdi
int m_spanDragStartX = 0; /**< 差值标签拖拽起点横坐标。 */
double m_spanDragTime1 = 0.0; /**< 差值标签拖拽起始时两条光标的时间。 */
double m_spanDragTime2 = 0.0;
bool m_dragOnLabel = false; /**< 本次光标拖拽是从时间/差值标签上抓起的(用抓握光标)。 */
int m_cursorGrabOffset = 0; /**< 从光标时间标签上抓起时的横向偏移(像素)。 */
PlotEditTarget m_editTarget = PlotEditTarget::NONE; /**< 当前内联输入目标。 */
TextEdit m_edit; /**< 输入框编辑模型(光标/选区/剪贴板)。 */
@@ -927,8 +926,6 @@ namespace jdi
int m_hoverLane = -1; /**< 当前悬停网格下标。 */
int m_mouseX = 0; /**< 最近一次鼠标横坐标(用于悬停提示定位)。 */
int m_mouseY = 0; /**< 最近一次鼠标纵坐标(用于悬停提示定位)。 */
int m_hoverAnchorX = 0; /**< 信号悬停提示的锚点横坐标(首次进入可拖拽区域时确定,不随鼠标移动)。 */
int m_hoverAnchorY = 0; /**< 信号悬停提示的锚点纵坐标。 */
bool m_spanHover = false; /**< 鼠标是否悬停在双光标差值标签上。 */
std::wstring m_hintText; /**< 临时提示文本(空表示不显示)。 */
std::uint64_t m_hintShownAt = 0; /**< 提示出现的时刻(毫秒,GetTickCount64)。 */