DrRacket BSL开发绘图应用时鼠标事件全部变为数字如何解决?
问题根因
你给鼠标事件处理函数定义的参数顺序不符合BSL on-mouse 规范,导致你拿到的第二个参数实际上是鼠标的x坐标数值,而不是事件类型字符串。
BSL的2htdp/universe库中,on-mouse绑定的处理函数必须遵循固定的参数顺序:处理函数名 当前应用状态 鼠标x坐标 鼠标y坐标 事件类型
你定义的handle-mouse把事件类型放在了第二个参数位,自然会拿到数值类型的坐标,触发string=?的类型报错。你后续加的字符串判断直接过滤了所有有效逻辑,因为你永远不会在第二个参数位拿到事件字符串,所以程序没有任何响应。
同时你原有代码的button-down分支存在逻辑问题:直接返回了add-line生成的image类型结果,没有包装为你定义的AppState结构体,会导致后续状态处理完全异常,需要同步修正。
修正方案
调整handle-mouse的参数顺序,同时修正返回值为合法的AppState结构体即可,参考代码如下:
; 参数顺序调整为 应用状态 → x坐标 → y坐标 → 事件类型 (define (handle-mouse appstate x-mouse y-mouse mouse-event) (cond [(string=? mouse-event "button-down") ; 返回AppState结构体,保存当前画布、新建的待绘制线条 (make-AppState (AppState-image appstate) (make-Line (make-posn x-mouse y-mouse) (make-posn x-mouse y-mouse)) #t)] [(string=? mouse-event "drag") (move-end appstate x-mouse y-mouse)] [(string=? mouse-event "button-up") (add-line-to-canvas appstate)] [else appstate]))
小优化建议:你定义的
AppState结构体第三个字段名称是无语义的boolean,建议修改为drawing?这类语义化名称,降低后续维护出错概率。
内容的提问来源于stack exchange,提问作者Carson_He
相关产品推荐
相关产品推荐

