2014-04-03 189 views
5

我正在为我的gamedev项目制作一个非常小的游戏内部GUI库,但我无法找到处理焦点的干净方式。图书馆图书馆:如何正确处理重点?

我的库支持嵌套列表框和小部件层次结构,但我似乎无法找到一种方法来防止在处理小部件焦点时出现奇怪的行为。例如形式:

|------------| 
| Form [X] | 
|------------| 
|   | 
| [Button01] | 
|   | 
| [List1][v] | 
|   | 
| [Button02] | 
|   | 
|------------| 

我的设计采用了Context对象存储Widget对象的列表。 A Widget可以有任意数量的孩子。我有设施递归迭代Widget的所有孩子/父母。

我关注的逻辑是目前:

  1. 如果上下文忙(拖动,缩放,编辑......),不改变焦点

  2. 如果按下鼠标的上下文之外或上下文是重点不突出,无焦点的一切

  3. 找到最上面的压制孩子,如果任何

  4. 找到“最深”层次结构中的压制孩子

  5. 无焦点的一切,但小部件一样深,像最深的孩子,并注重上下文

然而,这在很多场合失败,尤其是与嵌套的列表和文本框。我试图在网上找到一个很好的解决方案,但找不到任何文章/教程。我不确定我是否应该专注于特殊的小部件,或者是否存在可以在任何情况下正常工作的“良好”算法。


GUI库通常如何处理窗口小部件焦点?

是否有特别的说明,让小工具(如ListBoxes或ComboBoxes)独家专注?

这是我的GUI库的source codevideo here

+0

嗯..这与回答你的问题无关。这只是对您的代码/存储库的评论。不知道是否合适的C++ ..包括实现在内的每一行代码都在头文件或类声明中。一切声明为内联。你等待它编译多少个小时?接下来几乎没有任何行有任何评论或没有文档/自述任何地方..一切都被命名为SSV/SSU/SSVU ..吨的模板没有..更改源代码链接指向正确的文件(S)你想要检查。该链接指向包含许多文件的文件夹.. – Brandon

+0

* GUI库通常如何处理小部件焦点?*您可以随时查看开源GUI库,例如[MyGUI](http://mygui.info /)。 –

+0

“但是,这在许多场合都失败了” - 它有什么作用?你期望它做什么?虽然我们处在这个位置,但是“重点”是什么意思?这个名字有不同的概念。 –

回答

2

我建议定义一个像数据结构一样的树,该数据结构将节点定义为数据(窗口句柄,bool isFocus和一些额外的数据,如需要)以及节点 - 父,另外,将节点指针存储在窗口数据区域内,以便从给定的窗口句柄中检索节点指针。无论如何,从节点指针,数据会给你窗口句柄。现在,无论何时根窗口失去焦点,因为您在其他应用程序上单击鼠标或点击alt +选项卡或其他东西,主窗口会失去焦点,并且您会收到杀死焦点的相应消息。处理,从窗口句柄重置所有isFocus为节点树。无论何时您点击某个窗口,您都会收到gainfocus消息,从窗口句柄中找出该节点,并将isFocus设置为true。并将其父亲的所有副本isFocus设置为true,直到到达顶层节点(root)。它有帮助吗?

1

我不知道任何UI算法或用户界面的正确方式,但是我很久以前就实现了一个通用的用户界面库(不是最好的,但它在那个时候已经达到了目的),也许使用的方法可以满足您的需求。

为了处理从父母到孩子的事件,使用两种功能,具有以下原型:在一个枚举发现

int handleEventReceived(int eventType, void* data); 
int getEventConsumers(int eventType, vector<IConsumers*>& consumers); 

OFC事件类型。

随着所有孩子都实现了第一个函数,可以使用递归函数来为每个孩子和孩子的孩子(如此广播)发送事件。 当孩子回答事件时,它返回0,否则返回一些错误代码(例如ERRROR_EVENT_NOT_TREATED)。

但是,如果您只希望UI的特定部分响应某个事件,请使用第二个函数。

第二个函数返回“最大响应优先级”,以及与此优先级相关的使用者。例如,如果您的联系人有3个优先级为5的按钮和2个优先级为6的按钮,则它将返回6以及包含两个按钮的数组,您可以向其发送事件。

就你而言,你说你需要为子组件处理焦点。使用上述方法,我将创建一个事件ET_FOCUS_RECEIVED,并根据需要为每个UI元素上的此事件设置不同的优先级。

在您的情况中,如果您将事件的优先级设置为随着元素在层次结构中的深度增加而增加,则来自同一深度的元素将具有相同的优先级(因此小部件与深度最小的子元素都将处理该事件)。