Linux 无法访问相对于画布小部件的鼠标坐标
我正在AMD64机器上使用SBCL for Linux。Linux 无法访问相对于画布小部件的鼠标坐标,linux,common-lisp,x86-64,sbcl,ltk,Linux,Common Lisp,X86 64,Sbcl,Ltk,我正在AMD64机器上使用SBCL for Linux。 函数ANIMTEST使用画布小部件实例化LTK窗口。画布上有两件物品,屏障和跟随者。两者都连续旋转,屏障位于画布中心,跟随者打算跟随鼠标,但鼠标没有按预期工作。我的第一次尝试(见注释)导致鼠标的绝对屏幕坐标被解释为画布内的相对坐标,而不考虑两者之间的偏移。在搜索了ltk.lisp和docs之后,我找到了SCREEN-MOUSE-X/Y(第二次尝试,请参见注释)。根据文档,我觉得我在使用SCREEN-MOUSE-X&-Y,但是为什么它不起作
函数ANIMTEST使用画布小部件实例化LTK窗口。画布上有两件物品,屏障和跟随者。两者都连续旋转,屏障位于画布中心,跟随者打算跟随鼠标,但鼠标没有按预期工作。我的第一次尝试(见注释)导致鼠标的绝对屏幕坐标被解释为画布内的相对坐标,而不考虑两者之间的偏移。在搜索了ltk.lisp和docs之后,我找到了SCREEN-MOUSE-X/Y(第二次尝试,请参见注释)。根据文档,我觉得我在使用SCREEN-MOUSE-X&-Y,但是为什么它不起作用呢? =注= 包含ANIMTEST的文件以及支持该文件的软件包在加载和运行时不会出错。 我定义的函数(UCTK-BEAM等)经过测试并运行良好
(defun animtest ()
"Test a spinning figure in LTK"
(with-ltk ()
(let* ((cnvs (make-instance 'canvas :width 400 :height 400))
(barrier (uctk-beam 200 200 40 20))
(follower (uctk-beam 0 40 40 20))
(slp-time 50) ; in ms
(bar-theta 0)
(fol-theta 0))
(labels ((update ()
(draw barrier nil)
(draw follower nil)
(incf bar-theta (/ pi 15))
(incf fol-theta (/ pi 15))
(geo:set-theta barrier bar-theta)
(geo:set-theta follower fol-theta)
(geo:set-center follower
;== FIRST ATTEMPT ==
(cons (screen-mouse-x cnvs)
(screen-mouse-y cnvs)))
; == SECOND ATTEMPT ==
;(cons (canvasx cnvs (screen-mouse-x cnvs))
; (canvasy cnvs (screen-mouse-y cnvs))))
(after slp-time #'update)))
(pack cnvs :fill :both :expand 1)
(update)))))
提前谢谢 尽管CANVASX/Y功能似乎仍无法按预期工作,但LTK提供了WINDOW-X/-Y来返回小部件的X和Y屏幕坐标,这样您就可以编写以下内容来实现所需的效果:
(cons (- (screen-mouse-x) (window-x cnvs))
(- (screen-mouse-y) (window-y cnvs)))
这假设鼠标光标与名为CNVS的画布小部件位于同一屏幕上。要获取画布小部件中的鼠标位置,我不调用 屏幕鼠标功能,而是绑定运动和按键 事件。回调将传递包含的事件结构 插槽event-x和event-y是画布坐标。不仅 您是否通过这种方式直接获得正确的值,但它也是 更高效,因为您不必轮询鼠标位置-您可以 更改时自动更新。在你的情况下,你可以 选择在鼠标移动时更新屏障,或者,只需 将鼠标坐标存储在更新中读取的变量中 循环