C# 创建使用其他用户控件的用户控件

C# 创建使用其他用户控件的用户控件,c#,forms,visual-studio,user-controls,C#,Forms,Visual Studio,User Controls,我有一个用户控件,在Min和Max的范围内充当一个带有SelectedMin、Value和SelectedMax的轨迹栏 现在,我想创建另一个用户控件作为上述用户控件的外壳,以便包含悬停标签以显示每个选定值的当前值 我想在一个单独的用户控件中实现这一点,因为在TrackBar用户控件中,为了给值标签腾出空间而向下移动似乎是一件痛苦的事情 这是我当前的CustomTrackBar.cs用户控件。对不起,太乱了: public partial class CustomTrackBar : UserC

我有一个用户控件,在
Min
Max
的范围内充当一个带有
SelectedMin
Value
SelectedMax
的轨迹栏

现在,我想创建另一个用户控件作为上述用户控件的外壳,以便包含悬停标签以显示每个选定值的当前值

我想在一个单独的用户控件中实现这一点,因为在TrackBar用户控件中,为了给值标签腾出空间而向下移动似乎是一件痛苦的事情

这是我当前的
CustomTrackBar.cs
用户控件。对不起,太乱了:

public partial class CustomTrackBar : UserControl
{

    #region variables
    private int min = 0;
    private int max = 1000;
    private int selectedMin = 0;
    private int selectedMax;
    private int value;

    private int sliderWidth = 2;
    #endregion

    #region accessors

    public int Min
    {
        get { return min; }
        set { min = value; Invalidate(); }
    }

    public int Max
    {
        get { return max; }
        set { max = value; Invalidate(); }
    }

    public int SelectedMin
    {
        get { return selectedMin; }
        set
        {
            selectedMin = value;
            if (AnythingChanged != null)
            {
                //SelectionChanged(this, null);
                AnythingChanged(this, null);
            }
            MinChanged = true;
            Invalidate();
        }
    }

    public int SelectedMax
    {
        get { return selectedMax; }
        set
        {
            selectedMax = value;
            if (AnythingChanged != null)
            {
                //SelectionChanged(this, null);
                AnythingChanged(this, null);
            }
            MaxChanged = true;
            Invalidate();
            MaxChanged = false;
        }
    }

    public int Value
    {
        get { return value; }
        set
        {
            this.value = value;
            if (AnythingChanged != null)
            {
                //ValueChanged(this, null);
                AnythingChanged(this, null);
            }
            ValueChanged = true;
            Invalidate();
        }
    }

    public int SliderWidth
    {
        get { return sliderWidth; }
        set
        {
            this.sliderWidth = value;
            Invalidate();
        }
    }

    public Boolean MinChanged
    {
        get; private set;
    }
    public Boolean ValueChanged
    {
        get; private set;
    }
    public Boolean MaxChanged
    {
        get; private set;
    }

    #endregion

    //Fired when SelectedMin or SelectedMax changes.
    //public event EventHandler SelectionChanged;

    //Fired when Value changes.
    //public event EventHandler ValueChanged;

    //Fired if anything changes
    public event EventHandler AnythingChanged;


    public CustomTrackBar()
    {
        //Set default values
        Value = (Max - Min) / 2;
        SelectedMax = Max;

        SliderWidth = SliderWidth / (Max - Min); //this line is horrible

        InitializeComponent();



        //Avoid flickering
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

        //Events
        Paint += new PaintEventHandler(CustomTrackBar_Paint);
        MouseDown += new MouseEventHandler(CustomTrackBar_MouseDown);
        MouseMove += new MouseEventHandler(CustomTrackBar_MouseMove);
    }

