public int NearestValueFromPoint(Point pt)
{
// Grab range and current position from the bar
int min = _drawTrackBar.Minimum;
int max = _drawTrackBar.Maximum;
int range = Math.Abs(max - min);
// If min and max are the same, we are done!
if (range == 0)
return min;
Rectangle trackRect = TrackArea;
if (_drawTrackBar.Orientation == Orientation.Horizontal)
{
if (_drawTrackBar.RightToLeft == RightToLeft.Yes)
{
// Limit check the position
if (pt.X <= trackRect.X)
return max;
else if (pt.X >= (trackRect.Right - 1))
return min;
else
{
float offset = trackRect.Right - pt.X;
float x = offset / trackRect.Width;
float y = min + x * range;
int ret = (int)Math.Round(y, 0, MidpointRounding.AwayFromZero);
return ret;
}
}
else
{
// Limit check the position
if (pt.X <= trackRect.X)
return min;
else if (pt.X >= (trackRect.Right - 1))
return max;
else
{
float offset = pt.X - trackRect.X;
float x = offset / trackRect.Width;
float y = min + x * range;
int ret = (int)Math.Round(y, 0, MidpointRounding.AwayFromZero);
return ret;
}
}
}
else
{
// Limit check the position
if (pt.Y <= trackRect.Y)
return max;
else if (pt.Y >= (trackRect.Bottom - 1))
return min;
{
float offset = trackRect.Bottom - pt.Y;
float x = offset / trackRect.Height;
float y = min + x * range;
int ret = (int)Math.Round(y, 0, MidpointRounding.AwayFromZero);
return ret;
}
}
}