Графика на C++
Konstantin
Рано или поздно почти каждому программисту надоедает писать консольные приложения, состоящие сугубо из текста, ведь иногда хочется просто нажать на кнопку, а не писать комманду с кучей аргументов, да и приложения с GUI (Graphical User Interface - графический пользовательский интерфейс) выглядят более экономически выгодными.
Я постарался собрать для вас наиболее полный список графических библиотек для C++ и подробнее рассказать о каждой из них.
NCurces

Начнем с наиболее простого, и не далеко отходящего от исходного. NCurces - псевдографическая библиотека для создания интерфейса при работе с терминалом.
Данная библиотека особенно активно используется в Linux, тк там без терминала никуда. На ее основе построны такие утилиты, как nano, cfdisk и многие-многие другие.
Сама библиотека написана на C для C, но тем не менее имеет огромное количество портов на другие языки. Она достаточно легкая, но требует особо терминала, способного отображать ее графические элементы (командная строка Windows в эту категорию не в ходит), что может быть проблемой при использовании в ОС от Microsoft (для отображения NCurces в данных системах вы можете использовать ConEmu).
Раньше эта библиотека была очень популярна, но сейчас используется все реже и реже. Она не сложна в изучении и относительно удобна в использовании.
Если вы заинтересовались, то вот несколько ссылок :
- https://code-live.ru/post/cpp-ncurses-hello-world/
- http://www.cs.ukzn.ac.za/~hughm/os/notes/ncurses.html
- https://en.wikipedia.org/wiki/Ncurses?wprov=sfla1
VCL (Visual Components Library)

Раз уж мы начали с наиболее старых библиотек, то ими и продолжим. Разработкой данного продукта когда-то занималась Borland, но на данный момент этой компании уже не существует, и проект скорее всего больше не развивается.
Она шла в комплекте с IDE для C++ Turbo C++ и в составе с Delphi. Предоставлялся удобный инструмент для создания GUI при помощи мыши и очень обширная библиотека с кучей возможностей.
Когда-то была достаточно популярна, и про нее даже написали книгу для обучения детей программированию на C++, но к сожалению, проект был недостаточно способен к конкуренции, и другие библиотеки практически вытеснили его с рынка.
Сейчас это вам скорее всего не пригодится, но вот ссылочки :
- http://www.functionx.com/cppbcb/Lesson22.htm
- https://en.wikipedia.org/wiki/Visual_Component_Library?wprov=sfla1
SDL2

Продолжим с чего-то более простого. SDL - ориентируется на создание простых инди-игр и не предоставляет элементы пользовательского интерфейса в своем составе (В ней нет кнопок, полей для ввода текста и тд).
Она предназначена для управления простыми фигурами (элипс, прямоуголник и тому подобные), а также работы со спрайтами и текстурами. В нее также включена возможность работы со звуком и создания многопоточных приложений, а также имеется возможность работы с OpenGL, что делает ее способной практически на все.
Это очень мощная библиотека (на ней написан Postal), написанная на C, что отдаляет ее на второй план, если вы специализируетесь на C++. Также стоить отметить, что SDL активно развивается, и поддерживает огромное количество платформ(включая Android и IOS)
И как всегда ссылочки :
- https://habr.com/ru/post/198600/
- https://www.libsdl.org/download-2.0.php
- https://en.wikipedia.org/wiki/Simple_DirectMedia_Layer
SFML

SFML также является библиотекой для создания игр, но в отличии от SDL она написана на C++ и использует классы вместо структур, что делает ее более удобной для наследования.
Она действительно очень легка в изучении и использовании. Также поддерживает работу со звуком(но не в MP3 формате), многопоточностью и OpenGL. Доступна На достаточно большом количестве платформ, но все же уступает в этом SDL. Поддержка Android только в планах, а в Linux она работает только с X11, просто игнорируя Wayland.
Что касается ее разработки, то последний релиз состоялся в 2018 году, а GitHub репозиторий не очень уж и активный, но тем не менне я думаю беспокоится не из-за чего.
Полезные ссылки :
- https://www.sfml-dev.org/
- https://ravesli.com/graficheskaya-biblioteka-sfml-vstuplenie-i-ustanovka/
- https://ru.wikipedia.org/wiki/SFML
ClanLIB

