无依赖的小型GUI开发C库-Nuklear
2022-06-19 21:53:01 阿炯

Nuklear 是一个小型的 GUI 开发库,使用纯ANSI C语言开发的即时模式的图形用户接口工具包,所有代码都写在一个头文件里,没有依赖库,在MIT公有领域协议下授权。


A minimal state immediate mode graphical user interface toolkit written in ANSI C and licensed under public domain. It was designed as a simple embeddable user interface for application and does not have any dependencies, a default renderbackend or OS window and input handling but instead provides a very modular library approach by using simple input state for input and draw commands describing primitive shapes as output. So instead of providing a layered library that tries to abstract over a number of platform and render backends it only focuses on the actual UI.


功能特性:
即时模式 GUI 工具包
单独头文件,C89 (a.k.a. ANSI C or ISO C90)
专注于可移植性,高效率和简单性
零依赖(甚至不需要标准库)
完全可定制
如有需要,可控制低内存占用量
支持 UTF-8
无全局或隐藏状态
可定制的库模块

C89 标准:遵循 C89 标准意味着它可以在广泛的 C 编译器上运行,具有很高的兼容性。无论你是使用古老的编译器还是现代的开发环境,nuklear 都能很好地适应。

Nuklear的demo里涉及到的比较活跃的GL库有:allegro5、glfw、sdl、sfml

它被设计成为简单可嵌入式用户应用界面,也没有任何的依赖关系,默认渲染后端或者操作系统窗口和输入处理,而是通过使用简单的输入状态去输入和绘制命令描述原始形状,提供一个非常模块化的库方法输出。所以不是尝试在多个平台上进行抽象并提供呈现的封层库,而是仅仅关注实际的UI。


该库只包含在一个头文件中,可以只在头模式或者实现模式下使用。默认情况下使用头模式,当包含或者允许包含其他头文件,不包含实际的实现。

核心特性

1、简洁直观的 API
nuklear 的 API 设计得极为简洁明了,开发者可以轻松上手。例如,创建一个基本的窗口仅需寥寥数行代码。只需调用 nk_begin 函数开启窗口绘制,设置窗口的标题、位置和大小等属性,接着在窗口内添加各种控件,如按钮、文本框等,最后通过 nk_end 函数结束窗口绘制。这种简洁的 API 风格极大地提高了开发效率,减少了开发者在界面构建过程中花费的时间和精力。

2、丰富多样的界面元素
该库提供了丰富的界面元素库,涵盖了常见的按钮、文本标签、文本输入框、复选框、单选框、下拉菜单、滑块、进度条等。这些元素不仅具备标准的外观和功能,还支持高度的定制化。开发者可以根据应用程序的特定需求,灵活调整界面元素的样式、颜色、字体、大小等属性,从而打造出与应用风格完美契合的用户界面。例如,通过设置相关参数,可以将按钮的颜色修改为与应用主题色一致,或者调整文本输入框的字体大小以适应不同的显示场景。

3、卓越的跨平台能力
nuklear 具有强大的跨平台特性,能够在 Windows、Linux、Mac OS 等主流操作系统上稳定运行。这使得开发者可以基于同一套代码库,轻松构建出在不同平台上均能呈现出一致用户体验的应用程序。无论是在 Windows 平台上开发专业的桌面应用,还是在 Linux 系统中构建服务器管理工具,亦或是为 Mac OS 用户打造独具特色的软件,nuklear 都能提供可靠的支持,有效降低了跨平台开发的复杂性和工作量。

4、高效的渲染性能
在渲染性能方面,nuklear 表现出众。它采用了高效的渲染算法和优化的数据结构,能够在处理大量界面元素和复杂布局时,依然保持流畅的渲染速度和快速的响应能力。即使在高分辨率显示屏和资源有限的环境下,nuklear也能确保界面的绘制高效且稳定,不会出现明显的卡顿或延迟现象,为用户提供了顺滑的交互体验。例如,在开发一款数据可视化应用程序时,需要同时展示大量的图表和数据元素,nuklear能够迅速地将这些元素渲染到屏幕上,让用户能够及时获取数据信息,提升了应用程序的实用性和用户满意度。

