2017-09-06 53 views
0

我正在使用户控件充当TrackBar。我有一个ToolboxCustomTrackbar1,它有一个MinMax以及一个SelectedMin,可以通过在区域中拖动MinPanel来改变。C#自定义TrackBar缓冲区

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然后用下面的代码绘制:

MinPanel基于SelectedMin,这是用下面的代码改变绘制

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在其任一侧使用缓冲区?

+0

您可以尝试将ClientRectangle设置为trackbarArea,不确定是否。否则,你可以尝试从零开始重新创建Trackbar-Control, 就像我在这里所做的那样:https://github.com/glm9637/MaterialWinforms/blob/master/MaterialWinforms/Controls/MaterialSlider.cs – glm9637

+0

哈哈我不熟悉或经验丰富足以做到这一点,但谢谢你。 – Tawm

回答

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的合适值是什么为了留出空间来绘制​​的后半部分。

我试图做一些PanelWidth * (Max - Min)/Width或某种变化,但我不明白。