    //Create a rectangle
    void CustomTrackBar_Paint(object sender, PaintEventArgs e)
    {
        //paint background in white
        e.Graphics.FillRectangle(Brushes.White, ClientRectangle);

        //Create a rectangle object
        Rectangle selectionRect = new Rectangle(
            0,
            0,
            Width,
            Height);

        /*
        Rectangle selectionRect = new Rectangle(
        (SelectedMin - Min) * Width / (Max - Min),
        15,
        (SelectedMax - selectedMin) * Width / (Max - Min),
        Height - 30);
        */

        //paint the rectangle object
        e.Graphics.FillRectangle(Brushes.GreenYellow, selectionRect);

        //Again how does this work?
        Rectangle firstFrameRect = new Rectangle(
            (SelectedMin - SliderWidth/2) * Width / (Max - Min),
            0,
            SliderWidth * Width / (Max - Min),
            Height
            );
        e.Graphics.FillRectangle(Brushes.DarkBlue, firstFrameRect);


        Rectangle lastFrameRect = new Rectangle(
            (SelectedMax - SliderWidth/2) * Width / (Max - Min),
            0,
            SliderWidth * Width / (Max - Min),
            Height
            );

         /*
            Rectangle lastFrameRect = new Rectangle(
            SelectedMax * Width / (Max - Min),
            0,
            5 * Width / (Max - Min),
            Height
            );
         */

        e.Graphics.FillRectangle(Brushes.OrangeRed, lastFrameRect);


        //draw a black frame around our control
        e.Graphics.DrawRectangle(Pens.Black, 0, 0, Width - 1, Height - 1);

        //draw a simple vertical line at the Value position
        e.Graphics.DrawLine(Pens.Black,
            (Value - Min) * Width / (Max - Min) - 5,
            0,
            (Value - Min) * Width / (Max - Min) - 5,
            Height);
    }

    void CustomTrackBar_MouseDown(object sender, MouseEventArgs e)
    {
        //check where the user clicked so we can decide which thumb to move
        int pointedValue = Min + e.X * (Max - Min) / Width;
        int distValue = Math.Abs(pointedValue - Value);
        int distMin = Math.Abs(pointedValue - SelectedMin);
        int distMax = Math.Abs(pointedValue - SelectedMax);
        int minDist = Math.Min(distValue, Math.Min(distMin, distMax));
        if (minDist == distValue)
            movingMode = MovingMode.MovingValue; //this should only move when video plays
        else if (minDist == distMin)
            movingMode = MovingMode.MovingMin;
        else
            movingMode = MovingMode.MovingMax;
        //call this to refreh the position of the selected thumb
        CustomTrackBar_MouseMove(sender, e);
    }

    void CustomTrackBar_MouseMove(object sender, MouseEventArgs e)
    {
        //if the left button is pushed, move the selected thumb
        if (e.Button != MouseButtons.Left)
            return;
        int pointedValue = Min + e.X * (Max - Min) / Width;
        if (movingMode == MovingMode.MovingValue)
        {
            if (pointedValue <= Max && pointedValue >= Min)
                Value = pointedValue;
        }
        else if (movingMode == MovingMode.MovingMin)
        {
            if (pointedValue < SelectedMax && pointedValue >= Min)
                SelectedMin = pointedValue;
        }
        else if (movingMode == MovingMode.MovingMax)
        {
            if (pointedValue > SelectedMin && pointedValue <= Max)
                SelectedMax = pointedValue;
        }
    }


    //To know which thumb is moving
    enum MovingMode { MovingValue, MovingMin, MovingMax }
    MovingMode movingMode;

