С++ custom UI ToolKit - Опции для уровня абстракции кросс-платформы

Являясь поклонником кросс-платформенного текстового редактора Sublime Text 2, я делал некоторые исследования того, как он был разработан. Разработчик отметил, что он 99% С++ с некоторыми GTK для Linux и что он использует пользовательский инструментарий UI, который он называет "Sublime GUI". Это цитата из dev

В Sublime Text 2 используется собственный набор инструментов пользовательского интерфейса. Есть много приложений, где это может не иметь смысла, но это не такой необоснованный выбор для Sublime Text, где я всегда знал, что многие элементы пользовательского интерфейса должны быть настроены независимо от инструментария (например, текстовое управление и элементы управления вкладками). Инструментарий UI находится поверх слоя абстракции кросс-платформы, что является скорее объединением функциональных возможностей платформы, а не самым низким общим знаменателем.

Мой вопрос в том, каковы некоторые возможности для уровня абстракции кросс-платформы? Я предполагаю, что это на более низком уровне, чем GTK, QT, SDL. Я пытаюсь понять, как создать пользовательский инструментарий UI, который будет кросс-платформой, и только один раз будет писать код.

Я ценю преимущества UI Toolkit, но если я хочу, чтобы мои руки были грязными и поддерживали мое приложение в Windows, Linux, Mac, я не уверен, с чего начать.

2 ответа

Есть много инструментов GUI, которые работают на платформе (Tk, QT и GTK, чтобы назвать несколько)

Если бы вы хотели написать свой собственный, то он не должен был быть инструментами более низкого уровня, чем GTK, QT или подобным.

Вы можете открыть интерфейс, подобный этому

void draw_window(mywindow *mw, char *name){
 non platform specific code goes here (maybe arg parsing, etc.)
#IFDEF windows
 windows specific code goes here
#ENDIF
#IFDEF macosx
 mac specific code goes here
#ENDIF
#IFDEF linux
 linux specific code goes here
#ENDIF
 non platform specific code goes here (tidying up, recording state, etc.)
}

В рамках каждой из разделов, относящихся к платформе, вы можете отправить в набор инструментов gui для этой платформы или использовать любой доступный интерфейс (например, X11 для Unix).

При компиляции кода, который вы указываете целевую платформу, и это определяет, какие секции IFDEF будут скомпилированы.

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


Я думаю, самый важный вопрос - как рисовать и получать события клавиатуры и мыши.

Как я вижу, для рисования есть два подхода:

  • Создайте контекст OpenGL и нарисуйте свои виджеты с помощью OpenGL. Как glui.
  • Используйте собственную инфраструктуру рисования. Как GDI + на окнах, XLib на X11.

Конечно, вам нужно будет реализовать определенные вещи для каждой платформы. С OpenGL вам нужно написать обработку контекста (WGL, GLX,..) для каждой платформы, тогда как с собственной инфраструктурой рисования вам потребуется гораздо больше работы. Поскольку все рисованные инфраструктуры уникальны, вы, вероятно, захотите написать абстракцию для чертежа, а затем реализовать свои виджеты с помощью уровня абстракции рисунка.

Что касается обработки событий, я думаю, вам также потребуется написать собственную абстракцию, потому что обработка событий уникальна для каждой платформы.

Наконец, у вас также должен быть слой абстракции для создания главного окна, в котором вы рисуете свои виджеты и из которого вы получаете события.

При работе с OpenGL вы можете начать с glut, который уже обрабатывает создание окон и обработку событий.

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

licensed under cc by-sa 3.0 with attribution.