Vit*_*meo 5 c++ user-interface focus widget
我正在为我的gamedev项目制作一个非常小的游戏内GUI库,但是我很难找到一种处理焦点的干净方法.
我的库支持嵌套的ListBoxes和小部件层次结构,但在处理小部件焦点时,我似乎无法找到防止奇怪行为的方法.示例表格:
|------------|
| Form [X] |
|------------|
| |
| [Button01] |
| |
| [List1][v] |
| |
| [Button02] |
| |
|------------|
Run Code Online (Sandbox Code Playgroud)
我的设计有一个Context存储Widget对象列表的对象.A Widget可以有任意数量的孩子.我有设施来递归迭代a的所有孩子/父母Widget.
我的焦点逻辑目前是:
如果上下文繁忙(拖动,调整大小,编辑...),请不要更改焦点
如果在上下文之外按下鼠标或上下文未聚焦,则将所有内容取消聚焦
找到最受压迫的孩子,如果有的话
找到层次结构中"最深"的按下子项
除了小部件之外的所有内容都不会聚焦到最深的孩子,并关注上下文
但是,这在许多情况下都失败了,特别是对于嵌套列表和TextBoxes.我试图在网上找到一个好的解决方案,但找不到任何文章/教程.我不确定是否应该专门关注特殊小部件,或者是否有"好"算法在任何情况下都能正常工作.
GUI库通常如何处理小部件焦点?
是否有特殊说明专门关注ListBoxes或ComboBoxes等小部件?
我建议定义一个类似树的数据结构,将节点定义为数据(窗口句柄、bool isFocus 和您需要的一些附加数据)加上一些指向节点的指针 - 父节点、第一个子节点、左兄弟节点、右兄弟节点。另外,将节点指针存储在窗口数据区域中,以便从给定的窗口句柄中检索节点指针。无论如何,从节点指针,数据都会为您提供窗口句柄。现在,每当根窗口失去焦点时,因为您在其他应用程序上单击鼠标或按 alt+tab 等,主窗口就会失去焦点,并且您会收到适当的取消焦点消息。处理这个问题,从窗口句柄重置节点树的所有 isFocus。每当你点击某个窗口时,你都会收到gainfocus消息,从窗口句柄中找到该节点,将isFocus设置为true。并将其所有父节点的 isFocus 设置为 true,直到到达顶部节点(根)。有帮助吗?