`raygui` - Когда нужен GUI, а времени нет
Знакомая ситуация? Вы разрабатываете крутую игру или сложное приложение, и вдруг понимаете: для отладки, настройки параметров или просто для удобства работы с данными вам нужна небольшая утилита. Нечто с кнопками, полями ввода, слайдерами. И вот тут начинается головная боль: тащить тяжеловесные фреймворки вроде Qt или Electron ради пары десятков контролов кажется избыточным. А писать всё с нуля на чистом OpenGL или DirectX — это вообще отдельный проект. Что же делать?
В такие моменты на помощь приходят библиотеки вроде raygui. Сегодня мы поговорим о проекте, который позволяет быстро и без лишних заморочек добавить графический интерфейс в ваши C/C++ приложения, особенно если вы уже работаете с raylib.
Что такое raygui и кому он пригодится?
raygui — это легковесная библиотека для создания графических интерфейсов (GUI) в так называемом "немедленном режиме" (Immediate-Mode GUI, IMGUI). Она родилась как вспомогательный модуль для популярной игровой библиотеки raylib, переняв её философию простоты и прямолинейности. Представьте себе: никаких сложных систем виджетов, никаких деревьев объектов, никаких замысловатых циклов обработки событий. Просто вызываете функцию, и она рисует кнопку. Если кнопка нажата, функция возвращает true. Всё!
Кому это нужно? В первую очередь, разработчикам, которые создают:
- Инструменты и утилиты: Редакторы уровней, редакторы данных, конфигураторы, отладочные панели для игр или приложений.
- Прототипы: Быстро набросать интерфейс для проверки идеи.
- Образовательные проекты: Изучить основы GUI без погружения в дебри фреймворков.
Если вы цените скорость разработки, минимализм и контроль над происходящим, raygui может стать вашим верным помощником.

Immediate-Mode GUI: В чем фишка?
Чтобы понять прелесть raygui, стоит разобраться в концепции IMGUI. В отличие от традиционных "режимных" (Retained Mode) GUI-библиотек (вроде Qt, WinForms), где вы создаете объекты виджетов, добавляете их в дерево, а потом система сама их отрисовывает и обрабатывает события, IMGUI работает по-другому:
Каждый кадр вы заново описываете весь свой интерфейс.
- Хотите кнопку? Вызываете
GuiButton(). - Нужен слайдер? Вызываете
GuiSlider().
Функция отрисовывает элемент и сразу же возвращает его состояние (например, была ли нажата кнопка). Это делает код невероятно простым и предсказуемым. Нет состояния, которое нужно где-то хранить, нет сложных колбэков. Вы буквально "рисуете" интерфейс в каждом кадре, и он реагирует на ввод. Это особенно удобно для игровых движков и инструментов, где цикл отрисовки уже и так работает каждый кадр.
Ключевые возможности raygui: Простота и функциональность
Несмотря на свою простоту, raygui далеко не примитивен. Он предлагает набор фич, которые делают его удивительно удобным для создания полноценных утилит.
1. Богатый набор контролов: От кнопок до цветовых палитр
raygui предоставляет более 25 различных элементов управления, покрывающих большинство потребностей при создании инструментов. Здесь есть всё, что нужно:
- Базовые:
Label,Button,CheckBox,TextBox,Slider,ProgressBar. - Контейнеры:
WindowBox,GroupBox,Line,Panel,ScrollPanel,TabBar. - Продвинутые:
ListView,ColorPicker,MessageBox,TextInputBox.
Представьте, что вы делаете редактор уровней. Вам нужны кнопки для сохранения/загрузки, слайдеры для настройки параметров объектов, текстовые поля для ввода имен, списки для выбора текстур и даже ColorPicker для настройки цвета освещения. raygui предоставляет это из коробки!
Вот как выглядит простейший пример с кнопкой и сообщением:
#include "raylib.h"
#define RAYGUI_IMPLEMENTATION
#include "raygui.h"
int main()
{
InitWindow(400, 200, "raygui - controls test suite");
SetTargetFPS(60);
bool showMessageBox = false;
while (!WindowShouldClose())
{
BeginDrawing();
ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
if (GuiButton((Rectangle){ 24, 24, 120, 30 }, "#191#Show Message")) showMessageBox = true;
if (showMessageBox)
{
int result = GuiMessageBox((Rectangle){ 85, 70, 250, 100 },
"#191#Message Box", "Hi! This is a message!", "Nice;Cool");
if (result >= 0) showMessageBox = false;
}
EndDrawing();
}
CloseWindow();
return 0;
}
Согласитесь, код читается как открытая книга!
2. Гибкая система стилизации: Настраиваем под себя
Стандартный вид raygui — это минималистичный, но приятный глазу стиль raylib. Однако, если вам нужно что-то своё, raygui не ограничивает. Вы можете легко настроить цвета, шрифты и метрики для каждого контрола.
Библиотека поставляется с несколькими предустановленными стилями:

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

