zoukankan      html  css  js  c++  java
  • [转]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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    mongodb 初学 意外 连接服务器异常(Connection refused)
    mongodb 关闭服务器
    Redis 入门指令
    mongodb 在 Ubuntu系统上的安装及卸载
    Java 使用 Redis
    随笔 -- IO -- Socket/ServerSocket -- 系统概述
    java enum(枚举)使用详解 + 总结
    Java -- IO -- 目录
    Java 流(Stream)、文件(File)和IO -- Java ByteArrayInputStream类
    INSERT INTO .. ON DUPLICATE KEY UPDATE ...
  • 原文地址:https://www.cnblogs.com/yelaiju/p/1862089.html
Copyright © 2011-2022 走看看