Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 无法访问相对于画布小部件的鼠标坐标_Linux_Common Lisp_X86 64_Sbcl_Ltk - Fatal编程技术网

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,但是为什么它不起作

我正在AMD64机器上使用SBCL for Linux。
函数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是画布坐标。不仅 您是否通过这种方式直接获得正确的值,但它也是 更高效,因为您不必轮询鼠标位置-您可以 更改时自动更新。在你的情况下,你可以 选择在鼠标移动时更新屏障,或者,只需 将鼠标坐标存储在更新中读取的变量中 循环