【问题标题】:How does one react to mouse wheel events in an GLUT window in Haskell?在 Haskell 的 GLUT 窗口中,如何对鼠标滚轮事件做出反应?
【发布时间】:2011-01-31 11:28:32
【问题描述】:

我正在使用 OpenGL 包,并且也在使用 GLUT 包。尽管 GLUT 包似乎有鼠标滚轮回调,但它似乎不起作用(文档只说 freeglut)。

那么...在 GLUT 创建的窗口中,如何访问鼠标滚轮事件?

【问题讨论】:

  • 虽然偏离 GLUT 的答案是正确且有用的,但字面问题的答案是使用 keyboardMouseCallback。 mousewheel 事件不起作用,但 keyboardMouseCallback 也处理滚轮事件,所以它在 GLUT 中起作用。

标签: haskell glut mousewheel glfw


【解决方案1】:

OpenGL 不创建窗口。本质上,它只是绘制东西的一堆函数。它的事件处理完全超出了 OpenGL 的范围。 GLUT 不是 OpenGL 的核心部分。这是一个相当古老的库,目的是让编写简单的 OpenGL 教程变得容易。仅此而已。

你应该使用更优秀的 GLFW 而不是 GLUT,它也存在优秀的 Haskell 绑定:http://hackage.haskell.org/package/GLFW

【讨论】:

  • 糟糕! “GLFW 应用程序只能打开一个窗口。”我需要多个。看来我需要使用... WX?在 wx 或 wxcore 中找不到关于 opengl 的任何内容...
  • @taotree:可能是 WX 或 GTK。您想要 WX 中的 GLCanvas;它似乎不存在于主包中,我猜是由于缺乏需求,但确实存在于 wxcore 中。
  • 我对 WX 的了解还不够,因为它在 wxcore 中但不在 wx 中意味着什么。这是否意味着我仍然可以简单地使用它,还是必须先在 wx 中实现才能支持它?
【解决方案2】:

只是添加另一个选项...

当我厌倦了 GLUT 时,我切换到 Gtk2Hs。 wiki 上有几个简单的示例演示 GtkGLext。

【讨论】:

    【解决方案3】:

    我还建议避免 GLUT。无论如何,它非常有限。

    如果您更喜欢处理自己的主事件循环而不是使用回调,另一个选项是使用SDL。是的,它是为游戏设计的,但它可以为您提供一个 GL 上下文,并且对于大多数不需要标准 UI 小部件的交互式 OpenGL 应用程序来说工作得很好。它为您提供键盘/鼠标事件、毫秒计时器和一些非常基本的窗口管理。

    有点无意义的事后编辑:我在评论中得知 GLFW 还允许运行您自己的事件循环。再次查看后,我完全同意 GLFW 是大多数不需要标准 UI 小部件的事情的方式。

    【讨论】:

    • 使用 GLFW 也可以维护一个自定义主循环。
    • @datenwolf:哦,真的吗?哼!出于某种原因,我认为它也使用了回调,但显然我自己从未使用过它,所以我错了。出于各种其他原因,总是最终使用 SDL 或完整的 UI 工具包,如 gtk/wx。无论如何,感谢您指出这一点!
    • 为了完整起见,GLFW 似乎可以通过任何一种方式做到这一点:自定义循环或注册回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2010-09-25
    • 2014-08-14
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多