Foxtable(狐表)用户栏目专家坐堂 → 分享一最短代码实现控件移动(附2种方法实例)


  共有15314人关注过本帖树形打印复制链接

主题:分享一最短代码实现控件移动(附2种方法实例)

帅哥哟,离线,有人找我吗?
qtcks
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
分享一最短代码实现控件移动(附2种方法实例)  发帖心情 Post By:2010/6/7 9:18:00 [只看该作者]

在人机互动中,或多或少需要实现控件的移动.
如果通过最有效的方法来实现控件移动.而不干扰其他事件的影响.
有2种方法实现控件移动.

1\MouseMove 在控件上移动鼠标时.
   在昨天之前我一直使用这种方法,
   最大的优势是拖拽控件,能实时显示.
   但有我的代码有很大的弊端.会影响到其他事件的正常运行.
   附代码:
      1、全局变量:
    kg,sbx,sby as integer
          
      2、内部函数
    1.移动控件开关
     Vars("kg")=Args(0)
     Vars("sbx")=Args(1)
     Vars("sby")=Args(2)

    2.移动位置
     with Forms(Args(0)).Controls(Args(1))
      if Vars("kg")=1 then
       .left=.left + Args(2) - Vars("sbx")
       .top=.top + Args(3) - Vars("sby")
      else
      end if
     end with
      3、窗口事件
       1、MouseDown
        if 选中控件符合条件 then Functions.Execute("移动控件开关",1,e.x,e.y)
        
       2、MouseMove
        if 选中控件符合条件 and Vars("kg")=1 then
         Functions.Execute("移动位置",e.Form.name,e.Sender.name,e.x,e.y)
        else
        end if
        
       3、MouseUp
        if 选中控件符合条件 then
      Functions.Execute("移动控件开关",0,0,0)
     else
     end if

2\MouseUp     松开鼠标后
 这种方法,在松开鼠标后,才执行控件移动.
 附代码:
  一.全局代码
   Public ydname As String        '控件名称
   Public ydax As Integer        '控件按下X坐标
   Public yday As Integer        '控件按下Y坐标
   Public ydx As Integer         '控件移动X坐标
   Public ydy As Integer         '控件移动Y坐标
   Public ydh As Integer         '控件高
   Public ydw As Integer         '控件宽
  
   二.内部函数
     新移动控件
      ydname=Args(0)
    ydx=Args(1)
    ydy=Args(2)
    ydh=Args(3)
    ydw=Args(4)
  三.窗口事件
    1.MouseDown
     ydax=e.x      '控件按下X坐标
     yday=e.y      '控件按下Y坐标
     
    2.MouseMove
     Functions.Execute("新移动控件",e.Sender.name,e.x,e.y,e.Sender.Height,e.sender.Width)
     
    3.MouseUp
     e.sender.top=e.sender.top+ydy-yday
     e.sender.left=e.sender.left+ydx-ydax
  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.rar

[此贴子已经被作者于2010-6-7 14:55:23编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/6/7 9:53:00 [只看该作者]

呵呵,多谢,没有看出特别耗时的代码啊。

之前论坛也有人发过一个实例,你可以参考参考。

 


 回到顶部
美女呀,离线,留言给我吧!
yangming
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2010/6/7 10:05:00 [只看该作者]

多谢分享

 回到顶部
帅哥哟,离线,有人找我吗?
qtcks
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/6/7 11:37:00 [只看该作者]

恩,我现在的案例是这样。

一个中心控件,围绕上百的子控件。分布在中心控件周围,用直线把两者相连。

现在移动中心控件,使用第一种方法,特别消耗系统资源,将遍历N次所有连接线。

    还严重影响其他事件的运行

使用第二种方法,只需要遍历一次。

所以效能提高很多。


 回到顶部
帅哥哟,离线,有人找我吗?
kylin
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19223 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2010/6/7 13:14:00 [只看该作者]

以下是引用qtcks在2010-6-7 11:37:00的发言:

恩,我现在的案例是这样。

一个中心控件,围绕上百的子控件。分布在中心控件周围,用直线把两者相连。

现在移动中心控件,使用第一种方法,特别消耗系统资源,将遍历N次所有连接线。

    还严重影响其他事件的运行

使用第二种方法,只需要遍历一次。

所以效能提高很多。

能否贴出例子看看,谢谢


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/6/7 15:54:00 [只看该作者]

用SetBounds调整位置和大小,会好一些

 回到顶部
帅哥哟,离线,有人找我吗?
kylin
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19223 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2010/6/7 19:19:00 [只看该作者]

多谢楼主!

 


 回到顶部
帅哥,在线噢!
程兴刚
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2010/6/7 20:49:00 [只看该作者]

谢分享!

 回到顶部