Раз уж мы заговорили про игры, то обсудим еще 3 связанные с ними библиотеки, первая из которых - ClanLIB. Написанная на C++ полностью объектно-ориентированная библиотека для создания 2D и 3D игр(не является движком).
Она использует OpenGL для отрисовки всего, чего только можно. Также у нее есть одна очень приятная особенность - она сама по себе линкуется статически, что позволяет не таскать за собой кучу дополнительных библиотек.
На данный момент, проект, как и его сайт, скорее всего мертв и больше не развивается. Тем не менее его было необходимо упомянуть в данном списке.
Ссылки :
- https://gcup.ru/load/gamedev_lib/clanlib_sdk/18-1-0-1512
- https://github.com/sphair/ClanLib
- https://ru.wikipedia.org/wiki/ClanLib
Allegro

На очереди еще одна библиотека для разработки игр(Их много, это ведь C++). Написана она на C, и на данный момент продолжает развиваться.
Библиотека предоставляет огромный спектр возможностей и дополняется модулями, которые пишут ее пользователи (лучшие включаются в релизы).
Не буду много рассказывать, сразу к ссылочкам :
CEGUI

Это очень нестандартная библиотек, опять же для разработки игр. Она дает возможность не только работать с простыми фигурами и спрайтами, но и такими элементами пользовательского интерфейса, как кнопки, полосы прокрутки и тд.
На данный момент находится в разработке, а релиза 1.x.x еще не было.
Проект подает очень больше надежды, надеемся на его дальнейшее развитие :
wxWidgets

Наиболее старая C++ библиотека для создания пользовательского интерфейса из кнопочек, списков и тому подобного. Написана на C++ и также Perl и Python. Имеет много портов для других языков.
Главным плюсом этой библиотеки когда-то было использование системный элементов (виджеты, встроенные в систему), а не создание своих собственных, но сейчас это делает большинство библиотек.
Данная библиотека также подтягивает за собой огромное количество возможностей и функций для работы с системой и многим чем еще(с принтерами, текстовыми документами и кучей всего еще).
Подробнее здесь :
Gtk+ / gtkmm

С этими библиотека всегда возникает какая-то путанница. Давайте расставим все на места.
GTK+ - написанная на C библиотека для создания GUI. Вы можете использовать ее в C++, но она не дает вам возможности наследования, тем не менее знать ее желательно даже если вы используете gtkmm.
gtkmm - обертка на C++ для Gtk+. Она дает вам возможность использовать умные указатели, наследование и много чего еще, но она не полна. Некоторые виджеты могу быть не обернуты, но это не страшно, ведь gtkmm поддерживает смешивание API с Gtk+ при помощи специальных функций.
Основная особенность этих библиотек - они используют другие библиотеки для выполниния своей работы(ATK, pango, cairo, GLib).
Библиотеки вполне удобны, но работать с ними в Windows иногда бывает тяжеловато. Для конструирования пользовательского интерфейса существует специальный инструмент - Glade.
! gtkmm очень схож с Qt, который мы обсудим далее, но для него не нужен moc (meta-object compiler - мета-объектный компилятор), и gtkmm использует STL, а не собственные библиотеки для работы с контейнерами.
Ссылки :
Qt

Еще один очень популярный инструмент для разработки графических приложений на C++. Он достаточно старый, и появился еще до создания стандартной библиотеки (Я имею в виду STL), поэтому в своем составе имеет реализацию многих контейнеров и других классов, которые сейчас входят в язык, что делает его громоздким.
Так же данный инструмент требует использования moc(Meta Object Compiler), чтобы реализовать сигналы и слоты. Данная библиотека предоставляется в комплекте с очень удобной и мощной IDE, со встроенным редактором графического интерфейса.
Данный инструмент дает уйму возможностей и поддерживает достаточное количество платформ(в том числе Android). Так же это фраймворк с наибольшим количеством документации на русском.
Ссылочки :
- https://www.qt.io/
- https://ru.wikipedia.org/wiki/Qt
- https://www.ibm.com/developerworks/ru/library/l-qt_1/
JUCE

