User interface 编程自定义GUI OPenGL

User interface 编程自定义GUI OPenGL,user-interface,opengl,opentk,User Interface,Opengl,Opentk,我正在OpenTK中创建自己的GUI 例如,我想在光标位于某个GUI控件中时触发鼠标事件。我该怎么做?因为现在我只是遍历main类中的项目列表,在Opentk窗口的MouseMove事件中,我只是检查鼠标坐标是否在我正在绘制的组件的“区域”内 目前这是可行的,但我认为可以用更好的方式。这样,我的代码是无序的,在主类中,我更希望它在特定的组件类中 我希望将一个事件附加到GUI的每个组件上,以便为一个组件定义多个事件 我的意思是,我希望有一个按钮组件,我可以覆盖或只是使用一个在事件发生时激发的方法。

我正在OpenTK中创建自己的GUI

例如,我想在光标位于某个GUI控件中时触发鼠标事件。我该怎么做?因为现在我只是遍历main类中的项目列表,在Opentk窗口的MouseMove事件中,我只是检查鼠标坐标是否在我正在绘制的组件的“区域”内

目前这是可行的,但我认为可以用更好的方式。这样,我的代码是无序的,在主类中,我更希望它在特定的组件类中

我希望将一个事件附加到GUI的每个组件上,以便为一个组件定义多个事件


我的意思是,我希望有一个按钮组件,我可以覆盖或只是使用一个在事件发生时激发的方法。与OpenGL的窗口相同,您可以在其中覆盖事件。

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

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

UI组件:某种标准接口,不同的组件类型可以定义交互逻辑。根据语言的不同,最常见的方法可能类似于父类组件,其中包含要重写的方法。这些可能包括:

  • 鼠标悬停
  • 鼠标单击(新闻/发布)
  • 点击拖动
它还可能需要一些额外的相关信息:

  • 确定组件位置的某种方法。可以提供一个边界框,或者一个测试给定点是否在该组件内的方法
  • 用于绘制零部件的信息或功能
  • 显示和分层设置(如果在其他组件的顶部或后面绘制,它是可见的还是隐藏的)
UI上下文:上下文是定义UI中存在的组件集的结构。这可能类似于组件的列表结构。为了构建UI,您需要将组件添加到此上下文中。上下文将定义一些行为:

  • 管理组件(添加/删除/修改)
  • 如何绘制整个上下文(例如,在每个组件上循环并为每个组件执行绘制功能)
  • 事件处理(见下一节)
事件分派:为了使UI可用,您可以插入一个“适配器”层来处理窗口库(OpenTK)中的事件,然后将它们转换为组件的可用事件并分派它们。下面是一个示例,说明了这如何适用于“单击”事件(伪代码):

功能TK\u事件\u点击按下(点){
对于上下文中的组件{
如果组件.ContainsPoint(点){
component.EventClickPressed()
}
}
}
在我看来,这实际上是设计中比较棘手的部分,因为在基于组件的UI如何工作方面存在一些棘手的约定。您不一定要遵循它们,但至少要注意它们,因为这可能是人们期望您的UI工作的方式:

  • 单击按后,单击拖动将继续进行,直到单击释放,即使光标离开组件区域
  • “操作”发生在单击发布时
  • 单击释放仅在相同组件上发生相应的单击按下时才会执行操作
  • 如果光标不再位于组件内部,则单击释放不会执行任何操作(不过,在释放前离开并重新进入组件仍会执行该操作)
  • 一次只能主动单击一个组件(顶部显示的组件),即使多个组件在该点重叠
假设您遵循这些约定,这意味着分派事件实际上比仅仅检查事件点是否在给定组件中要复杂一些。您需要保持某种状态来跟踪上下文当前是否处于单击状态,以及哪个组件(如果有)正在“消费”当前单击。也就是说,如果发生了单击释放和拖动事件,应该为哪个组件提供这些事件



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

看起来您已经描述了一个合理的设计。你试过实现它吗?你遇到什么问题了吗?@HymnsForDisco问题是,我不知道怎么做。我想到了​​我希望它是怎样的,但不是怎样做。你知道吗?谢谢!我可以从这开始