5、高度的可定制性
nuklear允许开发者对界面的各个方面进行深度定制。除了前面提到的界面元素的样式定制外,还包括对窗口布局、界面主题、事件处理机制等的定制。开发者可以根据应用程序的业务逻辑和用户需求,自由设计窗口的布局方式,如采用流式布局、网格布局或自定义布局;可以创建独特的界面主题,统一应用程序的视觉风格;还可以定制事件处理函数,精确地响应用户的各种操作,如点击、拖动、键盘输入等。这种高度的可定制性使得 nuklear 能够满足各种不同类型应用程序的多样化需求,为开发者提供了广阔的创作空间。



实现模式需要在此文件之前,在一个.c/.cpp文件之前导入这个文件,而且定义一个预处理宏,例如:
#define NK_IMPLEMENTATION
#include "nuklear.h"

更多细节可参考其说明页面

nuklear 的代码非常紧凑,这使得它可以轻松地集成到各种项目中,而不会占用过多的空间。对于资源受限的环境或对代码体积有严格要求的项目来说,这是一个巨大的优势。

单头文件:只需要包含一个头文件即可使用 nuklear,这大大简化了项目的构建过程。无需复杂的库链接和配置,让开发更加高效。

丰富的小部件:nuklear 提供了各种各样的小部件,如按钮、文本框、下拉菜单、滑块等。这些小部件可以满足大多数用户界面的需求,让你能够快速构建出功能丰富的界面。

易于使用:尽管功能强大,但 nuklear 的 API 设计简洁明了,易于理解和使用。即使是没有太多用户界面开发经验的开发者也可以快速上手。

嵌入式系统:由于 nuklear 小巧且资源占用少,非常适合用于嵌入式系统的用户界面开发。它可以在有限的资源下提供功能强大的用户界面。

游戏开发:在游戏开发中,有时需要快速创建一些简单的用户界面,如菜单、设置界面等。nuklear 可以满足这种需求,并且不会对游戏的性能产生太大的影响。

小型工具和应用程序:对于一些小型的工具和应用程序,不需要复杂的用户界面框架。nuklear 可以提供足够的功能来创建简洁而实用的用户界面。

应用场景

1、游戏开发中的界面设计
在游戏开发领域,nuklear 可用于创建游戏内的各种界面,如游戏设置菜单、角色属性面板、游戏内商店界面、任务提示界面等。由于其轻量级和高效的特点,不会对游戏的核心性能造成明显的负担,同时丰富的界面元素和可定制性能够满足游戏多样化的界面设计需求。例如,一款角色扮演游戏可以利用 nuklear 快速构建出角色的技能升级界面,玩家可以通过直观的按钮点击、滑块拖动等操作来提升角色的各项技能属性,并且界面的样式可以根据游戏的整体风格进行深度定制,为玩家提供沉浸式的游戏体验。

2、工具软件界面开发
许多工具软件需要简洁明了且功能高效的用户界面,nuklear恰好能够满足这一需求。比如文本编辑器的设置界面、图像编辑软件的参数调整界面、音频处理软件的控制面板等。以一个音频处理软件为例,使用nuklear可以轻松构建出包含音量调节滑块、音频特效选择下拉菜单、播放暂停按钮等元素的控制面板,用户可以便捷地对音频进行各种处理操作,并且软件的界面可以根据不同操作系统的风格进行自适应调整,提升了用户使用工具软件的便利性和舒适度。

3、嵌入式系统界面构建
在嵌入式系统中,资源通常较为有限,对界面库的性能和资源占用要求极高。nuklear 的轻量级特性使其成为嵌入式系统界面开发的理想之选。例如,在智能家居设备的控制面板、工业自动化设备的监控界面、车载娱乐系统的操作界面等嵌入式应用中,nuklear 能够在有限的硬件资源条件下,创建出功能完备、操作便捷的用户界面,为用户提供良好的交互体验,同时确保系统的稳定性和高效运行。

