微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编程自定义 GUI OPenGL

如何解决编程自定义 GUI OPenGL

我正在 OpenTK 中创建自己的 GUI。

例如,当光标位于 GUI 控件之一中时,我想触发鼠标事件。我怎样才能做到这一点?因为现在我只是遍历主类中的项目列表,而在 Opentk 的窗口的 MouseMove 事件中,我只是检查鼠标坐标是否在我正在绘制的组件的“区域”内.

这暂时有效,但我认为可以以更好的方式完成。这样我的代码在主类中是无序的,我宁愿将它放在特定的组件类中。

我想要的是将一个事件附加到我的 GUI 的每个组件,以便我可以为一个组件定义多个事件。

我的意思是,我想要例如一个按钮组件,我可以在其中覆盖或仅使用在事件发生时触发的方法。与 OpenGL 的窗口相同,您可以在其中覆盖事件。

解决方法

这不是一个完整的答案,因为您的问题相当广泛,但我希望它有所帮助。

为了实现这样的系统,以下是潜在设计的核心组件:

UI 组件:某种标准界面,其中不同的组件类型可以定义交互逻辑。根据语言的不同,最常见的方法可能是类似于父类 Component 的方法,其中的方法要被覆盖。这些可能包括以下内容:

  • 鼠标悬停
  • 鼠标点击(按下/松开)
  • 点击拖动

它还可能需要一些额外的相关信息:

  • 确定组件位置的某种方法。可能是提供一个边界框,或者可能是一种测试给定点是否在该组件内的方法。
  • 绘制组件的信息或功能。
  • 显示和分层设置(它是可见的还是隐藏的,它应该绘制在其他组件的顶部还是后面)。

UI 上下文:上下文是定义存在于 UI 中的组件集的结构。这可能类似于组件的列表结构。为了构建您的 UI,您需要向此上下文添加组件。上下文将定义一些行为:

  • 管理组件(添加/删除/修改)。
  • 如何绘制整个上下文(例如,遍历每个组件并为每个组件执行绘制功能)。
  • 事件处理(见下一节)

事件调度:为了使您的 UI 可用,您可以插入一个“适配器”层来处理来自您的窗口库 (OpenTK) 的事件,然后将它们转换为您的组件的可用事件并调度它们。下面是一个示例,说明这如何适用于“点击”事件(伪代码):

function TK_Event_ClickPressed(point) {
    for component in context {
        if component.ContainsPoint(point) {
            component.EventClickPressed()
        }
    }
}

在我看来,这实际上是设计中更棘手的部分,因为围绕基于组件的 UI 的工作方式存在一些棘手的约定。您不一定必须遵循它们,但至少要注意它们很重要,因为这可能是人们期望您的 UI 工作的方式:

  • 点击按下后,点击拖动继续发生直到点击释放,即使光标离开组件区域。
  • “操作”发生在点击释放
  • 只有在相同组件上发生相应的点击按下时,点击释放才会采取行动。
  • 如果光标不在组件内,则点击释放不采取任何动作(在释放前离开并重新进入组件仍然执行操作,虽然)。
  • 您一次只能主动点击一个组件(显示在顶部的那个),即使多个组件在该位置重叠。

假设您遵循这些约定,这意味着调度事件实际上比仅检查事件点是否在给定组件中要复杂一些。您需要维护某种状态来跟踪上下文当前是否处于单击状态,以及哪个组件(如果有)正在“消耗”当前单击。也就是说,如果发生点击释放和拖动事件,应该给予哪个组件。


有了这些系统,你只需要创建一个窗口,创建一个 UI 上下文,将适配器层注册到窗口以对该上下文执行操作,设置窗口以在框架上绘制上下文,然后使用上下文添加/删除/修改程序中的组件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。