[转]C# WinForm 控件的拖动和缩放技术全解

代码

//很简单的,主要是设计控件的MouseDown、MouseLeave、MouseMove事件。:

//1、定义一个枚举类型,描述光标状态

private enum EnumMousePointPosition

{

    MouseSizeNone = 0, //'

    MouseSizeRight = 1, //'拉伸右边框

    MouseSizeLeft = 2, //'拉伸左边框

    MouseSizeBottom = 3, //'拉伸下边框

    MouseSizeTop = 4, //'拉伸上边框

    MouseSizeTopLeft = 5, //'拉伸左上角

    MouseSizeTopRight = 6, //'拉伸右上角

    MouseSizeBottomLeft = 7, //'拉伸左下角

    MouseSizeBottomRight = 8, //'拉伸右下角

    MouseDrag = 9   // '鼠标拖动

}

//2、定义几个变量

const int Band = 5;

const int MinWidth = 10;

const int MinHeight = 10;

private EnumMousePointPosition m_MousePointPosition;

private Point p, p1;

//3、定义自己的MyMouseDown事件

private void MyMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

    p.X = e.X;

    p.Y = e.Y;

    p1.X = e.X;

    p1.Y = e.Y;

}

//4、定义自己的MyMouseLeave事件

private void MyMouseLeave(object sender, System.EventArgs e)

{

    m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;

    this.Cursor = Cursors.Arrow;

}

//5、设计一个函数,确定光标在控件不同位置的样式

private EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e)

{

    if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))

    {

        if (e.X < Band)

        {

            if (e.Y < Band) { return EnumMousePointPosition.MouseSizeTopLeft; }

            else

            {

                if (e.Y > -1 * Band + size.Height)

                { return EnumMousePointPosition.MouseSizeBottomLeft; }

                else

                { return EnumMousePointPosition.MouseSizeLeft; }

            }

        }

        else

        {

            if (e.X > -1 * Band + size.Width)

            {

                if (e.Y < Band)

                { return EnumMousePointPosition.MouseSizeTopRight; }

                else

                {

                    if (e.Y > -1 * Band + size.Height)

                    { return EnumMousePointPosition.MouseSizeBottomRight; }

                    else

                    { return EnumMousePointPosition.MouseSizeRight; }

                }

            }

            else

            {

                if (e.Y < Band)

                { return EnumMousePointPosition.MouseSizeTop; }

                else

                {

                    if (e.Y > -1 * Band + size.Height)

                    { return EnumMousePointPosition.MouseSizeBottom; }

                    else

                    { return EnumMousePointPosition.MouseDrag; }

                }

            }

        }

    }

    else

    { return EnumMousePointPosition.MouseSizeNone; }

}

//6、定义自己的MyMouseMove事件,在这个事件里,会使用上面设计的函数

private void MyMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