    public String AllValues()
    {
        return String.Format("{0}\t{1}\t{2}", SelectedMin, Value, SelectedMax);
    }

}
公共部分类CustomTrackBar:UserControl
{
#区域变量
私有int min=0;
私有整数最大值=1000;
private int selectedMin=0;
私有int-selectedMax;
私有int值;
私有int滑块宽度=2;
#端区
#区域存取器
公共int Min
{
获取{return min;}
设置{min=value;使无效();}
}
公共整数最大值
{
获取{return max;}
设置{max=value;Invalidate();}
}
公共int-SelectedMin
{
获取{return selectedMin;}
设置
{
selectedMin=值;
if(AnythingChanged!=null)
{
//SelectionChanged(此为空);
AnythingChanged(此为空);
}
MinChanged=true;
使无效();
}
}
公共整数选择最大值
{
获取{return selectedMax;}
设置
{
selectedMax=值;
if(AnythingChanged!=null)
{
//SelectionChanged(此为空);
AnythingChanged(此为空);
}
MaxChanged=true;
使无效();
MaxChanged=false;
}
}
公共整数值
{
获取{返回值;}
设置
{
这个值=值;
if(AnythingChanged!=null)
{
//ValueChanged(此为空);
AnythingChanged(此为空);
}
ValueChanged=true;
使无效();
}
}
公共整数滑块宽度
{
获取{return sliderWidth;}
设置
{
this.sliderWidth=值;
使无效();
}
}
公共布尔值已更改
{
获得;私人设置;
}
公共布尔值已更改
{
获得;私人设置;
}
公共布尔MaxChanged
{
获得;私人设置;
}
#端区
//当SelectedMin或SelectedMax更改时激发。
//公共事件处理程序选择已更改;
//值更改时激发。
//公共事件处理程序值已更改;
//如果有什么变化就被解雇
public event EventHandler AnythingChanged;
公共自定义轨迹栏()
{
//设置默认值
值=(最大-最小)/2;
选择最大值=最大值;
SliderWidth=SliderWidth/(Max-Min);//这行太可怕了
初始化组件();
//避免闪烁
设置样式(ControlStyles.AllPaintingInWmPaint,true);
SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
//事件
Paint+=新的PaintEventHandler(CustomTrackBar_Paint);
MouseDown+=新的MouseEventHandler(CustomTrackBar_MouseDown);
MouseMove+=新的MouseEventHandler(CustomTrackBar\u MouseMove);
}
//创建一个矩形
void CustomTrackBar_Paint(对象发送器,PaintEventArgs e)
{
//将背景漆成白色
e、 图形。填充矩形(画笔。白色,ClientRectangle);
//创建一个矩形对象
矩形选择矩形=新矩形(
0,
0,
宽度,
高度);
/*
矩形选择矩形=新矩形(
(选择最小值)*宽度/(最大值-最小值),
15,
(选择最大-选择最小)*宽度/(最大-最小),
身高(30),;
*/
//绘制矩形对象
e、 Graphics.FillRectangle(画笔.绿黄色,selectionRect);
//再说一遍,这是怎么回事?
矩形firstFrameRect=新矩形(
(选择最小-滑块宽度/2)*宽度/(最大-最小),
0,
滑块宽度*宽度/(最大-最小),
高度
);
e、 Graphics.FillRectangle(笔刷.DarkBlue,firstFrameRect);
矩形lastFrameRect=新矩形(
(选择最大-滑块宽度/2)*宽度/(最大-最小),
0,
滑块宽度*宽度/(最大-最小),
高度
);
/*
矩形lastFrameRect=新矩形(
选择最大*宽度/(最大-最小),
0,
5*宽度/(最大-最小),
高度
);
*/
e、 Graphics.FillRectangle(画笔.OrangeRed,lastFrameRect);
//在控件周围画一个黑色边框
e、 图形.绘图矩形(钢笔.黑色,0,0,宽-1,高-1);
//在值位置绘制一条简单的垂直线
e、 图形.抽绳(黑色笔),
(最小值)*宽度/(最大值-最小值)-5,
0,
(最小值)*宽度/(最大值-最小值)-5,
高度);
}
void CustomTrackBar_MouseDown(对象发送器,MouseEventArgs e)
{
//检查用户单击的位置,以便我们可以决定移动哪个拇指
int pointedValue=Min+e.X*(Max-Min)/宽度;
int distValue=Math.Abs(pointedValue-Value);
int distMin=Math.Abs(pointedValue-SelectedMin);
int distMax=Math.Abs(pointedValue-SelectedMax);
int minDist=Math.Min(distValue,Math.Min(distMin,distMax));
if(minDist==distValue)
movingMode=movingMode.MovingValue;//仅在视频播放时移动
else if(minDist==dist
public partial class CustomTrackBar : Panel
{
    private Panel backdrop;
    private Panel minBar;
    private Panel maxBar;
    private Panel currentBar;
    private Label minDisplay;
    private Label maxDisplay;
    private Label currentDisplay;

    public CustomTrackBar()
    {
        InitializeComponent(); // This should almost always be first.
        backdrop = new Panel() {
            BackColor = Color.LightGreen,
            // set position, size, etc.
        };
        // add event handlers to backdrop...
        Controls.Add(backdrop);
        // repeat for minBar, maxBar, etc.

        SizeChanged += (sender, args) => {
            Update();
        };

        // ... remaining initialization logic.
    }

    private void Update()
    {
        // adjust the position and size of each inner control...
    }
}