#region 导入WinAPI函数,用于平滑移动窗口
[DllImport("user32.dll",EntryPoint="SendMessage")]
public static extern int SendMessage(int hWnd,int wMsg,int wParam,int lParam);
[DllImport("user32.dll",EntryPoint="ReleaseCapture")]
public static extern int ReleaseCapture();
public const int WM_SysCommand = 0x0112;
public const int SC_MOVE = 0xF012;
#endregion
然后在Form的MouseDown事件中这样调用:
//使窗口可以平滑拖动
ReleaseCapture();
SendMessage(this.Handle.ToInt32(),WM_SysCommand,SC_MOVE,0);

解决方案 »

  1.   

    还可以使用mousedown,mousemove和mouseup共同协作来实现。mousedown时获得当前的点,mousemove时,获得移动时的路径,mouseup时获得最后的点,计算一下初始点和结束点之间的距离就可以了,再把窗体的location设为结束点,就万事OK.
      

  2.   

    to : mobydick(敌伯威) 
    呵呵,老兄我是想在移动的过程中有一个方框出现啊。
      

  3.   

    to : sharpdew(如水随风) 
    如果是控件那又怎么办呢?所以我还想知道其他方法。
      

  4.   

    分别定义窗体的mousedown,mouseup,mousemove事件,具体是如下,
    我已经运行过,完全可以 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    int xOffset;
    int yOffset; if (e.Button == MouseButtons.Left) 
    {
    //注意e.X,e.Y的坐标是相对于窗口左上角而言的
    xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
    yOffset = -e.Y - SystemInformation.FrameBorderSize.Height;
    mouseOffset = new Point(xOffset, yOffset);
    isMouseDown = true;
    }
    } private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    Point mousePos;
    if (isMouseDown) 
    {
    //MousePosition包含鼠标光标相对于屏幕左上角的坐标
    mousePos = Control.MousePosition;
    //注意到鼠标在拖动时相对于窗口坐标不变
    mousePos.Offset(mouseOffset.X, mouseOffset.Y);
    //Location表示控件的左上角相对于其容器的左上角,
    //如果 Control 是 Form,那么 Location 属性值表示 Form 的左上角(以屏幕坐标表示)。
    Location = mousePos; 

    }
    } private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    // 修改鼠标状态isMouseDown的值
    // 确保只有鼠标左键按下并移动时,才移动窗体
    if (e.Button == MouseButtons.Left) 
    {
    isMouseDown = false;
    }
    }                                                   wish u good luck
                                                             Greatsft
      

  5.   

    to  greatsft(C的使者) :
    谢谢你的代码,但是这样的效果是没有出现一个框的,就是看不到移动后的效果,不过还是非常感谢。
    不知道有没有办法做到呢?
      

  6.   

    你是说要做成象有边框一样吗?
    这样的话你只有用某些做图软件比如photoshop单独做一个边框的背景图片,
    然后把你的窗体的背景图片设置为这个图片即可!
    很方便的                                                   wish u good luck
                                                           Greatsft