您的位置:首页 > 编程语言 > C#

c# WinForm实现窗体上控件的自由拖动

2013-07-11 20:07 471 查看
说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WinFormDrag

{

    public partial class Form1 : Form

    {

        //鼠标按下坐标(control控件的相对坐标)

        Point mouseDownPoint = Point.Empty;

        //显示拖动效果的矩形

        Rectangle rect = Rectangle.Empty;

        //是否正在拖拽

        bool isDrag = false;

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Paint(object sender, PaintEventArgs e)

        {

            if (rect != Rectangle.Empty)

            {

                if (isDrag)

                {//画一个和Control一样大小的黑框

                    e.Graphics.DrawRectangle(Pens.Black, rect);

                }

                else

                {

                    e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);

                }

            }

        }

        /// <summary>

        /// 按下鼠标时

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void pb1_MouseDown(object sender, MouseEventArgs e)

        {

            if (e.Button == MouseButtons.Left)

            {

                mouseDownPoint = e.Location;

                //记录控件的大小

                rect = pb1.Bounds;

            }

        }

        /// <summary>

        /// 移过时

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void pb1_MouseMove(object sender, MouseEventArgs e)

        {

            if (e.Button == MouseButtons.Left)

            {

                isDrag = true;

                //重新设置rect的位置,跟随鼠标移动

                rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y));

                this.Refresh();

            }

        }

        /// <summary>

        /// 释放鼠标按钮时

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void pb1_MouseUp(object sender, MouseEventArgs e)

        {

            if (e.Button == MouseButtons.Left)

            {

                if (isDrag)

                {

                    isDrag = false;

                    //移动control到放开鼠标的地方

                    pb1.Location = rect.Location;

                    this.Refresh();

                }

                reset();

            }

        }

        //重置变量

        private void reset()

        {

            mouseDownPoint = Point.Empty;

            rect = Rectangle.Empty;

            isDrag = false;

        }

        //把相对与control控件的坐标,转换成相对于窗体的坐标。

        private Point getPointToForm(Point p)

        {

            return this.PointToClient(pb1.PointToScreen(p));

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: