• [转]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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    PHP __get和__set的理解
    PHP new self()和new static()的区别探究
    PHP 配置默认SSL CA证书
    PHP Trait超类总结
    PHP abstract 抽象类定义与用法示例
    php implements的作用和总结
    PHP性能优化利器:生成器 yield理解
    PHP 生成不重复唯一标识 session_create_id()
    【SpringBoot】SpringBoot源码编译
    【Redis】分布式锁之Redis实现
  • 原文地址:https://www.cnblogs.com/yelaiju/p/1862089.html
Copyright © 2020-2023  润新知