我正在使用户控件充当TrackBar。我有一个ToolboxCustomTrackbar1
,它有一个Min
和Max
以及一个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在其任一侧使用缓冲区?
您可以尝试将ClientRectangle设置为trackbarArea,不确定是否。否则,你可以尝试从零开始重新创建Trackbar-Control, 就像我在这里所做的那样:https://github.com/glm9637/MaterialWinforms/blob/master/MaterialWinforms/Controls/MaterialSlider.cs – glm9637
哈哈我不熟悉或经验丰富足以做到这一点,但谢谢你。 – Tawm