简单的 OpenGL GUI 框架用户交互建议? [关闭]

2023-12-02

我正在从头开始设计一个简单的 GUI 框架作为一个项目,使用 OpenGL,没有任何其他外部东西,并且需要一些关于如何实现用户交互的建议。

基本上,我有一个基类GUIItem所有元素都继承自它。这为每个项目提供了一些基本变量,例如位置、包含子元素的向量以及鼠标移动和单击的一些基本功能。

所有元素及其相关成员变量均按上述方式设置。

我正在努力解决的是如何正确实现用户交互。在我的窗口管理器中,我将创建一个项目的新实例,例如GUIButton并称之为button1。窗口管理器将在发生单击时迭代其元素列表以及它们可能具有的任何子元素,根据对象的坐标、高度和宽度计算对象周围的矩形区域,然后运行与所说的项目,比如改变的值textlabel1.

首先,有没有更好的方法来进行这个计算?它适用于矩形元素,但球形物体和其他物体将具有更大的可以单击的错误区域。理想情况下我会检查像素,但我不知道如何实现这一点。我听说过但从未使用过 GLUT (不过我的项目只允许使用它来处理鼠标/键盘交互)。在这种情况下,GLUT 是否提供任何帮助?

我的主要问题是处理“单击”事件实际发生时会发生的情况。眼下GUIButton例如,内置了一个“单击”函数,据我所知,我必须做一些事情,比如使它成为一个虚拟函数,这意味着我创建的每个新按钮都必须有自己的类覆盖“单击”函数,并且按钮的每个实例都将是一个简单继承的唯一类的实例GUIButton。这对我来说似乎很混乱,因为我不知道在哪里存储所有这些类,而且似乎有很多额外的代码。我会创建一个button1.cpp 和button1.h 文件吗?

任何关于这方面的建议都将受到欢迎,因为我是 C++、OpenGL 的新手,这是我第一次接触 GUI 编程,当现有的 GUI 框架是通常的选择时,没有太多可做的。


如果你想要什么简单而快速那么你可以:

  1. 创建包含阴影屏幕缓冲区ID/index/pointer而不是颜色

  2. 预渲染此缓冲区

    只需将每个视觉组件呈现给它,而不是着色/纹理只需填充ID/index/pointer渲染组件的。不要忘记用一些东西来清除它NULL首先......之后你应该有你的组件的面具。您只需执行此操作一次...

  3. 关于鼠标事件

    您只需将鼠标坐标转换为阴影屏幕空间并选择值即可。如果是NULL然后你点击空白区域或其他任何东西。如果它包含ID而是更新或调用组件的回调ID。如果您有所有组件的列表,则 ID 可以是列表索引,否则使用其实际指针或以样式进行编码(component_type, component_index)。正如你所看到的,这非常快O(1)项目选择,无论您有多少组件......阴影屏幕可以具有与实际屏幕不同的分辨率(以节省内存)。

无论组件的形状如何,它都具有像素完美的鼠标选择精度,而无需嵌套组件搜索循环。

[Notes]

当我这样做时,这里有一些提示:

创建一个window class包含单屏组件的配置。程序通常有更多的屏幕,其中包含不同的组件集,并且一遍又一遍地动态执行屏幕,只是因为切换页面/屏幕很糟糕。

使用单独的组件列表,每种组件类型一个列表。

create IDE适用于您的 Windows 的编辑器请参阅C++ 中的拖放示例它可能会派上用场。添加get,set控制的功能string/enum or flag轻松获取/更改属性以使对象检查器成为可能。我的 IDE 也是这样的:

vcl ide

该窗口直接从 IDE 保存为 C++ 代码,我可以将其复制到我的应用程序中。这是上面没有旋钮的例子(忘了保存):

