项目地址:
https://github.com/vurtun/nuklear
源码只有一个 nuklear.h 文件, 约2.5万行代码
https://github.com/vurtun/nuklear/blob/master/nuklear.h






离线
这个看来很不错哦,
试一试编译一个demo.
sudo apt-get install libglew-dev
sudo apt-get install libglfw3-dev
发现ubuntu14.04 不能安装 libglfw3-dev
hexing@ubuntu:/disk2/licheepi/u-boot$ sudo apt-get install libglfw3-dev
[sudo] password for hexing:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libglfw3-dev
看来只能下载源码自己编译安装了。
离线
离线
yunge@ubuntu:/tmp/nuklear/example$ make
cc -std=c99 -pedantic -O2 -o bin/file_browser file_browser.c -L/usr/local/lib -lglfw3 -lGL -lm -lGLU -lGLEW
/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [file_browser] Error 1
真是个悲剧,链接错误, 找不到XConvertSelection函数。
离线
放狗一搜,找个一个链接: undefined-references-compiling-opengl-glfw-glew-on-ubuntu
第15行改成:
LIBS := $(GLFW3) -lGL -lm -lGLU -lGLEW -lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread -ldl
搞定编译:
yunge@ubuntu:/tmp/nuklear/example$ make
cc -std=c99 -pedantic -O2 -o bin/file_browser file_browser.c -L/usr/local/lib -lglfw3 -lGL -lm -lGLU -lGLEW -lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread -ldl
cc -std=c99 -pedantic -O2 -o bin/extended extended.c -L/usr/local/lib -lglfw3 -lGL -lm -lGLU -lGLEW -lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread -ldl
cc -std=c99 -pedantic -O2 -o bin/canvas canvas.c -L/usr/local/lib -lglfw3 -lGL -lm -lGLU -lGLEW -lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread -ldl
cc -std=c99 -pedantic -O2 -o bin/skinning skinning.c -L/usr/local/lib -lglfw3 -lGL -lm -lGLU -lGLEW -lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread -ldl
离线
yunge@ubuntu:/disk2/nuklear/example$ bin/canvas
Error 65543: GLX: Failed to create context: GLXBadFBConfig
canvas: /tmp/glfw/src/window.c:944: glfwSetWindowUserPointer: Assertion `window != ((void *)0)' failed.
Aborted (core dumped)
yunge@ubuntu:/disk2/nuklear/example$ bin/extended
Error 65543: GLX: Failed to create context: GLXBadFBConfig
extended: /tmp/glfw/src/window.c:944: glfwSetWindowUserPointer: Assertion `window != ((void *)0)' failed.
Aborted (core dumped)
yunge@ubuntu:/disk2/nuklear/example$ bin/
canvas extended file_browser skinning
yunge@ubuntu:/disk2/nuklear/example$ bin/skinning
Error 65543: GLX: Failed to create context: GLXBadFBConfig
skinning: /tmp/glfw/src/window.c:944: glfwSetWindowUserPointer: Assertion `window != ((void *)0)' failed.
Aborted (core dumped)
yunge@ubuntu:/disk2/nuklear/example$ bin/file_browser
Error 65543: GLX: Failed to create context: GLXBadFBConfig
file_browser: /tmp/glfw/src/window.c:944: glfwSetWindowUserPointer: Assertion `window != ((void *)0)' failed.
Aborted (core dumped)
运行悲剧了. 出现一个断言错误。接着debug
离线
sudo apt-get install mesa-utils
example$ glxinfo | grep 'version'
server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
OpenGL version string: 2.1 Mesa 11.0.2
OpenGL shading language version string: 1.20
发现一个同病相怜的人: https://github.com/vurtun/nuklear/issues/364
离线
柳暗花明又一村,终于找到解决方案了: https://github.com/skeeto/opengl-demo
如果您的GPU不支持OpenGL 3.3并且您使用Mesa 10.0+,则可以使用环境变量强制渲染软件 LIBGL_ALWAYS_SOFTWARE=1。
把环境变量强制加上,终于搞定这个棘手的问题:
yunge@ubuntu:/tmp/nuklear/example/bin$ LIBGL_ALWAYS_SOFTWARE=1 ./extended
piemenu selected: 4
pushed!
piemenu selected: 4
piemenu selected: 4
piemenu selected: 4
有图有真相:
离线
https://github.com/skeeto/opengl-demo
这个作者建议换掉 glfw3, 改用sdl
备择方案
gl3w的一个很好的选择是glLoadGen,它几乎可以直接丢弃。GLEW既大得多,也不支持核心配置文件或一般3.2+,所以它不是现代OpenGL的选项。
对于GLFW来说,一个合理的替代方法是SDL 2.0,它更大,并且带来更多的功能,例如音频,线程和字体渲染,如果您需要它的话。
littlevgl PC上用的方案就是SDL.
离线

