You need to combine a custom cursor like isipro recommended with the tutorial here http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop(v=vs.110).aspx
It's a bit more work than you'd probably like, but it's also a reasonably complicated problem.
EDIT:
Here's some code that does what you ask for. It could be engineered better, but it gets the point across:
class Dragger
{
private readonly Form _parent;
private Panel _dragee;
public Dragger(Form parent)
{
_parent = parent;
}
public void MouseMoved(object sender, MouseEventArgs e)
{
if (_dragee != null)
{
_dragee.Location = _parent.PointToClient(Cursor.Position);
}
}
public void StartDragging(Panel panel)
{
_dragee = panel;
}
public void StopDragging()
{
_dragee = null;
}
}
public partial class Form1 : Form
{
private readonly Dragger _dragger;
public Form1()
{
InitializeComponent();
_dragger = new Dragger(this);
panel1.MouseMove += _dragger.MouseMoved;
panel1.MouseDown += panel1_MouseDown;
panel1.MouseUp += panel1_MouseUp;
}
void panel1_MouseUp(object sender, MouseEventArgs e)
{
_dragger.StopDragging();
}
void panel1_MouseDown(object sender, MouseEventArgs e)
{
_dragger.StartDragging((Panel)sender);
}
}
Important notes: if you click the panel and drag it, the object itself is the thing which starts generating mousemove events. So you have to listen to them, not to the form itself. You'll also need to make sure that the dragged control is in front.
Good luck - and really, the custom cursor is the way to go :)