I'm not sure how you're doing it now, but basically set a flag in the MouseDownm event handler (or better, override OnMouseDown, which also is better for the other events I'll mention - just don't forget to call base.On_EventName_). In the MouseMove handler move your form only if the flag is set. Finally, in the MouseUp handler reset the flag. While moving the form, you have a couple of choices. You can simply set the Location property but that is what is most likely causing your lag (and related problems). There's quite a bit that happens in the implementation for setting the Location property. In the MouseDown handler, it might be better to call SuspendLayout and then call ResumeLayout in the MouseUp handler. I haven't tried this so I don't know how well this will work, and it may not even display the form while dragging. You might instead consider P/Invoking the SetWindowPos API, which you can find more information about in the Platform SDK documentation in the MSDN Library[^]. This should result in much faster code and should eliminate that lag you're experiencing.
Microsoft MVP, Visual C# My Articles