Я делаю пользовательский элемент управления, чтобы он действовал как трекбар. У меня есть ToolboxCustomTrackbar1
, у которого есть Min
и Max
, а также SelectedMin
, который может быть изменен пользователем, перетаскивающим MinPanel
в области.
MinPanel
рисуется на основе SelectedMin
, который изменяется с помощью следующего кода:
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if(e.Button == MouseButtons.Left)
{
UpdateSelectedMinFromMouse(e.X);
}
}
private void UpdateSelectedMinFromMouse(float x)
{
var percentage = x * 100 / Width;
var range = Max - Min;
var rawValue = percentage * range / 100;
var value = rawValue + Min;
SelectedMin = (int)Math.Round(value);
}
Затем MinPanel
рисуется с помощью следующего кода:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawRectangle(Pens.Black, 0, 0, Width - 1, Height - 1);
minPanel.Location = new Point((int)GetPosition(ref selectedMin), 0);
minPanel.Size = new Size(PanelWidth, Height/2);
minPanel.BackColor = Color.Red;
trackbarArea = new Rectangle(Buffer, 0, Width - Buffer * 2, Height);
e.Graphics.FillRectangle(Brushes.LightBlue, trackbarArea);
}
private float GetPosition(ref int input)
{
var range = Max - Min;
var value = input - Min;
var percentage = (float)value * 100 / range;
var position = percentage * Width / 100;
Console.WriteLine(position);
return position - (float)minPanel.Width / 2;
}
Все это прекрасно работает и рисует MinPanel
везде, где я нажимаю и перетаскиваю элемент управления. Однако я хочу оставить буферную область слева и справа от элемента управления, чтобы отрисовывать весь MinPanel
, даже если он находится на левом и правом краях элемента управления.
В настоящее время я пытаюсь сделать это с помощью:
Rectangle trackbarArea = new Rectangle(Buffer, 0, Width - Buffer * 2, Height);
И это создает область, которую я действительно хочу считать диапазоном для моего TrackBar
.
Однако я не могу понять, как заставить мой элемент управления обрабатывать левый край trackbarArea
как минимальное пятно, а правый край - как максимальное пятно.
Как разрешить моему трекбару работать с буфером по обе стороны от него?