示例代码1

以下是一个简单的使用 nuklear 创建一个窗口并显示一个按钮的示例代码:
#include <stdio.h>
#include "nuklear.h"

int main() {
    struct nk_context ctx;
    nk_init_default(&ctx, NULL);

    while (1) {
        // 开始绘制窗口
        if (nk_begin(&ctx, "FreeOA Window", nk_rect(100, 100, 400, 300), NK_WINDOW_BORDER)) {
            if (nk_button_label(&ctx, "Click me")) {
                printf("Button clicked!\n");
            }
        }
        // 结束绘制窗口
        nk_end(&ctx);

        // 处理输入事件等
    }

    nk_free(&ctx);
    return 0;
}

在这个示例中,首先初始化了 nuklear 的上下文。然后在一个无限循环中,使用 nk_begin 和 nk_end 函数来绘制窗口。在窗口中,使用 nk_button_label 函数绘制了一个按钮。如果按钮被点击,将会输出一条消息。

示例代码2

以下是一个简单的 nuklear 示例代码,用于创建一个包含按钮和文本标签的窗口:

#include <nuklear.h>
#include <stdio.h>
#include <GLFW/glfw3.h>

// GLFW 错误回调函数
void glfw_error_callback(int error, const char* description) {
    fprintf(stderr, "GLFW Error %d: %s\n", error, description);
}

int main() {
    // 初始化 GLFW
    glfwSetErrorCallback(glfw_error_callback);
    if (!glfwInit()) {
        return -1;
    }

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(640, 480, "nuklear Example", NULL, NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

    // 创建 nuklear 上下文
    struct nk_context* ctx = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);

    // 主循环
    while (!glfwWindowShouldClose(window)) {
        // 开始绘制 nuklear 界面
        nk_glfw3_new_frame();

        // 创建一个窗口
        if (nk_begin(ctx, "My Window", nk_rect(50, 50, 200, 200), NK_WINDOW_BORDER | NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE)) {
            // 添加一个按钮
            if (nk_button_label(ctx, "Click Me")) {
                // 按钮点击后的处理逻辑
                printf("Button Clicked!\n");
            }
            // 添加一个文本标签
            nk_label(ctx, "This is a nuklear window.", NK_TEXT_LEFT);
        }
        nk_end(ctx);

        // 渲染 GLFW 内容
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // 清理 nuklear 资源
    nk_glfw3_shutdown(ctx);

    // 关闭 GLFW
    glfwTerminate();

    return 0;
}

在上述代码中,首先初始化了 GLFW 库,用于创建窗口并处理相关的窗口事件。然后创建了 nuklear 上下文,在主循环中,通过 nk_glfw3_new_frame 函数开始每一轮的界面绘制,接着使用 nk_begin 和 nk_end 函数创建并定义了一个窗口的范围和属性。在窗口内,分别添加了一个按钮和一个文本标签,当按钮被点击时,会在控制台输出相应的信息。最后,在程序结束时,清理了 nuklear 和 GLFW 的相关资源。

nuklear 作为一个超级实用的 C 库,凭借其简洁直观的 API、丰富多样的界面元素、卓越的跨平台能力、高效的渲染性能以及高度的可定制性,在图形用户界面开发领域占据着重要的地位。无论是游戏开发、工具软件制作还是嵌入式系统界面设计,它都为开发者提供了强大的支持和便捷的开发途径。随着不断发展和应用场景的持续拓展,nuklear 有望继续发挥其独特的优势,为更多的应用程序注入活力,成为C系开发者在界面开发过程中不可或缺的得力助手,助力他们创造出更加出色、用户友好的图形用户界面应用。


最新版本:4.9


项目主页:
https://github.com/Immediate-Mode-UI/Nuklear