Nuklear
这是一个用ANSI C编写并以公共领域许可的最小状态、即时模式图形用户界面工具包。它被设计为一个简单的可嵌入应用程序用户界面,没有任何依赖项、默认渲染后端或操作系统窗口/输入处理,而是提供了一种高度模块化、基于库的方法,使用简单的输入状态作为输入,并使用描述基本形状的绘制命令作为输出。因此,它不是提供一个试图抽象多个平台和渲染后端的分层库,而是只专注于实际的UI。
特性
- 即时模式图形用户界面工具包
- 单头文件库
- 用C89(ANSI C)编写
- 代码库小(约18千行代码)
- 注重可移植性、效率和简洁性
- 无依赖(如果不需要甚至不依赖标准库)
- 完全可定制外观和自定义
- 低内存占用,如需要/需求可完全控制内存使用
- UTF-8支持
- 无全局或隐藏状态
- 可定制的库模块(你可以只编译和使用需要的部分)
- 可选的字体烘焙器和顶点缓冲输出
- 文档
构建
这个库是自包含在一个单独的头文件中,可以以头文件模式或实现模式使用。默认情况下使用头文件模式,允许在其他头文件中包含这个头文件,并且不包含实际实现。
实现模式需要在包含此文件的一个.c/.cpp文件中定义预处理器宏NK_IMPLEMENTATION
,例如:
#define NK_IMPLEMENTATION
#include "nuklear.h"
重要:每次包含"nuklear.h"时,你都必须定义相同的可选标志。这非常重要;不这样做要么会导致编译器错误,要么更糟糕的是堆栈损坏。
画廊
[图片]
示例
/* 初始化GUI状态 */
struct nk_context ctx;
nk_init_fixed(&ctx, calloc(1, MAX_MEMORY), MAX_MEMORY, &font);
enum {EASY, HARD};
static int op = EASY;
static float value = 0.6f;
static int i = 20;
if (nk_begin(&ctx, "Show", nk_rect(50, 50, 220, 220),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) {
/* 固定像素宽度的小部件 */
nk_layout_row_static(&ctx, 30, 80, 1);
if (nk_button_label(&ctx, "button")) {
/* 事件处理 */
}
/* 固定窗口比例宽度的小部件 */
nk_layout_row_dynamic(&ctx, 30, 2);
if (nk_option_label(&ctx, "easy", op == EASY)) op = EASY;
if (nk_option_label(&ctx, "hard", op == HARD)) op = HARD;
/* 自定义像素宽度的小部件 */
nk_layout_row_begin(&ctx, NK_STATIC, 30, 2);
{
nk_layout_row_push(&ctx, 50);
nk_label(&ctx, "Volume:", NK_TEXT_LEFT);
nk_layout_row_push(&ctx, 110);
nk_slider_float(&ctx, 0, &value, 1.0f, 0.1f);
}
nk_layout_row_end(&ctx);
}
nk_end(&ctx);
[示例图片]
绑定
其他作者为不同语言创建了许多Nuklear绑定。由于我不一定精通这些语言,所以我无法保证它们的质量。此外,也不能保证所有绑定都会始终保持最新:
[绑定列表]
致谢
由Micha Mettke开发,以及GitHub上的每一位直接或间接贡献者。
嵌入了Sean Barrett的stb_texedit
、stb_truetype
和stb_rectpack
(公共领域)
嵌入了Tristan Grimmer的ProggyClean.ttf
字体(MIT许可)。
非常感谢Omar Cornut (ocornut@github)的imgui库,它给了我这个库的灵感,感谢Casey Muratori的手工英雄和他原创的即时模式图形用户界面理念,以及Sean Barrett令人惊叹的单头文件库,它恢复了我对库的信心,并促使我创建了一些自己的库。最后感谢Apoorva Joshi的单头文件打包器。
许可证
[许可证内容]
审核指南
在审核拉取请求时,审核者应该牢记一些常见事项。
审核src/*
和nuklear.h
的变更:
[审核指南内容]
审核demo/*
、example/*
和仓库中其他文件的变更:
[审核指南内容]