HyperMesh二次开发技术—鼠标调整插件界面位置功能开发(二)

1.代码实例

#新建过程subWindow

proc subWindow {} {
    toplevel .subWindow -background {black}
    wm overrideredirect .subWindow true
    wm attribute .subWindow -topmost true
    wm geometry .subWindow 296x120+300+250
    frame .subWindow.f -relief flat
    label .subWindow.f.label01 -text "" -width 1 -height 5 -background {black}
    grid .subWindow.f.label01 -column 0 -row 0 -padx 2 -sticky ew
    labelframe .subWindow.f.part01 -text "workPath" -width 25 -height 100
    label .subWindow.f.part01.label00 -text "HomeDir"  -font {arial 8 bold} -width 8
    label .subWindow.f.part01.label10 -text "" -width 20 -height 2 -relief groove -borderwidth 4
    button .subWindow.f.part01.button -text "Select" -width 5  -font {arial 8 bold}
    grid .subWindow.f.part01.label00 -column 0 -row 0 -pady 18 -padx 2 -sticky ew 
    grid .subWindow.f.part01.label10 -column 1 -row 0 -pady 18 -padx 2 -sticky ew
    grid .subWindow.f.part01.button -column 1 -row 1 -pady 5 -padx 4 -sticky e
    grid .subWindow.f.part01 -column 1 -row 0 -padx 3 -pady 1 -sticky ew
          
    labelframe .subWindow.f.part02 -text "Import/Export" -width 23 -height 100
    button .subWindow.f.part02.button00 -text "Import" -width 5 -font {arial 8 bold} 
    button .subWindow.f.part02.button01 -text "Export" -width 5 -font {arial 8 bold}
    button .subWindow.f.part02.button02 -text "-Back-" -width 5 -font {arial 8 bold} -command {destroy .subWindow}
    grid .subWindow.f.part02.button00 -column 0 -row 0 -pady 5 -padx 2 -sticky ew
    grid .subWindow.f.part02.button01 -column 0 -row 1 -pady 5 -padx 2 -sticky ew
    grid .subWindow.f.part02.button02 -column 0 -row 2 -pady 5 -padx 2 -sticky ew
    grid .subWindow.f.part02 -column 2 -row 0 -padx 3 -pady 1 -sticky ew
    pack .subWindow.f -padx 0 -pady 1
    global Dx Dy nextId
    set nextId 0
    set Dx 0
    set Dy 0
    set Mx 0
    set My 0

#绑定鼠标左键,当鼠标左键被按下执行"{}"内脚本
    bind .subWindow.f.label01 <ButtonPress-1> {
        set Mx %X;
        set My %Y;
        set relPosit [mouRelSubPosit $Mx $My];
        set Dx [lindex $relPosit 0];
        set Dy [lindex $relPosit 1];
        set nextId 1
    }

#绑定鼠标光标,当光标移动执行"{}"内脚本
    bind .subWindow.f.label01 <Motion> {
        set Mx %X;
        set My %Y;
        set windPosit [windowPosit $Mx $My $Dx $Dy];
        if {$nextId == 1} {
            wm geometry .subWindow +[lindex $windPosit 0]+[lindex $windPosit 1]    
        }
    }    

#绑定鼠标,当鼠标被释放执行"{}"内脚本
    bind .subWindow.f.label01 <ButtonRelease> {
        set nextId 0
        break
    }
    
}

#新建过程,计算光标位置与界面左顶点X与Y方向距离
proc mouRelSubPosit {Mx My} {
    upvar #1 Mx mx
    upvar #1 My my
    set relPosit ""
    set SizePosit [wm geometry .subWindow]
    set PositX [lindex [split $SizePosit +] 1]
    set PositY [lindex [split $SizePosit +] 2]
    set dx [expr $mx-$PositX]
    set dy [expr $my-$PositY]
    set relPosit [concat $relPosit $dx $dy]
    return $relPosit
}

#新建过程,计算界面新位置坐标
proc windowPosit {Mx My Dx Dy} {
    upvar #1 Mx mx
    upvar #1 My my
    upvar #1 Dx dx
    upvar #1 Dy dy
    set windPosit ""
    set windPositX [expr $mx-$dx]
    set windPositY [expr $my-$dy]
    set windPosit [concat $windPosit $windPositX $windPositY]
    return $windPosit
}

#调用subWindow过程
subWindow

2.代码解析

