Как мне сделать графический интерфейс?
Я сделал много разных отдельных частей системы графического интерфейса для Nintendo DS, таких как кнопки и текстовые поля и поля выбора, но мне нужен способ объединить эти классы в один класс 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 ответов
Этот вопрос очень похож на тот, который я собирался опубликовать, только мой вопрос касается программирования 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
Для всех, кто интересуется, вот мой открытый исходный код, BSD-лицензированный инструментарий GUI для 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, что гораздо эффективнее и проще для понимания. разбираться), советы по оптимизации и пр.
Я написал очень простой графический интерфейс, как вы предлагаете. У меня это работает на Windows, Linux и Macintosh. Он должен относительно легко переноситься на любую систему, такую как PSP или DS.
Это LGPL с открытым исходным кодом и здесь:
Я думаю, что если посмотреть на то, как это делают другие инструментарии GUI, это было бы отличным местом для начала. Для примеров C++ я слышал много хорошего о Qt. Я не использовал это лично все же. И конечно же WxWidgets, как упомянул Ник.
Одной из полезных стратегий, которую следует иметь в виду, может быть составная схема. На низком уровне это может позволить вам легче обрабатывать все объекты GUI (и коллекции объектов) после сборки. Но я понятия не имею, что вовлечено в проектирование структуры GUI, поэтому одно место, где можно найти общее вдохновение, это исходный код существующего проекта. WxWidgets - это кроссплатформенная инфраструктура с доступным исходным кодом. Удачи с вашим проектом!