许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  HyperMesh二次开发技术:鼠标调整插件界面位置功能开发(二)

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

阅读数 2
点赞 0
article_banner

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 𝑟𝑒𝑙𝑃𝑜𝑠𝑖𝑡0];𝑠𝑒𝑡𝐷𝑦[𝑙𝑖𝑛𝑑𝑒𝑥  relPosit0];setDy[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   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 𝑆𝑖𝑧𝑒𝑃𝑜𝑠𝑖𝑡+]1]𝑠𝑒𝑡𝑃𝑜𝑠𝑖𝑡𝑌[𝑙𝑖𝑛𝑑𝑒𝑥[𝑠𝑝𝑙𝑖𝑡  SizePosit+]1]setPositY[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   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下载


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空