(1) 绑定鼠标左键,当鼠标左键被按下执行"{}"内脚本
    bind .subWindow.f.label01 <ButtonPress-1> {

        #将光标x坐标值赋给变量Mx
        set Mx %X; 

        #将光标y坐标值赋给变量My
        set My %Y;

        #调用mouRelSubPosit过程,返回光标位置与界面左顶点的距离数列赋给变量relPosit,0位置为x方向距离,1位置为y方向          #距离
        set relPosit [mouRelSubPosit $Mx $My];

        #数列"relPosit" 0 位置数值赋给变量Dx
        set Dx [lindex $relPosit 0];

        #数列"relPosit" 0 位置数值赋给变量Dy
        set Dy [lindex $relPosit 1];

        #改变nextId,用于辨识是否改变界面位置
        set nextId 1;
    }

    #新建mouRelSubPosit过程,功能:返回光标位置与界面左顶点的距离数列

    proc mouRelSubPosit {Mx My} {
        upvar #1 Mx mx
        upvar #1 My my
        set relPosit ""

        #获取界面尺寸及位置信息,赋值给变量SizePosit
        set SizePosit [wm geometry .subWindow]

        #获得界面x坐标信息,赋值给变量PositX
        set PositX [lindex [split $SizePosit +] 1]

        #获得界面y坐标信息,赋值给变量PositY
        set PositY [lindex [split $SizePosit +] 2]

        #光标位置与界面左顶点的x方向距离,赋值给变量dx
        set dx [expr $mx-$PositX]

        #光标位置与界面左顶点的y方向距离,赋值给变量dy
        set dy [expr $my-$PositY]

        #将dx及dy连接成数列relPosit
        set relPosit [concat $relPosit $dx $dy]

        #将数列返回
        return $relPosit
    }

(2) 绑定鼠标光标,当光标移动执行"{}"内脚本
    bind .subWindow.f.label01 <Motion> {

        #将光标x坐标值赋给变量Mx
        set Mx %X;

        #将光标y坐标值赋给变量My
        set My %Y;

        #调用windowPosit过程,返回界面的新位置坐标数列,0位置为x方向坐标,1位置为y方向坐标
        set windPosit [windowPosit $Mx $My $Dx $Dy];

        #更改界面位置
        if {$nextId == 1} {
            wm geometry .subWindow +[lindex $windPosit 0]+[lindex $windPosit 1]    
        }
    }    

    #新建过程,计算界面新位置坐标
    proc windowPosit {Mx My Dx Dy} {
        upvar #1 Mx mx
        upvar #1 My my
        upvar #1 Dx dx
        upvar #1 Dy dy
        set windPosit ""

        #计算界面x方向位置值
        set windPositX [expr $mx-$dx]

        #计算界面y方向位置值
        set windPositY [expr $my-$dy]

        #将 windPositX及windPositY连接成数列windPosit
        set windPosit [concat $windPosit $windPositX $windPositY]

        #将数列返回
        return $windPosit
    }

(3) 绑定鼠标,当鼠标被释放执行"{}"内脚本
    bind .subWindow.f.label01 <ButtonRelease> {

        #恢复辨识码nextId
        set nextId 0

        #跳出绑定
        break
    }

(4) bind命令创建绑定

bind "组件" <事件> {执行脚本}

<事件>:Key或者KeyPress—按下按键

               KeyRelease—释放按键

               Button或者ButtonPress—按下鼠标

               ButtonRelease—释放鼠标键

               Enter—移动鼠标到组件内

               Leave—从组件上移开鼠标光标

               Motion—在某个组件内,将鼠标光标移到另一个点

               MouseWheel—用户移动鼠标滚轮

               FocusIn—组件接收键盘焦点

               FocusOut—组件失去键盘焦点

               Configure—在开始时显示组件,或者改变它的尺寸、位置或边缘宽度

               Map—组件可见

               Unmap—组件不再可见

               Destroy—删除组件

3.启动插件,利用鼠标调整界面位置

案例源码进群:756716776下载

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HyperMesh二次开发是指在HyperMesh软件中进行自定义功能开发的过程。在学习HyperMesh二次开发时,可能会遇到一些困难,因为在最初学习时,可能找不到完整的学习资料。一些人可能只能通过软件帮助和自己摸索来学习,这个过程可能会很痛苦,有时候为了实现一个简单的功能,需要翻遍帮助文档和查询网络,但仍然找不到合适的处理方法,这可能会让人怀疑自己的能力。然而,只要坚持下来,通过不断的学习和实践,就能掌握绝大多数的HyperMesh开发项目。\[1\] 有些人为了分享自己在HyperMesh二次开发学习中的经验总结,帮助有兴趣学习HyperMesh二次开发的同学快速掌握开发知识,以及提供一个技术交流的平台,开设了一些教程专栏。这些教程专栏可以让大家在此交流学习心得、分享技术、共同进步。\[2\] 如果你对HyperMesh二次开发感兴趣,可以寻找这些教程专栏来获取更多的学习资源和指导。虽然这些教程可能存在一些没有覆盖到的内容和错误的地方,但是通过与他人的交流和探讨,可以更好地理解和应用HyperMesh二次开发技术。\[3\] #### 引用[.reference_title] - *1* *2* *3* [HyperMesh二次开发教程 - 前言](https://blog.csdn.net/buleskyline/article/details/122004956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小周原创

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值