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