【问题标题】:Mousemove Custom Scroll Bar mathsMousemove 自定义滚动条数学
【发布时间】:2018-04-18 16:43:32
【问题描述】:

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

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

我有以下代码来休息拇指的中间位置:

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);
}

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

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

【问题讨论】:

    标签: c# scrollbar mousemove


    【解决方案1】:

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

    伪代码:

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

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多