Immediate-Mode-UI/Nuklear
GitHub: Immediate-Mode-UI/Nuklear
一个基于 ANSI C 的即时模式、无依赖跨平台 GUI 库,专注于极简、可嵌入与高可移植性。
Stars: 11064 | Forks: 673
# Nuklear
[](https://github.com/Immediate-Mode-UI/Nuklear/actions)
这是一个最小状态、即时模式图形用户界面工具包
使用 ANSI C 编写并以公共领域授权
它被设计为一个简单
可嵌入的用户界面用于应用程序,没有任何依赖项、
默认渲染后端或操作系统窗口/输入处理,而是提供一个
高度模块化、基于库的方法,具有简单的输入状态和
描述原始形状的绘制命令作为输出。因此,它不是提供一个
分层库试图抽象多个平台和
渲染后端,它只关注实际的 UI。
## 功能
- 即时模式图形用户界面工具包
- 单头文件库
- 使用 C89(ANSI C)编写
- 代码库小(约 18kLOC)
- 注重可移植性、效率和简洁性
- 无依赖(即使不想要标准库)
- 完全可定制
- 内存占用低,并在需要/想要时完全控制内存使用
- 支持 UTF-8
- 无全局或隐藏状态
- 可自定义的库模块(你可以只编译和使用你需要的部分)
- 可选的字体烘焙器和顶点缓冲输出
- [文档](https://Immediate-Mode-UI.github.io/Nuklear/)
## 构建
该库是自包含的单头文件,可以
以仅头文件模式或实现模式使用。仅头文件模式是默认的
在包含时启用,并允许将此头文件包含到其他头文件
中而不包含实际实现。
实现模式需要在 *一个* .c/.cpp 文件中定义预处理器宏
`NK_IMPLEMENTATION`,例如:
```
#define NK_IMPLEMENTATION
#include "nuklear.h"
```
重要:每次包含 "nuklear.h" 时都必须定义相同的可选标志。
这非常重要;不这样做会导致编译器错误,甚至更糟的是,堆栈损坏。
## 图库






## 示例
```
/* init gui state */
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)) {
/* fixed widget pixel width */
nk_layout_row_static(&ctx, 30, 80, 1);
if (nk_button_label(&ctx, "button")) {
/* event handling */
}
/* fixed widget window ratio width */
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;
/* custom widget pixel width */
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 绑定。
我无法证实它们的质量,因为我并不精通这些
语言。此外也不能保证所有绑定都会保持更新:
- [Java](https://github.com/glegris/nuklear4j) 由 Guillaume Legris
- [D](https://github.com/Timu5/bindbc-nuklear) 由 Mateusz Muszyński
- [Golang](https://github.com/golang-ui/nuklear) 由 golang-ui@github.com
- [Rust](https://github.com/snuk182/nuklear-rust) 由 snuk182@github.com
- [Chicken](https://github.com/wasamasa/nuklear) 由 wasamasa@github.com
- [Nim](https://github.com/zacharycarter/nuklear-nim) 由 zacharycarter@github.com
- Lua
- [LÖVE-Nuklear](https://github.com/keharriso/love-nuklear) 由 Kevin Harrison
- [MoonNuklear](https://github.com/stetre/moonnuklear) 由 Stefano Trettel
- Python
- [pyNuklear](https://github.com/billsix/pyNuklear) 由 William Emerison Six(基于 ctypes 的封装)
- [pynk](https://github.com/nathanrw/nuklear-cffi) 由 nathanrw@github.com(cffi 绑定)
- [CSharp/.NET](https://github.com/cartman300/NuklearDotNet) 由 cartman300@github.com
- [V](https://github.com/nsauzede/vnk) 由 Nicolas Sauzede
## 许可证
Nuklear 可以在 MIT 许可证或公共领域下使用。
参见 [LICENSE](LICENSE) 获取更多信息。
## 审查者指南
在审查拉取请求时,审查者应记住
常见事项。
审查 `src/*` 和 `nuklear.h` 的变更:
* 确保 C89 兼容性。
* 代码应能在多个后端上以可接受的度运行。
* 检查 `nuklear.h` 的其他部分是否相关,因此没有遗漏。
* 推荐简单的优化。
* 通过值而不是指针传递小结构体。
* 尽可能使用局部缓冲区而不是堆分配。
* 检查编码风格是否与周围代码一致。
* 变量/函数命名大小写。
* 缩进。
* 大括号 `{}` 的放置。
* 确保贡献者已更新
[clib.json](https://github.com/Immediate-Mode-UI/Nuklear/blob/master/clib.json) 中的适当版本。
* 至少让另一个人审查变更后再合并。
审查 `demo/*`、`example/*` 和仓库中的其他文件:
* 重点是让可工作的代码合并。
* 我们希望让用户轻松开始使用 Nuklear,任何
`demo` 和 `example` 的改进有助于这一目标。
* 使用更新的 C 特性,甚至其他语言并不被禁止。
* 如果使用了其他语言,确保构建过程易于理解。
* 杂乱或效率较低的代码可以合并,只要这些异常被指出
并且易于发现。
* 不应为这些变更提升版本。
* 改进代码以更符合 `nuklear.h` 的变更当然总是受欢迎的。
标签:ANSI C, C89, Nuklear, UTF-8 支持, ZAP项目解析, 内存控制, 单头文件库, 即时模式 GUI, 可定制 UI, 图形界面工具包, 客户端加密, 嵌入式 UI, 开源 GUI, 无依赖库, 无全局状态, 游戏 UI, 界面库, 跨平台 GUI, 轻量级图形库, 高效率渲染