{

    Control lCtrl = (sender as Control);

    if (e.Button == MouseButtons.Left)

    {

        switch (m_MousePointPosition)

        {

            case EnumMousePointPosition.MouseDrag:

                lCtrl.Left = lCtrl.Left + e.X - p.X;

                lCtrl.Top = lCtrl.Top + e.Y - p.Y;

                break;

            case EnumMousePointPosition.MouseSizeBottom:

                lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

                p1.X = e.X;

                p1.Y = e.Y; //'记录光标拖动的当前点

                break;

            case EnumMousePointPosition.MouseSizeBottomRight:

                lCtrl.Width = lCtrl.Width + e.X - p1.X;

                lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

                p1.X = e.X;

                p1.Y = e.Y; //'记录光标拖动的当前点

                break;

            case EnumMousePointPosition.MouseSizeRight:

                lCtrl.Width = lCtrl.Width + e.X - p1.X;

                //       lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

                p1.X = e.X;

                p1.Y = e.Y; //'记录光标拖动的当前点

                break;

            case EnumMousePointPosition.MouseSizeTop:

                lCtrl.Top = lCtrl.Top + (e.Y - p.Y);

                lCtrl.Height = lCtrl.Height - (e.Y - p.Y);

                break;

            case EnumMousePointPosition.MouseSizeLeft:

                lCtrl.Left = lCtrl.Left + e.X - p.X;

                lCtrl.Width = lCtrl.Width - (e.X - p.X);

                break;

            case EnumMousePointPosition.MouseSizeBottomLeft:

                lCtrl.Left = lCtrl.Left + e.X - p.X;

                lCtrl.Width = lCtrl.Width - (e.X - p.X);

                lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

                p1.X = e.X;

                p1.Y = e.Y; //'记录光标拖动的当前点

                break;

            case EnumMousePointPosition.MouseSizeTopRight:

                lCtrl.Top = lCtrl.Top + (e.Y - p.Y);

                lCtrl.Width = lCtrl.Width + (e.X - p1.X);

                lCtrl.Height = lCtrl.Height - (e.Y - p.Y);

                p1.X = e.X;

                p1.Y = e.Y; //'记录光标拖动的当前点

                break;

            case EnumMousePointPosition.MouseSizeTopLeft:

                lCtrl.Left = lCtrl.Left + e.X - p.X;

                lCtrl.Top = lCtrl.Top + (e.Y - p.Y);

                lCtrl.Width = lCtrl.Width - (e.X - p.X);

                lCtrl.Height = lCtrl.Height - (e.Y - p.Y);

                break;

            default:

                break;

        }

        if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth;

        if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight;

    }

    else

    {

        m_MousePointPosition = MousePointPosition(lCtrl.Size, e);   //'判断光标的位置状态

        switch (m_MousePointPosition)   //'改变光标

        {

            case EnumMousePointPosition.MouseSizeNone:

                this.Cursor = Cursors.Arrow;        //'箭头

                break;

            case EnumMousePointPosition.MouseDrag:

                this.Cursor = Cursors.SizeAll;      //'四方向

                break;

            case EnumMousePointPosition.MouseSizeBottom:

                this.Cursor = Cursors.SizeNS;       //'南北

                break;

            case EnumMousePointPosition.MouseSizeTop:

                this.Cursor = Cursors.SizeNS;       //'南北

                break;

            case EnumMousePointPosition.MouseSizeLeft:

                this.Cursor = Cursors.SizeWE;       //'东西

                break;

            case EnumMousePointPosition.MouseSizeRight:

                this.Cursor = Cursors.SizeWE;       //'东西

                break;

            case EnumMousePointPosition.MouseSizeBottomLeft:

                this.Cursor = Cursors.SizeNESW;     //'东北到南西

                break;

            case EnumMousePointPosition.MouseSizeBottomRight:

                this.Cursor = Cursors.SizeNWSE;     //'东南到西北

                break;

            case EnumMousePointPosition.MouseSizeTopLeft:

                this.Cursor = Cursors.SizeNWSE;     //'东南到西北

                break;

            case EnumMousePointPosition.MouseSizeTopRight:

                this.Cursor = Cursors.SizeNESW;     //'东北到南西

                break;

            default:

                break;

        }

    }

}

//7、制作一个初始化过程,将界面panel1上的所有控件都绑定MyMouseDown、MyMouseLeave、MyMouseMove事件,记得在Form初始化或者Form_Load时先执行它。

private void initProperty()

{

    for (int i = 0; i < this.panel1.Controls.Count; i++)

    {

        this.panel1.Controls[i].MouseDown += new System.Windows.Forms.MouseEventHandler(MyMouseDown);

        this.panel1.Controls[i].MouseLeave += new System.EventHandler(MyMouseLeave);

        this.panel1.Controls[i].MouseMove += new System.Windows.Forms.MouseEventHandler(MyMouseMove);

    }

}

//8、ok,在运行之前你在panel1上放几个控件,执行程序,应该可以随便移动、改变其大小了

}

作者: 火地晋
出处: http://yelaiju.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/yelaiju/p/1862089.html