Ocaml 可以通过拖动来移动的Tk标签

Ocaml 可以通过拖动来移动的Tk标签,ocaml,tcl,tk,Ocaml,Tcl,Tk,我想有一个Tk标签,可以在窗口中拖动移动。下面是我如何尝试得到它的: 通过使用绝对坐标放置标签 绑定事件按钮按和按钮释放,并监视是否按下鼠标按钮。还记录用户开始拖动时鼠标指针的坐标 绑定事件运动并获取指针的坐标。计算两个坐标之间的差值,并将其添加到标签的坐标中,以获得标签的新坐标 再次调用place设置标签的新坐标 这是密码。它是用OCaml写的,但我想我在这里做的很清楚 let () = let t = openTk () in let l = Label.create ~text:"

我想有一个Tk标签,可以在窗口中拖动移动。下面是我如何尝试得到它的:

  • 通过使用绝对坐标放置标签
  • 绑定事件
    按钮按
    按钮释放
    ,并监视是否按下鼠标按钮。还记录用户开始拖动时鼠标指针的坐标
  • 绑定事件
    运动
    并获取指针的坐标。计算两个坐标之间的差值,并将其添加到标签的坐标中,以获得标签的新坐标
  • 再次调用
    place
    设置标签的新坐标
  • 这是密码。它是用OCaml写的,但我想我在这里做的很清楚

    let () =
      let t = openTk () in
      let l = Label.create ~text:"move me" t in
      place ~x:100 ~y:100 l;
      let d = ref false
      and xprev = ref 0 and yprev = ref 0 in
      bind ~events:[`ButtonPress] ~fields:[`MouseX; `MouseY]
        ~action:(fun ev -> d := true; xprev := ev.ev_MouseX; yprev := ev.ev_MouseY)
        l;
      bind ~events:[`ButtonRelease] ~action:(fun _ -> d := false) l;
      bind ~events:[`Motion] ~fields:[`MouseX; `MouseY]
        ~action: (fun ev ->
         if !d then
           let x = Winfo.x l and y = Winfo.y l in
           place ~x:(x + ev.ev_MouseX - !xprev) ~y:(y + ev.ev_MouseY - !yprev) l)
        l;
      mainLoop ()
    

    这似乎是可行的,但这是我想做的正确方法吗?

    是的,使用位置和鼠标绑定是正确的方法。

    除了使用
    B1
    修改器应该是
    Motion
    ;省去了很多布尔变量的麻烦。