C# | Winform编程控件之数字输入框控件(numericUpDown)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/e295166319/article/details/80916980

数字输入框控件是用于输入数字和调节数字的一个控件,该控件中的数字储存为decimal类型,但是数字必须是整数而不能是小数。

控件在工具箱中的样式如下:


控件拖拽到窗口后的样式如下:


常用属性:

Value属性:控制数字输入框的数字的值(可用控件的向上或者向下符号对数字进行调节也可以自己输入)。

Maxmum属性:控制数字输入框的最大值(当输入的值大于最大值或者调节到大于最大值数字输入框则显示的是最大值,超过最大值也只显示最大值)。

Minimum属性:控制数字输入框的最小值(可以为负数)。

Increment属性:控制点击一次向上或者向下小按钮数字输入框值的增减大小。

UpDownAlign属性:控制数字调节小按钮是在控件的左边还是右边,有两个值:Left和Right。

对应的属性如下:



实现按住不放和按住拖拽增减数值的功能:

代码如下:(可自行提取里面有用的部分)

需要用到的参数定义如下:

        bool isMouseDown_PosX = false;  //鼠标是否按下
        float posX_X = 0;
        float posX_Y = 0;
        float posX_lastValue = 0;
相关的事件响应函数如下:
         //键盘按下时调用
        private void numericUpDown_posX_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)  //回车键
            {
                ChangeWorldCoordinate();
            }
        }

        //鼠标按下时调用
        private void numericUpDown_posX_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.X > numericUpDown_posX.Size.Width - 15)
            {
                if (e.Button == MouseButtons.Right) //鼠标右键
                {
                    ChangeWorldCoordinate(true);
                    return;
                }

                if (e.Button == MouseButtons.Left) //鼠标左键
                {
                    if (ModifierKeys == Keys.Shift) //按住Shift键时,点击鼠标左键
                    {
                        MessageBox.Show("Mouse And Key!");
                    }
                    isMouseDown_PosX = true;
                    posX_X = e.X;
                    posX_Y = e.Y;
                    ChangeWorldCoordinate();
                }
            }
        }

        //鼠标抬起时调用
        private void numericUpDown_posX_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseDown_PosX = false;
        }

        //鼠标按下移动时调用
        private void numericUpDown_posX_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown_PosX)
            {
                float deltaX = e.X - posX_X;
                float deltaY = posX_Y - e.Y;
                float delta = 0;
                if (deltaX==0 && deltaY==0)
                {
                    return;
                }

                //右、上方向
                if (deltaX>0 || deltaY>0)
                {
                    delta = (deltaX >= deltaY) ? deltaX : deltaY;
                    if (delta > 0.5)
                    {
                        delta = 0.5f;
                    }
                }
                //左、下方向
                if (deltaX<0 || deltaY<0)
                {
                    delta = (deltaX <= deltaY) ? deltaX : deltaY;
                    if (delta < -0.5)
                    {
                        delta = -0.5f;
                    }
                }

                numericUpDown_posX.Value += (decimal)delta;
                posX_X = e.X;
                posX_Y = e.Y;
                ChangeWorldCoordinate();
            }
        }

        //数值发生改变时调用
        private void numericUpDown_posX_ValueChanged(object sender, EventArgs e)
        {
            if (Math.Abs(numericUpDown_posX.Value - (decimal)posX_lastValue) != numericUpDown_posX.Increment)           
            {
                return;
            }
            if (isMouseDown_PosX)
            {
                posX_lastValue = (float)numericUpDown_posX.Value;
                ChangeWorldCoordinate();
            }
        }

实现按住拖拽功能思路如下:

1:设置一个标记位,在鼠标按下时设为true;

2:在鼠标按下并移动时,判断标记位的状态,如果为true,则根据鼠标前后位置的增量,增减数值;

3:在鼠标抬起时,将标记位设置为false,不再进行移动时的事件响应;

这个控件没有“  private void numericUpDown_posX_MouseMove(object sender, MouseEventArgs e)”这个时间,需要手动进行绑定,绑定方式如下:

 this.numericUpDown_posX.MouseMove += new System.Windows.Forms.MouseEventHandler(this.numericUpDown_posX_MouseMove);

猜你喜欢

转载自blog.csdn.net/e295166319/article/details/80916980