新建VC2013工程, 在main.c 里面把几个demo开关全部开启
#define [ins]INCLUDE_ALL[/ins]会出现一个一个编译错误:
错误 22 error LNK2019: 无法解析的外部符号 _snprintf,该符号在函数 _calculator 中被引用C:\projects\nuklear\demo\gdi\main.obj gdi
解决方法:
修改calculator.c
snprintf() 改为 ==> _snprintf()
离线
编译glfw3 demo:
glfw_opengl3$ make
rm -f bin/demo
cc main.c -std=c99 -pedantic -O2 -o bin/demo -L/usr/local/lib -lglfw3 -lGL -lm -lGLU -lGLEW
/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [demo] Error 1
glfw_opengl3 出现链接错误, 修改方法和5楼一样:
# Install
BIN = demo# Flags
CFLAGS += -std=c99 -pedantic -O2SRC = main.c
OBJ = $(SRC:.c=.o)ifeq ($(OS),Windows_NT)
BIN := $(BIN).exe
LIBS = -lglfw3 -lopengl32 -lm -lGLU32 -lGLEW32
else
UNAME_S := $(shell uname -s)
GLFW3 := $(shell pkg-config --libs glfw3)
ifeq ($(UNAME_S),Darwin)
LIBS := $(GLFW3) -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo -lm -lGLEW -L/usr/local/lib
else
LIBS = $(GLFW3) -lGL -lm -lGLU -lGLEW -lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread -ldl
endif
endif$(BIN):
@mkdir -p bin
rm -f bin/$(BIN) $(OBJS)
$(CC) $(SRC) $(CFLAGS) -o bin/$(BIN) $(LIBS)
运行方法和前面一样
glfw_opengl3$ bin/demo
Error 65543: GLX: Failed to create context: GLXBadFBConfig
demo: /tmp/glfw/src/window.c:539: glfwGetWindowSize: Assertion `window != ((void *)0)' failed.
Aborted (core dumped)
glfw_opengl3$
glfw_opengl3$ LIBGL_ALWAYS_SOFTWARE=1 bin/demo
离线
/* nuklear - 1.32.0 - public domain */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <math.h>
#include <limits.h>
#include <time.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_FONT
#define NK_IMPLEMENTATION
#define NK_GLFW_GL3_IMPLEMENTATION
#include "../../nuklear.h"
#include "nuklear_glfw_gl3.h"
#define WINDOW_WIDTH 1200
#define WINDOW_HEIGHT 800
#define MAX_VERTEX_BUFFER 512 * 1024
#define MAX_ELEMENT_BUFFER 128 * 1024
/* ===============================================================
*
* EXAMPLE
*
* ===============================================================*/
/* This are some code examples to provide a small overview of what can be
* done with this library. To try out an example uncomment the defines */
/*#define INCLUDE_ALL */
/*#define INCLUDE_STYLE */
/*#define INCLUDE_CALCULATOR */
/*#define INCLUDE_OVERVIEW */
/*#define INCLUDE_NODE_EDITOR */
#ifdef INCLUDE_ALL
#define INCLUDE_STYLE
#define INCLUDE_CALCULATOR
#define INCLUDE_OVERVIEW
#define INCLUDE_NODE_EDITOR
#endif
#ifdef INCLUDE_STYLE
#include "../style.c"
#endif
#ifdef INCLUDE_CALCULATOR
#include "../calculator.c"
#endif
#ifdef INCLUDE_OVERVIEW
#include "../overview.c"
#endif
#ifdef INCLUDE_NODE_EDITOR
#include "../node_editor.c"
#endif
/* ===============================================================
*
* DEMO
*
* ===============================================================*/
static void error_callback(int e, const char *d)
{printf("Error %d: %s\n", e, d);}
int main(void)
{
/* Platform */
static GLFWwindow *win;
int width = 0, height = 0;
struct nk_context *ctx;
struct nk_colorf bg;
/* GLFW */
glfwSetErrorCallback(error_callback);
if (!glfwInit()) {
fprintf(stdout, "[GFLW] failed to init!\n");
exit(1);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
win = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo", NULL, NULL);
glfwMakeContextCurrent(win);
glfwGetWindowSize(win, &width, &height);
/* OpenGL */
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glewExperimental = 1;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to setup GLEW\n");
exit(1);
}
ctx = nk_glfw3_init(win, NK_GLFW3_INSTALL_CALLBACKS);
/* Load Fonts: if none of these are loaded a default font will be used */
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
{struct nk_font_atlas *atlas;
nk_glfw3_font_stash_begin(&atlas);
struct nk_font_config cfg = nk_font_config(22);
//cfg.merge_mode = nk_true;
cfg.range = nk_font_chinese_glyph_ranges();
//cfg.coord_type = NK_COORD_PIXEL;
struct nk_font *font = nk_font_atlas_add_from_file(atlas, "../../../extra_font/msyh.ttf", 13, &cfg);
nk_glfw3_font_stash_end();
nk_style_set_font(ctx, &font->handle);
}
#ifdef INCLUDE_STYLE
/*set_style(ctx, THEME_WHITE);*/
/*set_style(ctx, THEME_RED);*/
/*set_style(ctx, THEME_BLUE);*/
/*set_style(ctx, THEME_DARK);*/
#endif
bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f;
while (!glfwWindowShouldClose(win))
{
/* Input */
glfwPollEvents();
nk_glfw3_new_frame();
/* GUI */
if (nk_begin(ctx, "中文", nk_rect(50, 50, 230, 250),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
{
enum {EASY, HARD};
static int op = EASY;
static int property = 20;
nk_layout_row_static(ctx, 30, 80, 1);
if (nk_button_label(ctx, "button"))
fprintf(stdout, "button pressed\n");
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_dynamic(ctx, 25, 1);
nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1);
nk_layout_row_dynamic(ctx, 20, 1);
nk_label(ctx, "background:", NK_TEXT_LEFT);
nk_layout_row_dynamic(ctx, 25, 1);
if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx),400))) {
nk_layout_row_dynamic(ctx, 120, 1);
bg = nk_color_picker(ctx, bg, NK_RGBA);
nk_layout_row_dynamic(ctx, 25, 1);
bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f,0.005f);
bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f,0.005f);
bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f,0.005f);
bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f,0.005f);
nk_combo_end(ctx);
}
}
nk_end(ctx);
/* -------------- EXAMPLES ---------------- */
#ifdef INCLUDE_CALCULATOR
calculator(ctx);
#endif
#ifdef INCLUDE_OVERVIEW
overview(ctx);
#endif
#ifdef INCLUDE_NODE_EDITOR
node_editor(ctx);
#endif
/* ----------------------------------------- */
/* Draw */
glfwGetWindowSize(win, &width, &height);
glViewport(0, 0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(bg.r, bg.g, bg.b, bg.a);
/* IMPORTANT: `nk_glfw_render` modifies some global OpenGL state
* with blending, scissor, face culling, depth test and viewport and
* defaults everything back into a default state.
* Make sure to either a.) save and restore or b.) reset your own state after
* rendering the UI. */
nk_glfw3_render(NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
glfwSwapBuffers(win);
}
nk_glfw3_shutdown();
glfwTerminate();
return 0;
}
修改几行代码,可以显示中文了, 但是用msyh字体只能12, 如果设置其它型号窗口就是黑的, 不知道为什么?
离线
请问一下,这个gui适合移植到单片机系统吗?
离线
离线


测试了以下d3d11 demo,发现字体 1-19都可以运行正常, 20就不行了
/* GUI */
ctx = nk_d3d11_init(device, WINDOW_WIDTH, WINDOW_HEIGHT, MAX_VERTEX_BUFFER, MAX_INDEX_BUFFER);
/* Load Fonts: if none of these are loaded a default font will be used */
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
{struct nk_font_atlas *atlas;
nk_d3d11_font_stash_begin(&atlas);
/*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../extra_font/DroidSans.ttf", 14, 0);*/
/*struct nk_font *robot = nk_font_atlas_add_from_file(atlas, "../../extra_font/Roboto-Regular.ttf", 14, 0);*/
/*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../extra_font/kenvector_future_thin.ttf", 13, 0);*/
/*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../extra_font/ProggyClean.ttf", 12, 0);*/
/*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../extra_font/ProggyTiny.ttf", 10, 0);*/
/*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../extra_font/Cousine-Regular.ttf", 13, 0);*/struct nk_font_config cfg = nk_font_config(19);
cfg.merge_mode = nk_false;
cfg.oversample_h = 1;
cfg.oversample_v = 1;
cfg.range = nk_font_chinese_glyph_ranges();
cfg.coord_type = NK_COORD_UV;
struct nk_font *font = nk_font_atlas_add_from_file(atlas, "msyh.ttf", 19, &cfg);nk_d3d11_font_stash_end();
/*nk_style_load_all_cursors(ctx, atlas->cursors);*/
/*nk_style_set_font(ctx, &droid->handle)*/;
nk_style_set_font(ctx, &font->handle);
}
离线
晕哥这个厉害了
离线
柳暗花明又一村,终于找到解决方案了: https://github.com/skeeto/opengl-demo
如果您的GPU不支持OpenGL 3.3并且您使用Mesa 10.0+,则可以使用环境变量强制渲染软件 LIBGL_ALWAYS_SOFTWARE=1。
把环境变量强制加上,终于搞定这个棘手的问题:
yunge@ubuntu:/tmp/nuklear/example/bin$ LIBGL_ALWAYS_SOFTWARE=1 ./extended
piemenu selected: 4
pushed!
piemenu selected: 4
piemenu selected: 4
piemenu selected: 4有图有真相:
https://whycan.cn/files/members/3/QQ20180218185909.png
补充一下顺序,
安装(ubuntu 16环境):
sudo apt install libglew-dev
sudo apt install libglfw3-dev
(很遗憾,这两部没有碰到任何问题,开心脸.jpeg)
下载https://github.com/vurtun/nuklear.git
进入~/nuklear/example 目录
make
进入 ~/nuklear/example/bin$
~/nuklear/example/bin$ ./extended
demo画面应该就出来了
离线
晕哥,能把VS的工程放出了吗?这个看起来不错
离线
离线
晕哥 说:演技担当黄晓明 说:晕哥,能把VS的工程放出了吗?这个看起来不错
好像直接新建一个 Win32 窗口项目, 然后添加文件就可以了。
我回去看看,还在不在电脑,如果有就传上来.
下载地址: nuklear_debugdump.7z
由于git仓库太大,比 .git 目录删除了。
工程文件是哪个?
离线
晕哥 说:晕哥 说:好像直接新建一个 Win32 窗口项目, 然后添加文件就可以了。
我回去看看,还在不在电脑,如果有就传上来.
下载地址: nuklear_debugdump.7z
由于git仓库太大,比 .git 目录删除了。
工程文件是哪个?
nuklear_debugdump\demo\gdi\gdi.vcxproj
nuklear_debugdump\demo\d3d9\gdi.vcxproj
nuklear_debugdump\demo\d3d11\gdi.vcxproj
离线
演技担当黄晓明 说:晕哥 说:下载地址: nuklear_debugdump.7z
由于git仓库太大,比 .git 目录删除了。
工程文件是哪个?
nuklear_debugdump\demo\gdi\gdi.vcxproj
nuklear_debugdump\demo\d3d9\gdi.vcxproj
nuklear_debugdump\demo\d3d11\gdi.vcxproj
请问下这个能在stm32跑嘛?
或者说有没有推荐能在stm32上实现矢量字体的方法
离线
晕哥 说:演技担当黄晓明 说:工程文件是哪个?
nuklear_debugdump\demo\gdi\gdi.vcxproj
nuklear_debugdump\demo\d3d9\gdi.vcxproj
nuklear_debugdump\demo\d3d11\gdi.vcxproj请问下这个能在stm32跑嘛?
或者说有没有推荐能在stm32上实现矢量字体的方法
看起來應該可以在 STM32 跑
libfreetype: https://whycan.cn/t_741.html
离线
mark
离线
请问这个和littlevgl那个更适合在单片机上跑啊?带lcd control的单片机
离线
ddddddddddddddddddddddddddddd
离线
mark一下。。。。
离线
这个GUI真是碉堡了 ![]()
离线
厉害了。。。高手太多了。
离线
感谢楼主这个帖子,全网只此一家!!!
离线
源码只有一个h文件,还是2.5万行的,这个够厉害。。。
离线
是比较厉害,GUI代码不少了,学习不完
离线
看了一下,底层都是调用windows的api啊,应该没法移植到单片机上吧
离线
理论上 是可以移植到mcu上的
有个问题,为什么我下载来的h文件,是5k行的。。。
离线
好东西,可以在VS上编译, 就比较好玩了。
离线
一个头文件,2.5万行,厉害了。。。
离线