[Nuklear](https://github.com/Immediate-Mode-UI/Nuklear) -- небольшая кроссплатформенная библиотека для создания графических пользовательских интерфейсов (GUI), которую можно использовать в разных ОС (Windows, Linux), графических системах (GDI, GDI+, DirectX, OpenGL, X11) или совместно с кроссплатформенными графическими библиотеками (Allegro, SDL, SFML, GLFW).
Основная идея библиотеки -- вызовы функций для элементов GUI формируют изображение из графических примитивов nuklear, которые затем рисуются в окне приложения с помощью функций используемой базовой графической системы или библиотеки.
### GDI
Перед началом работы необходимо создать окно приложения и контекст nuklear, используя функции выбранной графической библиотеки, далее выполняется цикл, пока приложение не будет закрыто, а после цикла освобождаются используемые ресурсы и работа завершается. Следующий пример использует GDI в качестве базовой графической системы.
```c
#include "nuklear.h"
#include "nuklear_gdi.h"
int main()
{ nkgdi_window_init(); // инициализация
nkgdi_window_create("Calc", nk_rect(10,10,500, 500), // создание окна Windows
(nkgdi_params){.title="Калькулятор",.on_draw=draw_calc,
.flags=NK_WINDOW_TITLE|NK_WINDOW_SCALABLE|NK_WINDOW_CLOSABLE});
while (nkgdi_window_update()); // обновление, пока все окна не будут закрыты
nkgdi_window_shutdown(); // освобождение ресурсов
}
```
Можно создать несколько окон Windows.
При создании окна необходимо указать уникальное имя, размеры и параметры, указывая значения для полей структуры nkgdi_params.
Поле|Назначение
--|--
.flags|флаги окна -- будут рассмотрены в разделе "Окна"
.on_draw|функция рисования -- должна иметь заголовок вида ``int draw_func(struct nk_context *ctx)``,\
в качестве аргумента функция получает контекст и должна вернуть 0, если окно нужно закрыть, или 1 для продолжения работы
.on_close|функция обработки нажатия X -- должна вернуть 1, если окно можно закрыть, или 0.
.timer|интервал принудительного обновления окна в миллисекундах,\
по умолчанию обновление (вызов функции on_draw) происходит при взаимодействии с окном
.title|заголовок окна, при отсутствии используется имя
.font_name|имя шрифта -- по умолчанию Arial
.font_size|размер шрифта -- по умолчанию 16
.theme|цветовая схема 0 (по умолчанию), NK_THEME_WHITE, NK_THEME_RED, NK_THEME_BLUE, NK_THEME_DARK
.bg_color|фоновый цвет окна -- по умолчанию nk_rgb(0,0,0)
.bg_image|фоновая картинка -- по умолчанию фоновый цвет, для прозрачных окон изменить в цветовой схеме NK_COLOR_WINDOW на nk_rgba(0,0,0,0)
После инициализации можно загрузить картинки и создать вспомогательные шрифты.
*Внимание!* Эти действия нужно выполнять до цикла обновления, а не в функции рисования.
```
// глобальные переменные
struct nk_user_font *times40_font;
struct nk_image pic;
int draw_calc(struct nk_context *ctx)
{ // рисование
...
return 1;
}
int main()
{
// инициализация и создание окон
...
nkgdi_load_image(&pic,"pic.bmp"); // загрузка картинки
times40_font=nkgdi_font_create("Times New Roman",40); // создание шрифта
nuklear допускает использование UTF8, для включения нужно установить глобальную
переменную nk_utf_mode в 1 перед инициализацией. Также нужно выбрать кодировку UTF8 в SciTE.
### winBGIm
При использовании winBGIm основной цикл отличается