CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

棘手的控件移动问题,非高手勿进

楼主chestnuts(每天只答2道题的隐士)2003-02-01 22:23:47 在 .NET技术 / C# 提问

private   void   panel1_MouseDown(object   sender,   System.Windows.Forms.MouseEventArgs   e)  
  {  
  if(e.Button==MouseButtons.Left)  
  {  
  canMove=true;  
  savePoint.X=e.X;  
  savePoint.Y=e.Y;  
  }  
  }  
   
  private   void   panel1_MouseMove(object   sender,   System.Windows.Forms.MouseEventArgs   e)  
  {  
  if(canMove==true)  
  {  
  panel1.Location=new   Point(e.X-savePoint.X,e.Y-savePoint.Y);  
  panel1.Refresh();  
  }  
  }  
   
  private   void   panel1_MouseUp(object   sender,   System.Windows.Forms.MouseEventArgs   e)  
  {  
  if(e.Button==MouseButtons.Left)  
  {  
  canMove=false;  
  }  
  }  
  其中canMove为bool变量,savePoint为纪录鼠标位置相对窗体的Point坐标  
   
  出现的问题:  
  挪动panel1控件的时候总是闪!!而且跟随鼠标光标吃力!挪动太迅速范围太大的话一会儿竟然消失了~  
  曾经的解决办法!  
  按鼠标光标的Position(得到的是屏幕坐标)来挪动控件,问题解决!但是需要考虑到所有设备坐标都需要转换到屏幕坐标的问题!!并且同时又要计算需要挪动的控件和窗体的距离!而且把光标光标的Position转换成为设备坐标同样又是上面那个出现的问题!!导致程序耦合性比较大!!!Bug容易出!  
   
  现100分诚征高手解决此类问题!!并且请所有高手们注意,  
  1,请测试你的认为的程序以确保你的程序解决方案的正确性!不要自以为就写上来。  
  2,请不要给个网址让我自己去看文章,一方面是大部分高手指到的地方都是鸟文,另一个原因是我要的是可行性解决方法,不是一c++或一vb的解决方法等。  
  3,欢迎大家补充我的问题,但那些废话级的话大家还是不要跟在这里罢  
  完了!!谢谢大家解决我的问题!  
   
  ----------------------------------------------------------------------  
  都说这里没有高手,我想知道这里到底有没有高手。  
   
   
  问题点数:100、回复次数:10Top

1 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-01 22:46:12 得分 0

顺便说一句!我做了一个test程序用来测试鼠标位置的页面,屏幕,设备坐标以及光标坐标的程序!  
  竟然发现我的光标坐标和屏幕坐标不是同样的值!!!  
  使我的操作系统的bug?  
  抑或是.net   framework   的bug?  
  抑或是vs.net的bug?  
  抑或是我的bug?Top

2 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-01 22:51:09 得分 0

别到明天这时候跟帖的不到5人啊~~~  
  赌一下~~~~~~~~~  
  看看这里的高手究竟有多少~~~~~  
  Top

3 楼Tigatron(my release date has been changed)回复于 2003-02-01 23:10:50 得分 0

关于闪烁的问题,你在处理MouseMove的时候不应用Refresh(),因为改变Location的时候系统自动实现了重画Top

4 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 00:09:49 得分 0

to   Tigatron(Zeratul)  
  去掉refresh也一样闪!!  
  你自己try一try!Top

5 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 09:26:20 得分 0

upTop

6 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 11:11:59 得分 0

upTop

7 楼tansm(一个老想发财的家伙)回复于 2003-02-02 16:50:00 得分 100

private   void   panel1_MouseDown(object   sender,   System.Windows.Forms.MouseEventArgs   e)   {  
                          if(e.Button==MouseButtons.Left)   {  
                                  canMove=true;  
                                  savePoint.X=e.X;  
                                  savePoint.Y=e.Y;  
                          }  
                  }  
   
                  private   void   panel1_MouseMove(object   sender,   System.Windows.Forms.MouseEventArgs   e)   {  
                          if(canMove==true)   {  
                                  panel1.Location=new   Point(panel1.Left+   e.X-savePoint.X,panel1.Top+e.Y-savePoint.Y);  
                          }  
                  }  
   
                  private   void   panel1_MouseUp(object   sender,   System.Windows.Forms.MouseEventArgs   e)   {  
                          if(e.Button==MouseButtons.Left)   {  
                                  canMove=false;  
                          }  
                  }  
  注意:你的MouseMove事件写错了,下次自己做错了,不要说别人有bugTop

8 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 21:16:35 得分 0

to   tansm(一个老想发财的家伙)    
  真的是我太糊涂,太感谢了!太感谢了!Top

9 楼tansm(一个老想发财的家伙)回复于 2003-02-04 21:04:29 得分 0

光感谢不给分!!!!!!!!Top

10 楼Tigatron(my release date has been changed)回复于 2003-02-07 14:02:03 得分 0

private   Point   mouse_offset;  
   
  private   void   panel1_MouseDown(object   sender,System.Windows.Forms.MouseEventArgs   e)  
  {  
              mouse_offset   =   new   Point(-e.X,-e.Y);  
  }  
   
  private   void   panel1_MouseMove(object   sender,System.Windows.Forms.MouseEventArgs   e)  
  {  
        if   (e.Button   ==   MouseButtons.Left)  
        {  
              Point   mousePos   =   Control.MousePosition;  
              mousePos.Offset(mouse_offset.X,   mouse_offset.Y);  
              panel1.Location   =   panel1.Parent.PointToClient(mousePos);  
        }  
  }  
   
  这样也可以的,简洁明了Top

相关问题

  • 控件移动
  • 关于控件的移动?
  • 能否移动控件?
  • 如何移动控件
  • 急,控件的移动?
  • TreeView节点分色显示及TImage控件组问题!棘手!!!
  • 超级棘手问题,控件里的listcontrol里贴图标!
  • 关于html 中的file field 控件问题,很棘手!
  • 关于FpSpread控件的问题,很棘手!
  • 如何实现image控件在picture控件中移动

关键词

  • 坐标
  • 控件
  • 鼠标
  • 解决
  • 屏幕
  • panel1
  • savepoint
  • canmove
  • mouseeventargs
  • 光标

得分解答快速导航

  • 帖主:chestnuts
  • tansm

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo