第26章:鼠标事件
ξ 26.1 鼠标事件
左键按下
左键弹起
右键按下
右键弹起
鼠标移动
ξ 26.2 鼠标指令
mouseon 指令: -> mouse on -> “老鼠 开启”
开始捕获鼠标事件
格式: mouseon [ 左键按下事件的响应代码 ] [ 左键弹起事件的响应代码 ] [ 右键按下事件的响应代码 ] [ 右键弹起事件的响应代码 ] [ 鼠标移动事件的响应代码 ]
mouseoff 指令: -> mouse off -> “老鼠 关闭”
停止捕获鼠标事件
格式: mouseoff
mousepos 指令: -> mouse position -> “老鼠 位置”
获取鼠标在屏幕上的位置
格式: mousepos
ξ 26.3 交互示例
需求描述
点击鼠标左键时,在鼠标位置显示梅花;
显示梅花时点击鼠标左键,则隐藏梅花;
显示梅花时移动鼠标,则梅花跟随鼠标移动;
点击鼠标右键,终止以上效果,结束程序。
设计思路
分解:处理鼠标左键,处理鼠标移动,处理鼠标右键
连接:捕获鼠标事件,分别定义处理鼠标左键点击、鼠标移动和鼠标右键点击事 件的处理代码
递归:
处理左键——分解:梅花显示状态,梅花隐藏状态,绘制梅花
——连接:判断当前状态,做不同的处理
——递归:
显示状态:擦除梅花,切换到隐藏状态
隐藏状态:在鼠标位置绘制梅花,切换到显示状态
绘制梅花:画几段连接的弧线,构成梅花形状。
处理移动——分解:判断梅花显示状态,擦除梅花,新位置重绘梅花
——连接:先判断梅花是否显示,若显示则擦除梅花,在新位置重绘,若未显示则不处理
——递归:
判断梅花状态:读取表示梅花是否显示的变量值
擦除梅花:设置画笔为擦除模式,在原位置绘制,即擦除梅花
新位置重绘:在鼠标移动过程中的位置重绘梅花
处理右键:停止捕获鼠标事件,擦除梅花
程序设计
定义两段程序
程序yidong_meihua:
主程序
程序hua_meihua:
画梅花
参数x ,表示梅花图案中心点的 x 坐标
参数y ,表示梅花图案中心点的 y 坐标
参数xianshi,表示用绘制还是擦除梅花图案
编程实现
to yidong_meihua ;梅花随鼠标移动
local "weizhi ;梅花的位置
make "xianshi 0 ;是否显示梅花,1表示显示,0表示隐藏
;开启鼠标事件
mouseon [
;左键按下事件响应代码,
;当左键按下时,切换梅花的显示和隐藏状态,
;若显示则在鼠标位置
test :xianshi = 0 ;是否处于隐藏状态
ift [ ;若是隐藏状态
;梅花的位置设置到鼠标的位置
make "weizhi mousepos
make "xianshi 1 ;设为显示状态
;调用hua_meihua程序,在鼠标位置重绘梅花
hua_meihua (item 1 :weizhi) (item 2 :weizhi) :xianshi
]
iff [ ;若是显示状态
make "xianshi 0 ;设为隐藏状态
;调用hua_meihua程序,擦除梅花
hua_meihua (item 1 :weizhi) (item 2 :weizhi) :xianshi
]
] [ ;左键弹起事件,不用处理
] [ ;右键按下事件,不用处理
] [ ;右键弹起时,关闭鼠标事件捕获
mouseoff ;关闭鼠标事件捕获
ppt ;恢复画笔状态
] [ ;鼠标移动时,在新位置重绘梅花,
;就是梅花跟随鼠标移动的效果。
if :xianshi = 1 [
;调用hua_meihua程序,擦除梅花
hua_meihua (item 1 :weizhi) (item 2 :weizhi) 0
make "weizhi mousepos ;修改位置变量
;调用hua_meihua程序,在新位置重绘梅花
hua_meihua (item 1 :weizhi) (item 2 :weizhi) 1
]
]
end
to hua_meihua :x :y :xianshi ;画梅花
;参数x和y表示位置
;参数xianshi,值为1时表示要画梅花,
;值为0时表示要擦除梅花。
test :xianshi = 1 ;判断是要重绘还是擦除
ift [ ppt ] ;若要重绘,则设置画笔为绘画状态
iff [ pe ] ;若要擦除,则设置画笔为擦除状态
setpensize [2 2] ;设置画笔宽度为2像素
setpc 4 ;设置画笔为红色
;循环画花瓣,每60度画一个
for [i 0 360 60] [
pu ;抬笔
setxy :x :y ;移动到要重绘或擦除的位置
seth :i ;设置角度
fd 40 ;前进40像素
pd ;落笔
seth 90 +:i ;旋转到花瓣弧线开始位置
arc 180 23 ;花瓣弧线
]
pu ;抬笔
setxy :x :y ;移动到要重绘或擦除的位置
pd ;落笔
setpc 6 ;设置画笔为黄色
circle 10 ;半径为10像素的圆形
circle 15 ;半径为15像素的圆形
setpc 4 ;设置画笔为红色
circle 5 ;半径为5像素的圆形
ht ;隐藏箭头
end
运行程序
yidong_meihua
运行效果
下一篇
第27章:数学函数
ξ 27.1 平方根
ξ 27.2 幂运算
ξ 27.3 正弦、余弦
ξ 27.4 圆周率