Как мне сделать графический интерфейс? - PullRequest
6 голосов
/ 11 августа 2008

Я сделал много разных отдельных частей системы графического интерфейса для Nintendo DS, таких как кнопки и текстовые поля и поля выбора, но мне нужен способ объединить эти классы в один класс 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 ]

3 голосов
/ 10 октября 2008

Для всех, кто заинтересован, вот мой открытый исходный код, лицензированный BSD инструментарий GUI для DS:

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

Ответ thing2k довольно хороший, но я бы настоятельно рекомендовал иметь код, содержащий дочерние элементы пользовательского интерфейса в базовом классе uiElement. Это образец, которому я следовал в Woopsi.

Если вы не поддерживаете это в базовом классе, вы столкнетесь с серьезными проблемами при попытке реализовать что-то более сложное, чем текстовое поле и кнопка. Например:

  • Панели вкладок можно смоделировать как несколько кнопок, сгруппированных в один родительский элемент пользовательского интерфейса, который обеспечивает взаимную исключительность выбора;
  • Группы радиокнопок (то же самое);
  • Полосы прокрутки можно представить в виде элемента ползунка / желоба и кнопок вверх / вниз;
  • Прокрутка списков может быть представлена ​​в виде контейнера и нескольких элементов пользовательского интерфейса.

Кроме того, стоит помнить, что DS имеет 66 МГц ЦП и 4 МБ ОЗУ, которые используются как для хранения вашей программы, так и для ее выполнения (ПЗУ DS загружаются в ОЗУ перед запуском). Вы должны действительно рассматривать это как встроенную систему, что означает, что STL отсутствует. Я удалил STL из Woopsi и сумел сэкономить 0.5MB. По настольным стандартам не так много, но это 1/8 от общей доступной памяти DS, используемой STL-мусором.

Я подробно описал весь процесс написания пользовательского интерфейса в своем блоге:

http://ant.simianzombie.com/blog

Он включает описание двух алгоритмов, которые я придумал для перерисовки экрана, что является самой сложной частью создания графического интерфейса пользователя (один просто разбивает прямоугольники и запоминает видимые области; другой использует деревья BSP, что гораздо эффективнее и легче понять), советы по оптимизации и т. д.

2 голосов
/ 17 августа 2008

Этот вопрос очень похож на тот, который я собирался опубликовать, только мой вопрос касается программирования Sony PSP.

Я какое-то время играл с чем-то, я консультировался с некоторыми книгами и VTM , и до сих пор это грубая идея простых систем пользовательского интерфейса.

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();
    ...
}

Принцип состоит в том, чтобы создать окно и привязать к нему элементы пользовательского интерфейса, а также вызвать методы рисования и обновления из соответствующих основных функций.

У меня пока ничего не работает, так как у меня проблемы с отрисовкой кода. С различными API на ПК и PSP, я смотрю на некоторый код оболочки для OpenGL и psp gu.

Надеюсь, это поможет.

thing2k

0 голосов
/ 17 сентября 2008

Я написал очень простой графический интерфейс, как вы предлагаете. У меня это работает на Windows, Linux и Macintosh. Он должен относительно легко переноситься на любую систему, такую ​​как PSP или DS.

Он с открытым исходным кодом, LGPL и здесь:

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

0 голосов
/ 11 августа 2008

Я думаю, что если посмотреть на то, как это делают другие наборы инструментов с графическим интерфейсом, это было бы отличным местом для начала. Для примеров на C ++ я слышал много хорошего о Qt . Я не использовал это лично все же. И конечно WxWidgets, как упомянул Ник.

0 голосов
/ 11 августа 2008

Следует помнить одну полезную стратегию - составной шаблон . На низком уровне это может позволить вам легче обрабатывать все объекты GUI (и наборы объектов) после сборки. Но я понятия не имею, что вовлечено в проектирование структуры GUI, поэтому одно место, где можно найти общее вдохновение, это исходный код существующего проекта. WxWidgets - это кроссплатформенная инфраструктура графического интерфейса с доступным исходным кодом. Удачи в вашем проекте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...