Как мне создать графический интерфейс?

#c #user-interface

Вопрос:

Я создал много разных отдельных частей системы графического интерфейса для Nintendo DS, таких как кнопки, текстовые поля и поля выбора, но мне нужен способ объединить эти классы в один класс графического интерфейса, чтобы я мог сразу вывести все на экран и проверить все кнопки сразу, чтобы проверить, нажимаются ли какие-либо из них. Мой вопрос в том, как лучше всего организовать все классы (такие как кнопки и текстовые поля) в один класс графического интерфейса?

Вот один из способов, о котором я думал, но он кажется неправильным:

Правка: Я использую 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;
}
 

В этом коде есть несколько проблем, но я просто хотел дать вам представление о том, чего я хочу.

Комментарии:

1. Возможно, вы захотите рассмотреть метод графического интерфейса немедленного режима для этой конкретной платформы.

2. Исправьте свое название, чтобы быть более конкретным, пожалуйста. Это звучит как вопрос «помогите вампиру» («Как мне создать форум?»), Хотя, если вы прочитали вопрос, он немного более конкретный.

Ответ №1:

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

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

 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.

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

штучка2к

Ответ №2:

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

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

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

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

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

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

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

http://ant.simianzombie.com/blog

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

Комментарии:

1. Да, я слышал о Вупси, я посмотрю на него поближе. Также спасибо за ссылку на ваш блог, это выглядит интересно 🙂

Ответ №3:

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

Ответ №4:

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

Комментарии:

1. Он попросил помощи в том, как создать библиотеку графического интерфейса для Nintendo ds. Я не думаю, что qt и wxwidget могут поддерживать консоль, подобную ds 😂

Ответ №5:

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

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

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