首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让鼠标事件处理更简单?

如何让鼠标事件处理更简单?
EN

Stack Overflow用户
提问于 2012-01-16 10:40:16
回答 1查看 189关注 0票数 1

有时我必须实现一个功能,比如自定义的拖放。代码可能是这样的:

代码语言:javascript
复制
bool mouse_down = false;
Vec2 mouse_pos;
void on_mouse_down() {
  mouse_down = true;
  mouse_pos = cursor_pos();
}
void on_mouse_move() {
  if(mouse_down) {
    Vec2f c = cursor_pos();
    Vec2f d = c - mouse_pos;
    // dragging. make objects tracing the cursor.
    // ...
  }
}
void on_mouse_up() {
  mouse_down = false;
  // dropped
  // ...
}

我知道这很好用,但我一点也不喜欢多余的变量和分离的过程。在IP(命令式编程)中,这可能是不可避免的;我的问题是,在FP(函数式编程)中有没有更好的方法来处理这种事情?任何想法和建议,无论是哪种编程语言,Lisp,Scheme,F#,Ruby,等等,或者是一些更好的IP实现方式,我们都很感激。

EN

回答 1

Stack Overflow用户

发布于 2012-01-17 15:05:52

既然一天都没有人尝试回答,我就试一试。我理解您正在讨论的问题,但答案可能取决于操作系统、语言及其运行时库。

一般的想法是,当鼠标按下时,你会产生一个异步计算。这个计算在事件上“阻塞”,并在获取时在自己的循环中处理它们,做您需要做的事情;当鼠标按键打开时,它就会存在。虽然这看起来像一个命令式线程,但实际上,当计算被“阻塞”时,它只会产生对启动位置的控制(假设是主GUI线程调用鼠标按下事件)。通过这种方式,状态被封装到看起来像是计算的局部作用域中。这种魔力必须由语言的运行时来处理,所以这就是我们能以一种语言和操作系统无关的方式得到的答案。

关于这种实现的示例,请查看this answerarticle by Tomas Petricek,它们都讨论了您的问题,但都是在Windows、.NET和F#的狭义设置中进行的。同样是Perticek的人写了一本书,Real World Functional Programming: With Examples in F# and C#,在书中用C#表达了同样的思想,令人惊讶的是,same通常不被认为是函数式语言。第16章,如果我没记错的话,是你的。

至于在IP/OO语言程序中封装状态,您可以在mouse_down处理程序中创建一个类的实例。实例将向运行库注册自身,以接收其他鼠标和UI事件,处理它们,完成所有工作,并在需要时(鼠标启动或窗口系统取消捕获模式)注销并销毁自身。虽然不像函数式语言所允许的那样优雅,但仍然比在通用UI类中保持可变状态要好得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8875262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档