Mousemove 自定义滚动条数学

Mousemove Custom Scroll Bar maths

我目前正在构建一个自定义滚动条(如上图所示)我可以将滚动条值设置为允许范围内的任何数字(最小值和最大值之间),但是当涉及到鼠标滚动时我有一个数学问题。

我想让鼠标停留在用户在拇指条中点击的相同位置,然后向上或向下拖动拇指,使滚动条的中间位置反映值。

我有以下代码来固定拇指的中间位置:

MoveThumb() 
{
    m_iMidPoint = Mouse.Cursor.Y;
    int iHalfThumb = ThumbLength / 2;
    m_iMidPoint += iHalfThumb;

    // Clamp to allowable range
    m_iMidPoint = m_iMidPoint < (TrenchStartPixel + iHalfThumb) 
        ? TrenchStartPixel + iHalfThumb 
        : m_iMidPoint;

    m_iMidPoint = m_iMidPoint > (TrenchEndPixel - iHalfThumb) 
        ? TrenchEndPixel - iHalfThumb 
        : m_iMidPoint;

    Value = MidThumbToValue(m_iMidPoint);           // This property gets clamped
}

public int ConvertRange( int originalStart, int originalEnd, int newStart, 
    int newEnd, int value) 
{
    double scale = (double)(newEnd - newStart) / (originalEnd - originalStart);
    return (int)(newStart + ((value - originalStart) * scale));
}

public int ValueToMidThumb(int iValue) 
{
    return ConvertRange(Minimum, Maximum, TrenchStartPixel + (ThumbLength/2), 
        TrenchEndPixel - (ThumbLength/2), iValue);
}

public int MidThumbToValue(int iValue) 
{
    return ConvertRange(TrenchStartPixel + (ThumbLength /2), 
        TrenchEndPixel - (ThumbLength /2), Minimum, Maximum, iValue);
}

这段代码工作正常,除此之外,Thumb 总是跳跃,以便拇指的中间跟踪鼠标。

如何让拇指在不跳跃的情况下跟踪鼠标位置?

我遗漏的部分是用户按下鼠标按钮开始拖动拇指的事实。此时,可以在拖动拇指时计算和使用拇指中间位置的偏移量。此偏移量将保持不变,直到用户释放鼠标。事实上它在整个事件序列中保持不变,它可以在鼠标移动期间使用。

伪代码:

MouseDownEvent(MouseEventArgs e) {
   m_mouseOffset = e.Y  - Thumb.Top + (ThumbLength / 2);
}

MouseMoveEvent(MouseEventArgs e) {
  int iPos = e.Y;
  iPos -= m_mouseOffset;
  m_iMidPoint= iPos;
}