前言
在互联网应用漫天的现在,实体企业、工厂却绕不开大量的桌面应用,开发工具有恐龙C#,有难用的MFC,也有没落的Delphi,还有新星QT。工业品怕被卡脖子,还是用全开源的吧!OS还是用咱们国产的Deepin Linux,GUI用C++版的Fltk,短小精悍、速度快、可定制性强,今天一测究竟。
一、下载安装
到官网 www.fltk.org 可以看到最新的稳定版,我下载的是fltk-1.3.7-source.tar.bz2,才4.4Mb.
解压到工作目录或主目录:
tar -xzvf fltk-1.3.7-source.tar.bz2
cd fltk-1.3.7/
进入其目录后,用configure配置, --help可以查看参数,如果安装过程中缺少某些库,比如xft,可以用参数不安装xft, 还可以选安装字符集支持cp936.
./configure --help
./configure --disable-xft --enable-cp936
如果缺少某些关键部分,比如X11, opengl等,configure的记录会提示你,用 sudo apt-get install xxx 补上。
如果顺利,接下来就是编译和安装。
make
sudo make install
二、样例使用
与其他开源库比较,Fltk自带的例子算很丰富了。在其目录的test目录下,有许多简单程序,都已经在make时编译好了,可直接运行。比如,输入 ./unittests 可展示多种特性,包括皮肤功能。
但字体效果不好:
用于工控的界面如下,可能看上去有点寒碜,但如果加上自己设计的皮肤,就脱胎换骨啦!
还有很多例子,都有源码和编译好的,都在同一目录(test)下,名为demo的例子是其他例子的总集成。
三、自编代码
为了不污染它的例子,在另外的目录下,自己写个Hello world:
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
int main(int argc, char **argv)
{
Fl_Window *window = new Fl_Window(340,180);
Fl_Box *box = new Fl_Box(20,40,300,100,"Hello, World!");
box->box(FL_UP_BOX);
box->labelfont(FL_BOLD+FL_ITALIC);
box->labelsize(36);
box->labeltype(FL_SHADOW_LABEL);
window->end();
window->show(argc, argv);
return Fl::run();
}
如果按照网上的说法: g++ hello.cpp -lfltk -o hello 在早期版本可以,而现在编译参数太复杂了,如果不用cmake,就用它自带的工具fltk-config:
fltk-config --compile hello.cpp
就会生成可运行的 hello 程序。
其他网友介绍链接:
Fltk入门
外国网友的入门翻译为汉语
中文显示有问题,可以参考https://blog.youkuaiyun.com/u013591757/article/details/18909491
但我测试,中文没有显示
折腾了许久,发现编译Fltk时,./configure 不要带其他参数,直接用默认值,因为Deepin Linux 已经把中文字体安装和配置好了。用以下指令就可以查看到哪些中文字体:
fc-list :lang=zh
fc-list | grep 体
把上面的hello.cpp中的文本换成中文如下:
Fl_Box *box = new Fl_Box(20,40,300,100,"Hello, World!");
再编译运行,结果如下图:
四、后记
虽然自带的编译命令: fltk-config --compile hello.cpp可以,但对于稍微复杂的程序,比如用了opengl的程序,就不再适用。需要查看错误原因,并补上相关的库。比如:
#include <stdlib.h>
#include <FL/Fl.H>
#include <FL/gl.h>
#include <FL/Fl_Gl_Window.H>
// fltk-config --compile hello.cpp 无法编译
// 需要自己增加编译指令如下
/* g++ hello.cpp -I/usr/local/include -I/usr/local/include/FL/images -I/usr/local/include/freetype2 -I/usr/include/uuid -I/usr/include/libpng16 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT /usr/local/lib/libfltk.a -lXrender -lXcursor -lXfixes -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11 -lfltk_gl -lGL
*/
class MyWin: public Fl_Gl_Window
{
void draw()
{
glLoadIdentity();
glViewport(0, 0 , 400, 300);
}
public:
MyWin(int x, int y, int w, int h, const char *L): Fl_Gl_Window(x, y, w, h)
{};
};
int main (int argc, char **argv)
{
Fl_Window *window = new MyWin (100, 80, 640, 480, "mywindow 中文");
window->end ();
window->show (argc, argv);
// Fl::set_idle(idle_cb);
return Fl::run();
}