Closed 。这个问题是基于意见的 。目前不接受答案。
我正在从头开始设计一个简单的 GUI 框架作为一个项目,使用 OpenGL,没有任何其他外部东西,并且需要一些关于如何实现用户交互的建议。
基本上,我有一个基类GUIItem
所有元素都继承自它。这为每个项目提供了一些基本变量,例如位置、包含子元素的向量以及鼠标移动和单击的一些基本功能。
所有元素及其相关成员变量均按上述方式设置。
我正在努力解决的是如何正确实现用户交互。在我的窗口管理器中,我将创建一个项目的新实例,例如GUIButton
并称之为button1
。窗口管理器将在发生单击时迭代其元素列表以及它们可能具有的任何子元素,根据对象的坐标、高度和宽度计算对象周围的矩形区域,然后运行与所说的项目,比如改变的值textlabel1
.
首先,有没有更好的方法来进行这个计算?它适用于矩形元素,但球形物体和其他物体将具有更大的可以单击的错误区域。理想情况下我会检查像素,但我不知道如何实现这一点。我听说过但从未使用过 GLUT (不过我的项目只允许使用它来处理鼠标/键盘交互)。在这种情况下,GLUT 是否提供任何帮助?
我的主要问题是处理“单击”事件实际发生时会发生的情况。眼下GUIButton
例如,内置了一个“单击”函数,据我所知,我必须做一些事情,比如使它成为一个虚拟函数,这意味着我创建的每个新按钮都必须有自己的类覆盖“单击”函数,并且按钮的每个实例都将是一个简单继承的唯一类的实例GUIButton
。这对我来说似乎很混乱,因为我不知道在哪里存储所有这些类,而且似乎有很多额外的代码。我会创建一个button1.cpp 和button1.h 文件吗?
任何关于这方面的建议都将受到欢迎,因为我是 C++、OpenGL 的新手,这是我第一次接触 GUI 编程,当现有的 GUI 框架是通常的选择时,没有太多可做的。
如果你想要什么简单而快速 那么你可以:
创建包含阴影屏幕缓冲区ID/index/pointer
而不是颜色
预渲染此缓冲区
只需将每个视觉组件呈现给它,而不是着色/纹理只需填充ID/index/pointer
渲染组件的。不要忘记用一些东西来清除它NULL
首先......之后你应该有你的组件的面具。您只需执行此操作一次...
关于鼠标事件
您只需将鼠标坐标转换为阴影屏幕空间并选择值即可。如果是NULL
然后你点击空白区域或其他任何东西。如果它包含ID
而是更新或调用组件的回调ID
。如果您有所有组件的列表,则 ID 可以是列表索引,否则使用其实际指针或以样式进行编码(component_type, component_index)
。正如你所看到的,这非常快O(1)
项目选择,无论您有多少组件......阴影屏幕可以具有与实际屏幕不同的分辨率(以节省内存)。
无论组件的形状如何,它都具有像素完美的鼠标选择精度,而无需嵌套组件搜索循环。
[Notes]
当我这样做时,这里有一些提示:
创建一个window
class 包含单屏组件的配置。程序通常有更多的屏幕,其中包含不同的组件集,并且一遍又一遍地动态执行屏幕,只是因为切换页面/屏幕很糟糕。
使用单独的组件列表,每种组件类型一个列表。
create IDE 适用于您的 Windows 的编辑器请参阅C++ 中的拖放示例 它可能会派上用场。添加get,set
控制的功能string/enum or flag
轻松获取/更改属性以使对象检查器成为可能。我的 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(使用前将#替换为@)