我正在制作用户控件以充当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
的左边缘视为最小点,将右边缘视为最大点。
如何让我的TrackBar在其两侧使用缓冲区?
答案 0 :(得分:0)
我创建了一个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
的适当值是什么,以留出空间来绘制{的后半部分{ {1}}。
我试图做某种Panels
或某些变种,但我无法得到它。