3. Встроенная поддержка иконок: Делаем интерфейс информативнее
Мелкие, но важные детали делают интерфейс удобнее. raygui поставляется со встроенным набором из 256 монохромных иконок размером 16x16 пикселей. Их можно легко вставлять в текст кнопок или меток, просто указывая ID иконки.
Например, #05#Open Image добавит иконку открытия файла перед текстом. А для более читаемого кода можно использовать GuiIconText(RICON_FILE_OPEN, "Open Image").
![]()
И, конечно же, есть инструмент rGuiIcons для просмотра и кастомизации этого набора иконок.
4. Комплекс инструментов для разработчика
raygui — это не только библиотека, но и целая экосистема. Помимо уже упомянутых rGuiStyler и rGuiIcons, есть ещё rGuiLayout — визуальный редактор для создания и размещения элементов интерфейса. Это значительно ускоряет процесс прототипирования и позволяет дизайнерам или менее техническим специалистам участвовать в создании макетов.

Технические детали: Как это работает под капотом?
raygui — это удивительно компактная библиотека. Она реализована как single-file header-only library. Это значит, что для её использования вам достаточно просто включить один файл raygui.h в ваш проект. Для компиляции реализации функций нужно лишь один раз определить макрос RAYGUI_IMPLEMENTATION перед включением raygui.h в одном из ваших .c или .cpp файлов. Это упрощает интеграцию до предела: скопировал файл — и готово!
Изначально raygui тесно связан с raylib и использует её графические примитивы для отрисовки. Однако, благодаря своей архитектуре, его можно адаптировать и для работы с другими графическими библиотеками/движками, что делает его довольно универсальным решением для быстрых GUI.
Практическое применение: Где raygui покажет себя лучше всего?
В моей практике часто возникает потребность в небольших, но функциональных утилитах. Например:
- Редактор конфигураций: Для игры или движка, где нужно настроить кучу параметров, от разрешения экрана до физических констант.
- Инструмент для работы с данными: Просмотр и редактирование таблиц, баз данных, ресурсов игры (например, инвентаря персонажа или характеристик предметов).
- Отладочные панели: Во время разработки игры или сложного алгоритма, очень удобно иметь на экране кнопки для переключения режимов, слайдеры для изменения скорости симуляции или текстовые поля для ввода команд.
- Простые графические редакторы: Для тайлсетов, спрайтов или даже простеньких векторных изображений.
raygui идеально подходит для всех этих сценариев, когда вам нужен быстрый, функциональный и легковесный интерфейс без оверхеда больших фреймворков.
Выводы: Стоит ли попробовать raygui?
Если вы C/C++ разработчик, особенно если вы уже знакомы с raylib или ищете максимально простой способ добавить GUI в свои инструменты, raygui — это находка. Он предлагает отличный баланс между простотой использования и функциональностью.
Кому особенно подойдет:
- Разработчикам игр, создающим вспомогательные инструменты.
- Инженерам, которым нужны быстрые утилиты для тестирования или отладки.
- Студентам и преподавателям для образовательных проектов.
- Всем, кто ценит минимализм, производительность и полный контроль над кодом.
Забудьте о часах, потраченных на изучение сложных систем виджетов. С raygui вы сможете сосредоточиться на логике вашего инструмента, а не на его внешнем виде. Попробуйте, и, возможно, raygui станет вашим новым любимым инструментом для создания GUI!
