我想实现的是:自定义控件拖动到主界面上,并可以做连线,然后将控件和线的坐标点保存到库中.(如:工作流中的自定义控件那样,CS下的)
问题:再拖动控件时,位置坐标不是我付给它的坐标,控件自动发生位置移动,请问为什么?
代码:
     start[c1] = new Start(); //自定义控件
                    start[c1].Location = new System.Drawing.Point(e.X - 80, e.Y);//设定位置,e.x,e.y指的是鼠标的位置
                    if ((start[c1].Location.X < panel2.Location.X - 105) || (start[c1].Location.Y < panel2.Location.Y -  35))
                    {
                        return; //对创建节点位置的判断,在面板panel2内才可以创建
                    }
                    start[c1].Size = new System.Drawing.Size(53, 48);
……
      Controls.Add(start[c1]);//添加控件
                    panel2.Controls.Add(start[c1]);//添加控件

说明:在拖动控件,移动到面板上鼠标松开后,控件的位置会跳动一下,就变成别的坐标点了,请问各位高手,怎么解决,小弟不胜感激!!!

解决方案 »

  1.   

    鼠标移动移动事件 考虑 MOUSELEAVE等事件·
      

  2.   

    start[c1].Location = new System.Drawing.Point(e.X - 80, e.Y);//设定位置,e.x,e.y指的是鼠标的位置你控件的location是针对他所在的容器说的。而你的鼠标可是针对整个屏幕说的。所以才会发生你的那些问题……因为参考坐标系是不一样的,你没有做坐标系变换,所以会发生坐标错误。所以,你需要一个screentoclient 和 clienttoscreen方法(应该是叫这两个名儿吧,你可以找得到)
      

  3.   

    控件移动 参考
    http://blog.csdn.net/zgke/archive/2009/01/06/3718989.aspx
      

  4.   

    试试  坐标转换  
     point f=PointToClient(new Point( start[c1].Size ));
      

  5.   

    感觉拖到面板上后,应该坐标应该是panel上的坐标,而拖入之前应该是窗体(form)的坐标,screentoclient方法MS是转换的屏幕与鼠标的坐标,我觉得用鼠标坐标与panel的坐标的相对坐标差值可能会好一些.
      

  6.   

    Myth_NiuNiu:源程序能佛给我 发一份:[email protected],谢谢!