如何制作GUI?

时间:2008-08-11 02:50:09

标签: c++ user-interface

我已经为Nintendo DS制作了许多不同的GUI系统部分,比如按钮,文本框和选择框,但是我需要一种在一个Gui类中包含这些类的方法,这样我就可以将所有内容都绘制到一次屏幕,并立即检查所有按钮,检查是否有任何按钮。我的问题是,将所有类(例如按钮和文本框)组织到一个GUI类中的最佳方法是什么?

这是我想到的一种方式,但似乎不对:

编辑:我正在使用C ++。

class Gui {
    public:
        void update_all();
        void draw_all() const;
        int add_button(Button *button); // Returns button id
        void remove_button(int button_id);
    private:
        Button *buttons[10];
        int num_buttons;
}

这段代码有一些问题,但我只是想让你知道我想要什么。

5 个答案:

答案 0 :(得分:3)

对于任何有兴趣的人,这是我的DS开源,BSD许可的GUI工具包:

http://www.sourceforge.net/projects/woopsi

thing2k的答案非常好,但我认真地建议让代码在基础uiElement类中包含子UI元素。这就是我在Woopsi所遵循的模式。

如果在基类中支持此功能,当您尝试实现比文本框和按钮更复杂的任何内容时,您将遇到重大问题。例如:

  • 标签栏可以建模为多个按钮组合在一起形成单个父UI元素,强制选择互斥;
  • 单选按钮组(同上);
  • 滚动条可以表示为滑块/装订线元素和向上/向下按钮;
  • 滚动列表可以表示为容器和多个选项UI元素。

此外,值得记住的是DS具有66MHz的CPU和4MB的RAM,用于存储程序并执行它(DS ROM在运行之前加载到RAM中)。您应该将其视为嵌入式系统,这意味着STL已经淘汰。我从Woopsi中删除了STL,并设法节省了0.5MB。桌面标准不是很多,但这是STL垃圾消耗的DS总可用内存的1/8。

我详细介绍了在我的博客上编写UI的整个过程:

http://ant.simianzombie.com/blog

它包括我为重绘屏幕提出的两种算法的描述,这是创建GUI的最棘手的部分(一个只是分割矩形并记住可见区域;另一个使用BSP树,效率更高) ,更容易理解),优化技巧等。

答案 1 :(得分:2)

这个问题与我要发布的问题非常类似,只有我的索尼PSP编程。

我已经玩弄了一段时间,我已经查阅了一些书籍VTMs,到目前为止,这是一个简单的ui系统的粗略概念。

class uiElement()
{
    ...
    virtual void Update() = 0;
    virtual void Draw() = 0;
    ...
}

class uiButton() public : uiElement
{
    ...
    virtual void Update();
    virtual void Draw();
    ...
}

class uiTextbox() public : uiElement
{
    ...
    virtual void Update();
    virtual void Draw();
    ...
}

... // Other ui Elements

class uiWindow()
{
    ...
    void Update();
    void Draw();

    void AddElement(uiElement *Element);
    void RemoveElement(uiElement *Element);

    std::list <uiElement*> Elements;

    ...
}

void uiWindow::Update()
{
    ...
    for (list <uiElement*>::iterator it = Elements.begin(); it != Elements.end(); it++ )
        it->Update();
    ...
}

void uiWindow::Draw()
{
    ...
    for (list <uiElement*>::iterator it = Elements.begin(); it != Elements.end(); it++ )
        it->Draw();
    ...
}

原则是创建一个窗口并获取ui Elements,并从相应的主函数中调用draw和update方法。

我还没有任何工作,因为我有绘图代码的问题。在PC和PSP上使用不同的API,我正在寻找一些OpenGL和psp gu的包装代码。

希望这有帮助。

thing2k

答案 2 :(得分:0)

要记住的一个有用策略可能是composite pattern。在较低级别,它可能允许您在构建后更容易地处理所有GUI对象(和对象集合)。但是我不知道GUI框架设计涉及什么,所以找到一般灵感的地方就是现有项目的源代码。 WxWidgets是一个跨平台的GUI框架,可以使用源代码。祝你的项目好运!

答案 3 :(得分:0)

我认为看看其他GUI工具包的工作方式将是一个很好的起点。对于C ++示例,我听到了许多有关Qt的好消息。我个人没有亲自使用它。当然还有尼克提到的WxWidgets。

答案 4 :(得分:0)

我写了一个非常简单的GUI,就像你提出的那样。我在Windows,Linux和Macintosh上运行它。它应该相对容易地移植到任何系统,如PSP或DS。

它是开源的,LGPL并且在这里:

http://code.google.com/p/kgui/