Еще один очень интересный фрэймворк для работы с GUI. Данный фрэймворк написан на C++ и предоставляется вместе со средой разработки Jucer(Но может работать и вне ее).
Данная библиотека очень полюбилась программистам, пишущим ПО для работы со звуком, ведь у JUCE обширные возможности в этом плане. Его часто используют для написания звуковых плагинов.
Документация к этой библиотеке есть только на английском!
WinAPI / MFC

Эта библиотеки, которые предоставляет Microsoft для создания приложений для Windows. Они являются единственными в этом списке, которые привязаны лишь к одной платформе.
По-моему мнению, они - страшные. Непонятные названия типов данных, возможность компиялции только для одной системы. К сожалению, я был обязан ее упомянуть.
Если вам ВДРУГ это необходимо :
FLTK

Если вы думали, что я закончил свой расказ, то не тут то было. Вот вам еще одно маленькое чудо. Данная библиотека очень маленькая, она используют только свои виджеты, отрисовывает их OpenGLом и линкуется статически.
Она отлично подходит для создания миниатюрных приложений, но имеет ряд недостатков : относительно бедная коллекция виджетов (по сравнению с другими), нет возможности придать вид, как у приложений в системе.
Ссылки на FLTK :
FoxToolkit

Продолжаем рассказывать про маленькие библиотеки. Небольшая, но очень быстрая библиотека, имеющая в своем составе много виджетов и поддержку OpenGL.
В наших краях используется редко, поэтому и сказать нечего :
Nana C++

Еще одна библиотека, только набирающая обороты, написанная на C++ и работающая только для него. На данный момент есть поддержка Windows и Linux. Библиотека все еще достаточно активно разрабатывается.
Попробуйте :
- http://nanapro.org/en-us/
- https://en.wikipedia.org/wiki/Nana_(C%2B%2B_library)
- https://qpcr4vir.github.io/nana-doxy/html/db/d9a/helloword_quit_8cpp-example.html
Ultimate++

Еще одна крутая библиотека. Она поддерживает не только работу с пользовательским интерфейсом, но и платформонезависмые сокеты, свои формат текстовых записей(для форматированного отображения).
Она легкая и по весу и в плане изучения, активно развивается. На данный момент есть поддержка всех основных PC платформ, планируется поддержка Android.
Из минусов - наблюдаются проблемы с кириллицей :
- https://www.ultimatepp.org/
- https://ru.wikipedia.org/wiki/Ultimate%2B%2B
- https://habr.com/ru/post/194590/
Что-то сложнее



Есди вы работаете с 3D моделями, то вам просто необходимо что-то из этого. Картнки расположены в порядке приоритетности APi.
OpenGL поддерживается большинством вышеописанных библиотек и используется чаще всего. На него много документации (в том числе и на русском)
Vulkan пока еще только развивается, и как его использвать - до конца не ясно, но тем не менее этот APi имеет большие амбиции
DirectX - то, что предоставляет Microsoft. Не рекомендую, тк работает только под одной платформой, и портировать приложение с ним придется долго и упорно.
Ссылки :
- https://ru.wikipedia.org/wiki/OpenGL
- https://ru.wikipedia.org/wiki/Vulkan_(API)
- https://ru.wikipedia.org/wiki/DirectX
Заключение
В данной статье было рассмотрено большое количество библиотек и фрэймворков, но упомянуты не все. Некоторые из них я счел слишком старыми, а некоторые я решил не указывать (например игровые движки : Cocos-2Dx, UE4, Cryengine).
Надеюсь статья была полезной!
Понравилась статья? Подписывайся на мой канал : https://t.me/konstantIMP30z