private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            CPoint = new Point(-e.X, -e.Y);
        }        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point myPosittion = Control.MousePosition;
                myPosittion.Offset(CPoint.X, CPoint.Y);
                this.DesktopLocation = myPosittion;
            }
        }大家请看上面的这个程序为什么CPoint = new Point(-e.X, -e.Y)中的X和Y坐标是负值呢,还有myPosittion.Offset(CPoint.X, CPoint.Y)这个方法是用来干什么的?

解决方案 »

  1.   

     L---------|
     |         | 
     |      m  | 
     |         | 
     |---------|
    假设有这么一个窗口。它的位置(Location)就是它的左上角的坐标。
    当鼠标点击m点后开始拖动,如何计算拖动后的新坐标呢?一种方法就是算出m到L的偏移量,比如例子中为向左4格,向上3格。当鼠标移动到m'后,可以期待窗口也被拖动到新的位置,新窗口的L也将是新m'的向左4格,向上3格。也就是说对m'施用相同的偏移,就可以得到新的Location。在panel1_MouseDown事件中, MouseEventArgs e的鼠标位置是相对于窗口的,即窗口的左上角为(0,0)。
    这时,偏移量很容易得到,既(-e.X, -e.Y)。
      

  2.   

    取赋值肯定有取负值的道理,至于Offset是干嘛的,楼主可以转到定义看下代码就知道了
      

  3.   

    嗯,从m点移到L点这个偏移量好理解但是如果从m点不是移到L点而是其他的点偏移量就不是用L的坐标减去m的坐标了吧。而且为什么MouseEventArgs e这个事件中的偏移量是不变的呢?
      

  4.   

    呵呵,道理肯定是有的,但是不理解的话就不懂用啊。.net里类库是被封装起来的吧,貌似是看不到源码的。
      

  5.   

    myPosittion.Offset(CPoint.X, CPoint.Y)  重载当前鼠标的位置
      

  6.   


    首先,不是减去m的坐标。而是施用偏移量,这里的偏移量不是位置,而是大小(或者叫向量)。
    在panel1_MouseDown中计算偏移量就是: L - e.Location
    而在panel1_MouseDown中坐标原点在L,就是L = 0,所以偏移量= -e.Location。
      

  7.   

    哦大概有点了解了 但是为什么是用L-e.Location而不是用e.Location-L呢