C#自定义TrackBar缓冲区

时间:2017-09-06 01:04:56

标签: c# winforms user-controls trackbar

我正在制作用户控件以充当TrackBar。我有一个ToolboxCustomTrackbar1,其中包含MinMax以及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的左边缘视为最小点,将右边缘视为最大点。

如何让我的TrackBar在其两侧使用缓冲区?

1 个答案:

答案 0 :(得分:0)

我创建了一个ShiftOffset变量,我主要使用它来抵消MinMax

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的适当值是什么,以留出空间来绘制{的后半部分{ {1}}。

我试图做某种Panels或某些变种,但我无法得到它。