【问题标题】:Articles for developing a GUI library开发 GUI 库的文章
【发布时间】:2012-03-20 06:59:04
【问题描述】:

基本上,我找不到任何好的文章来开发您自己的 GUI,处理好的做法、基本结构、事件冒泡、提示和避免所有常见的陷阱。我对如何在 5 分钟内构建一些几乎无法工作的概念验证 GUI 不感兴趣……我也对构建下一个未来的 GUI 不感兴趣。

目的是构建一个功能合理的 GUI 用于游戏工具,但是它们将存在于游戏本身中,所以我不想使用现有的大型 GUI,而且我发现大多数游戏 GUI对于我需要的东西相当臃肿。而且我很享受自己动手的经历。

我过去做过一个 GUI,它在某种程度上运行良好,但是,由于一些糟糕的设计决策和缺乏经验,它只能做这么多(并且是内置在 Flash 中的,所以它可以免费获得很多东西)。所以这次我想真正了解一下基础知识。

【问题讨论】:

    标签: c++ c user-interface


    【解决方案1】:

    一些提示 -

    1) 选择 UI 可以使用的样式 - 它会是无状态的吗?如果是,您将如何妥善处理这些事件?如果它是无状态的,您可能需要重新评估您的 UI 用户代码两次,以便从用户端获取最新的事件更改。如果您的 UI 存储状态,那么您就不必关心处理事件,但它会限制您的 UI 在快速突变和重建时。

    2) 不要过度依赖 OO,虚方法并不是世界上最快的东西,所以要小心使用它们;不过,拥有某种基于继承的结构可能会有所帮助。如果使用对象,请注意 dynamic_cast 和 RTTI;他们会让你慢下来。相反,为每个小部件类设置一个枚举 get_type() 方法,并手动检查可转换性。

    3) 尝试将外观和 UI 逻辑/布局分开。

    4) 如果您想要动态窗口、布局等,那么您必须处理对齐、夹紧、位置等以及它们的更新。如果您只想要静态定位的小部件,它会变得更容易。

    5) 不要过度设计,你不会从中受益。

    我告诉你没有什么太具体的事情;有一些具体的问题会有所帮助吗?

    【讨论】:

    • 谢谢!这将在 Lua 中实现,其想法是使其保留,立即模式对于“更扁平”和更简单的 GUI 来说似乎很棒。我正在寻找的主要是,基础知识应该是什么样的?如何正确地进行事件传播(鼠标点击、输入焦点等)、推荐的基类方法、如何处理子级和定位(如按钮中的标签)等等。
    • 我认为查看 Cube 2 游戏引擎中的 UI 代码可能会有用。这不是很好的代码,但它用最少的代码实现了非常优雅的无状态 UI,基本上没有 OO,只使用代理和双重重新评估(在无状态时你无能为力)。无状态绝对是一个好主意。但是每帧 UI 的重新评估和重建并不能完全弥补大的性能,因此对于复杂的 UI 结构,您最好使用基于状态的系统。
    【解决方案2】:

    查看现有 GUI 库的文档。这应该会为您提供经过验证的设计的详细信息,以处理您遇到的问题。

    您可能想从您熟悉的一个开始,但我认为设计得很好的是AppKit。它的 API 是 Obj-C,因此如果您想复制它,则需要进行一些调整,但文档提供了有关对象如何交互的各种详细信息,例如处理事件,以及布局约束是如何工作的,这应该可以直接适用于以几乎任何语言设计 OO GUI。

    【讨论】:

    • 是的,我正在查看一些现有的 GUI 库,但实际上,除非您已经熟悉它们,否则要真正了解它们如何在如此低的级别上工作是一项相当复杂的任务。目前正在研究 GWEN,这正是我所追求的,但要掌握正在发生的事情并不完全容易。
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多