C# Пользовательская область буфера TrackBar

Я делаю пользовательский элемент управления, чтобы он действовал как трекбар. У меня есть 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 как минимальное пятно, а правый край - как максимальное пятно.

Как разрешить моему трекбару работать с буфером по обе стороны от него?


person Tawm    schedule 06.09.2017    source источник
comment
Вы можете попробовать установить ClientRectangle в свою trackbarArea, но не уверены. В противном случае вы можете попробовать воссоздать Trackbar-Control с нуля, как я сделал здесь:github.com/glm9637/MaterialWinforms/blob/master/   -  person glm9637    schedule 07.09.2017
comment
Ха-ха, я недостаточно знаком или опытен, чтобы сделать это, спасибо.   -  person Tawm    schedule 07.09.2017


Ответы (1)


Я создал переменную ShiftOffset, которую я по существу использую для смещения как Min, так и Max:

private int ShiftOffset
{
    get { return shiftOffset; }
    set { shiftOffset = value; }
}
private int Min
{
    get { return min - ShiftOffset; }
    set { min = value; }
}
private int Max
{
    get { return max + ShiftOffset; }
    set { max = value; }
}

Затем каждый раз, когда я устанавливаю значение, я ValidateValue() использую:

private void ValidateValue(ref int value)
{
    if (value < Min + ShiftOffset) value = Min + ShiftOffset;
    if (value > Max - ShiftOffset) value = Max - ShiftOffset;
}

В моей инициализации User Control я установил ShiftOffset = NormalizeSize(PanelWidth * 100);, но мне еще предстоит выяснить, какое подходящее значение для ShiftOffset, чтобы оставить место для рисования последней половины Panels.

Я пытаюсь сделать что-то вроде PanelWidth * (Max - Min) / Width или какой-то вариации, но у меня не получается.

person Tawm    schedule 08.09.2017