//---------------------------------------------------------------------------
// OpenGL VCL window beg: win
    win.grid.allocate(0);
    win.grid.num=0;
    win.scale.allocate(0);
    win.scale.num=0;
    win.button.allocate(0);
    win.button.num=0;
    win.knob.allocate(0);
    win.knob.num=0;
    win.scrollbar.allocate(3);
    win.scrollbar.num=3;
    win.scrollbar[0].x0=200.0;
    win.scrollbar[0].y0=19.0;
    win.scrollbar[0].xs=256.0;
    win.scrollbar[0].ys=16.0;
    win.scrollbar[0].fxs=8.0;
    win.scrollbar[0].fys=19.0;
    win.scrollbar[0].name="_vcl_scrollbar0";
    win.scrollbar[0].hint="";
    win.scrollbar[0].min=0.000;
    win.scrollbar[0].max=1.000;
    win.scrollbar[0].pos=0.000;
    win.scrollbar[0].dpos=0.100;
    win.scrollbar[0].horizontal=1;
    win.scrollbar[0].style=0;
    win.scrollbar[0].resize();
    win.scrollbar[1].x0=200.0;
    win.scrollbar[1].y0=45.0;
    win.scrollbar[1].xs=256.0;
    win.scrollbar[1].ys=16.0;
    win.scrollbar[1].fxs=8.0;
    win.scrollbar[1].fys=19.0;
    win.scrollbar[1].name="_vcl_scrollbar1";
    win.scrollbar[1].hint="";
    win.scrollbar[1].min=0.000;
    win.scrollbar[1].max=1.000;
    win.scrollbar[1].pos=0.000;
    win.scrollbar[1].dpos=0.100;
    win.scrollbar[1].horizontal=1;
    win.scrollbar[1].style=0;
    win.scrollbar[1].resize();
    win.scrollbar[2].x0=200.0;
    win.scrollbar[2].y0=70.0;
    win.scrollbar[2].xs=256.0;
    win.scrollbar[2].ys=16.0;
    win.scrollbar[2].fxs=8.0;
    win.scrollbar[2].fys=19.0;
    win.scrollbar[2].name="_vcl_scrollbar2";
    win.scrollbar[2].hint="";
    win.scrollbar[2].min=0.000;
    win.scrollbar[2].max=1.000;
    win.scrollbar[2].pos=0.000;
    win.scrollbar[2].dpos=0.100;
    win.scrollbar[2].horizontal=1;
    win.scrollbar[2].style=0;
    win.scrollbar[2].resize();
    win.interpbox.allocate(0);
    win.interpbox.num=0;
    win.dblist.allocate(0);
    win.dblist.num=0;
// OpenGL VCL window end: win
//---------------------------------------------------------------------------

在这里查看图片在示波器上绘制实时数据一些想法(我让这个适用于 GDI 和 OpenGL)

最好使用像素单位而不是OpenGL <-1,+1>屏幕单元可提供更好的视觉质量和编辑舒适度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的 OpenGL GUI 框架用户交互建议? [关闭] 的相关文章

