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

说明:首先在窗体上放一个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));
        }
    }
}

posted @ 2011-05-23 17:12  liancs  阅读(1124)  评论(1编辑  收藏  举报