代码改变世界

windows form控件拖动和缩放

2012-11-18 01:11  yezhi  阅读(443)  评论(0编辑  收藏  举报
class ControlMover
    {
        #region
        public enum Direction
        {
            Any,
            Horizontal,
            Vertical
        }

        public static void Init(Control control)
        {
            Init(control, Direction.Any);
        }

        public static void Init(Control control, Direction direction)
        {
            Init(control, control, direction);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="control"></param>
        /// <param name="container">基准的容器</param>
        /// <param name="direction"></param>
        public static void Init(Control control, Control container, Direction direction)
        {
            Control parentCtr = control.Parent;//父控件
            bool Dragging = false;//拖动
            Point DragStart = Point.Empty;//拖动起点坐标
            control.MouseDown += delegate(object sender, MouseEventArgs e)
            {
                if (parentCtr != null)
                {
                    foreach (Control item in parentCtr.Controls)
                    {
                        item.BackColor = Color.Empty;
                    }
                }
                Dragging = true;
                DragStart = new Point(e.X, e.Y);
                control.Capture = true;
                control.BackColor = Color.Yellow;
                control.BringToFront();
            };
            control.MouseUp += delegate(object sender, MouseEventArgs e)
            {
                Dragging = false;
                control.Capture = false;
            };
            control.MouseMove += delegate(object sender, MouseEventArgs e)
            {
                if (Dragging)
                {
                    control.Cursor = Cursors.SizeAll;   
                    if (direction != Direction.Vertical)
                    {
                        int left = e.X + container.Left - DragStart.X;
                        //右边界处理
                        if (parentCtr != null)
                        {
                            if (left > parentCtr.Width - container.Width)
                            {
                                left = parentCtr.Width - container.Width;
                            }
                        }
                        container.Left = Math.Max(0, left);
                        
                    }

                    if (direction != Direction.Horizontal)
                    {
                        int top = e.Y + container.Top - DragStart.Y;
                        //下边界处理
                        if (parentCtr != null)
                        {
                            if (top > parentCtr.Height - container.Height)
                            {
                                top = parentCtr.Height - container.Height;
                            }
                        }
                        container.Top = Math.Max(0, top);
                    }
                }
            };
        }
        #endregion

        #region
        //**********************************************
     以下是网上找的
      ***************************//
        const int Band = 5;
        const int MinWidth = 10;
        const int MinHeight = 10;
        private static EnumMousePointPosition m_MousePointPosition;
        private static Point p, p1;
        private enum EnumMousePointPosition
        {
            MouseSizeNone = 0, //'无  
            MouseSizeRight = 1, //'拉伸右边框  
            MouseSizeLeft = 2, //'拉伸左边框  
            MouseSizeBottom = 3, //'拉伸下边框  
            MouseSizeTop = 4, //'拉伸上边框  
            MouseSizeTopLeft = 5, //'拉伸左上角  
            MouseSizeTopRight = 6, //'拉伸右上角  
            MouseSizeBottomLeft = 7, //'拉伸左下角  
            MouseSizeBottomRight = 8, //'拉伸右下角  
            MouseDrag = 9   // '鼠标拖动  
        } 
        private static 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; }
        }
        public static void Init2(Control control)
        {
            control.MouseDown += delegate(object sender, MouseEventArgs e)
            {
                p.X = e.X;
                p.Y = e.Y;
                p1.X = e.X;
                p1.Y = e.Y;     
            };
            control.MouseMove += delegate(object sender, 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:
                            control.Cursor = Cursors.Arrow;        //'箭头  
                            break;
                        case EnumMousePointPosition.MouseDrag:
                            control.Cursor = Cursors.SizeAll;      //'四方向  
                            break;
                        case EnumMousePointPosition.MouseSizeBottom:
                            control.Cursor = Cursors.SizeNS;       //'南北  
                            break;
                        case EnumMousePointPosition.MouseSizeTop:
                            control.Cursor = Cursors.SizeNS;       //'南北  
                            break;
                        case EnumMousePointPosition.MouseSizeLeft:
                            control.Cursor = Cursors.SizeWE;       //'东西  
                            break;
                        case EnumMousePointPosition.MouseSizeRight:
                            control.Cursor = Cursors.SizeWE;       //'东西  
                            break;
                        case EnumMousePointPosition.MouseSizeBottomLeft:
                            control.Cursor = Cursors.SizeNESW;     //'东北到南西  
                            break;
                        case EnumMousePointPosition.MouseSizeBottomRight:
                            control.Cursor = Cursors.SizeNWSE;     //'东南到西北  
                            break;
                        case EnumMousePointPosition.MouseSizeTopLeft:
                            control.Cursor = Cursors.SizeNWSE;     //'东南到西北  
                            break;
                        case EnumMousePointPosition.MouseSizeTopRight:
                            control.Cursor = Cursors.SizeNESW;     //'东北到南西  
                            break;
                        default:
                            break;
                    }
                }

            };

            control.Leave += delegate(object sender, EventArgs e)
            {
                m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;
                control.Cursor = Cursors.Arrow;
            };
        }

        //****************************************************************************//
        private static void SetCursor(Control ctr, EnumMousePointPosition mousePosition)
        {
            switch (mousePosition)   //'改变光标  
            {
                case EnumMousePointPosition.MouseSizeNone:
                    ctr.Cursor = Cursors.Arrow;        //'箭头  
                    break;
                case EnumMousePointPosition.MouseDrag:
                    ctr.Cursor = Cursors.SizeAll;      //'四方向  
                    break;
                case EnumMousePointPosition.MouseSizeBottom:
                    ctr.Cursor = Cursors.SizeNS;       //'南北  
                    break;
                case EnumMousePointPosition.MouseSizeTop:
                    ctr.Cursor = Cursors.SizeNS;       //'南北  
                    break;
                case EnumMousePointPosition.MouseSizeLeft:
                    ctr.Cursor = Cursors.SizeWE;       //'东西  
                    break;
                case EnumMousePointPosition.MouseSizeRight:
                    ctr.Cursor = Cursors.SizeWE;       //'东西  
                    break;
                case EnumMousePointPosition.MouseSizeBottomLeft:
                    ctr.Cursor = Cursors.SizeNESW;     //'东北到南西  
                    break;
                case EnumMousePointPosition.MouseSizeBottomRight:
                    ctr.Cursor = Cursors.SizeNWSE;     //'东南到西北  
                    break;
                case EnumMousePointPosition.MouseSizeTopLeft:
                    ctr.Cursor = Cursors.SizeNWSE;     //'东南到西北  
                    break;
                case EnumMousePointPosition.MouseSizeTopRight:
                    ctr.Cursor = Cursors.SizeNESW;     //'东北到南西  
                    break;
                default:
                    ctr.Cursor = Cursors.Arrow;
                    break;
            }
        }

        private static void SetDrag(Control ctr, MouseEventArgs e, Point dragStart)
        {
            switch (m_MousePointPosition)
            {
                case EnumMousePointPosition.MouseDrag:
                    break;
                case EnumMousePointPosition.MouseSizeBottom:
                    break;
                case EnumMousePointPosition.MouseSizeBottomRight:
                    break;
                case EnumMousePointPosition.MouseSizeRight:
                    ctr.Width = e.X + ctr.Width;
                    break;
                case EnumMousePointPosition.MouseSizeTop:
                    break;
                case EnumMousePointPosition.MouseSizeLeft:
                    break;
                case EnumMousePointPosition.MouseSizeBottomLeft:
                    break;
                case EnumMousePointPosition.MouseSizeTopRight:
                    break;
                case EnumMousePointPosition.MouseSizeTopLeft:
                    break;
                default:
                    break;
            }
        }
        //****************************************************************************//
        #endregion
    }