随机推荐

  • 通过 PIP 安装 pyautogui 时获取“encoding”是此函数的无效关键字参数”

    当我尝试将 pyautogui 库安装到 python 时 出现此错误 请在下面找到详细信息 ERROR Complete output from command python setup py egg info ERROR Traceba
  • pandas - 按部分字符串分组

    我想按部分子字符串对 DataFrame 进行分组 这是一个示例 csv 文件 GridCode Key 1000 Colour 1000 Colours 1001 Behaviours 1001 Behaviour 1002 Favour
  • selenium webdriver C# 多线程

    Selenium WebDriver 支持多线程吗 我尝试在打开 2 4 个窗口的情况下使用它 看起来浏览器窗口 Firefox 有时会被冻结 当一个线程启动时 driver FindElement By Id id SendKeys My
  • Django 复杂注释

    先决条件 查询集必须返回Articles 查询集必须返回唯一的对象 不得使用访问数据库的 for 循环 意味着对要注释的 N 个对象进行 N 个查询 我的模型 class Report BaseModel ios report JSONFi
  • 是否可以在 Node.js 上使用 UDP 来保证消息的传递?

    如何在 Node js 上使用 UDP 保证消息的传递 例如 如果数据包失败 我可以重新发送数据包 但有没有办法识别它何时失败 另外 数据包丢失有多常见 如果您真正想知道的是 如何检测丢失的数据包 那么一般的技术是让接收方对发送的每个数据包
  • ng-options 在另一个下拉列表中按值过滤

    这似乎是一个非常简单的代码 但我无法弄清楚为什么它不起作用 我想按所选的 品牌 过滤 型号 下拉列表 Make
  • 如何在 webview 组件中检索 Javascript 函数值

    如何从 webview 组件中加载的网页中检索 Javascript 函数值 你不能直接 您可以通过以下方式调用 Javascript 函数loadUrl javascript where 是你的函数调用 但是 您无法通过这种方式得到结果
  • 从 API 网关调用时,Cloudwatch Logs PutLogEvents 操作失败,并出现 com.amazon.coral.service#UnknownOperationException

    我使用 API Gateway 的 AWS 服务集成类型通过 PutLogEvents 操作将日志添加到 Cloudwatch Logs 服务 如下所述 https docs aws amazon com AmazonCloudWatchL
  • 为什么在将临时变量传递给线程函数时移动构造函数会被调用两次? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我无法理解为什么类的移动构造函数被调用两次 因为我的线程函数通过右值引用获取参数 所以我希望当参数移动到线程构造函数时 移动构造函数只会被调用一次 有人可以给出关于线程构造函数如何工作以及如何将参
  • linux 杀死命令 -9 与 -15

    我有一个进程想要终止然后重新启动服务 有人编写了通过编写以下脚本集来终止进程的代码 ps ef grep process name awk print kill 15 2 gt projects test kill sh run the k
  • 控制守护进程和应用程序的差异

    关于这篇优秀的文章 nohup 和守护进程有什么区别 我想问以下问题 从我的终端启动应用程序后 该应用程序会在后台或前台继续运行 我唯一能与之交互的就是从我的终端向其发送信号 假设标准输入仍然存在 然而 在启动守护进程后 我意识到可以通过其
  • 使用 shape-outside 包裹图像时如何将图像与文本底部对齐

    我一直在玩弄 shape outside 并在这里工作了一个示例 http www thelionscall com wp content Temp wrap test html element shape outside url http
  • XMLRPC 显示 -32601 错误(使用 PHP)

    我有以下代码
  • 使用 OpenCV 的 Heroku NodeJS 应用

    我尝试了很多构建包并在 google 上搜索了很多文章 但我就是无法部署我的 NodeJS 应用程序 所有构建包都已过时 2 年以上 而且都不起作用 到目前为止 我尝试了以下构建包 https github com zachlatta he
  • 增加 WordPress 的最大上传限制

    我需要将 PDF 文件上传到我的WordPress 网站 当我去上传新媒体 然后尝试上传它 它说 FileName pdf 超出了该网站的最大上传大小 我尝试查找 php ini 文件 但找不到它 我跑了phpinfo 通过创建一个新文件
  • 如何读取 MIT/GNU 方案中的文本文件?

    我一直在学习 SICP 我想应用我迄今为止学到的一些概念 也就是说 积累 映射和过滤将帮助我提高工作效率 我主要使用 CSV 文件 并且我知道 MIT GNU 方案不支持这种文件格式 但这没关系 因为我可以将 CSV 文件导出到 txt 文
  • 如何在sql server中将字符串转换为查询

    如何添加包含 And 子句的字符串 但是当我们应用查询该字符串时 该字符串将被视为查询并满足所有和条件我有一个查询 例如 Declare WhereQuery varchar max SET WhereQuery class BCA and
  • 如何跳过 XML 反序列化中引发错误的对象?

    我正在对非常大的 XML 文档 有时超过 200MB 使用 XML 反序列化 大多数文档都运行得很好 但有时反序列化函数会抛出错误 例如 当整数是字符串时 您会收到 格式错误 当无法识别指定的类型时 您会收到错误 Input string
  • 如何在dust.js中实现自定义渲染逻辑?

    我使用dust js 来呈现变量名称列表 这些名称有时很长并且包含下划线 例如 SUM COUNT LABOR COUNTRIES SMS PAST 浏览器不会用下划线换行 因此它会变得难看 我希望我的灰尘模板在每个下划线后添加一个零宽度的
  • 简单的 OpenGL GUI 框架用户交互建议? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在从头开始设计一个简单的 GUI 框架作为一个项目 使用 OpenGL 没有任何其他外部东西 并且需要一些关于如何实现用户交互的建议 基本上 我有一个基类GUIItem所有元素都继承自