Nuklear 是一个 C 编写的、只有头文件的 GUI 界面库,也是 imgui 类的界面实现工具,支持多种渲染后端,包括 gdi/gdi+/D3D/X11/Xft/SDL/opengl 等,特别适合跨平台和工具软件的界面实现。

Nuklear 其实核心是实现了基于2D绘图的界面控件绘制以及交互事件处理,而底层的渲染和用户操作事件处理,则由使用的后端来实现。Nuklear 实现了大部分常用控件,包括 label、button、radio、checkbox、edit、slider、chart 等,但没有提供常用对话框比如 MessageBox 和 FileDialog(毕竟控件都只是绘制)。

下图是一个样例代码实现的界面,源码托管在 GitHub 上。其中使用了 tinyfiledialogs 来实 MessageBox 和 FileDialog 对话框功能。

Nuklear Demo

Nuklear 的文档都包含在头文件里,接口和样例齐全,WIKI 里也有部分控件的使用样例代码,这里说一些使用时的注意点:

  1. Nuklear 的界面在每一帧中都会重新绘制,所以没有其他界面库的事件循环和回调,通常实现一些功能需要在代码里保存一些状态。
  2. Nuklear 的控件布局是基于行的,建议多看一下头文件中关于 layout row 的说明和示例。
  3. Nuklear 支持多 window,这些 window 都在同一个系统窗口内。
  4. 可以自定义界面控件的外观,具体参见样例代码中的 style.c 文件。
  5. 推荐使用 gdp+(win) 和 xft(linux)后端,其他后端多数需要携带字体文件,如果需要显示中文,部署需要携带字体,如果只是英文,nuklear 自带了一块字体。
  6. 所有后端的实现代码可以参见 Nuklear 仓库的示例。
  7. tinyfiledialogs 库使用后部署无依赖,win 上基于 comdlg32ole32,linux 是基于命令行调用的窗口。需要注意的是,在程序中调用对话框后会阻塞已有的 Nuklear 程序。
  8. Nuklear 支持在 window 中直接进行2D绘图,主要是调用 nk_window_get_canvas() 后使用自带的绘图函数进行绘制操作,需要注意的是坐标处理(建议使用 nk_window_get_content_region() 获取窗口范围)。

每个工具都有应用的长处和短处,Nuklear 适合快速原型、工具小软件或者编辑器,但并不适合实现复杂的、侧重用户交互的程序,在实际中有时也需要权衡。

PS: 在 Linux 上需要屏幕录制时,推荐软件 peek