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;
}
我目前正在构建一个自定义滚动条(如上图所示)我可以将滚动条值设置为允许范围内的任何数字(最小值和最大值之间),但是当涉及到鼠标滚动时我有一个数学问题。
我想让鼠标停留在用户在拇指条中点击的相同位置,然后向上或向下拖动拇指,使滚动条的中间位置反映值。
我有以下代码来固定拇指的中间位置:
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;
}