原文链接:https://mp.weixin.qq.com/s/O9PXaibAyd__ONBBASYI_Q
仍旧是Via What系列,昨天熬夜读了FLTK的文档,今天终于可以给大家介绍一下了。为什么首选这个GUI框架来介绍,个人感觉它有下面几个好处:
如果你也受够了每次写出的程序只有DOS那个黑框,或是想开发自己的GUI工具,亦或是对GUI程序的开发技术感到好奇,那就一起学习一下吧~
简单介绍一下这两者,GUI(Graphical User Interface)和CLI(Command-Line Interface)是两种不同形式的人机接口,说白了就是用户使用某个软件时,那个软件所呈现出的界面外观。CLI编过C语言程序的同学应该都很熟悉,就是那个黑色的窗口,然后打出几个白色的字符:
这种程序又叫控制台应用程序,因为并不是所有的程序都有使用GUI界面的需求,所以这种形式的程序也一直存在(比如Linux系统中大量的工具程序都是以命令行的方式使用的),这种程序对专业用户来说比较方便高效,但对普通用户却不友好。
GUI,也是大家平时使用较多的软件呈现方式,记事本、画图、计算器…这些有菜单、光标、图片…,并且交互方式也不局限于键盘,可以用鼠标指指点点,也可以用数位板、控制器等其它外部设备。当然了,GUI比CLI出现的晚,计算机早期都是用的CLI的形式,至于我们如今用的电脑的这种界面和交互形式,还得追溯到上世纪苹果、微软和施乐公司的相爱相杀。
CLI并没有什么花里胡哨的东西,但GUI涉及到的开发技术却要复杂的多,下面分析一个不完整的流派列表:
FLTK的全称是Fast Light Tookit,是一个快速、轻量的GUI开发框架。下面是引用官方的一段介绍:
FLTK是跨平台的C ++ GUI工具箱。FLTK提供了现代化的GUI功能,而没有膨胀,并通过OpenGL®及其内置的GLUT仿真支持3D图形。FLTK设计得足够小,并且具有足够的模块性,可以静态链接,但可以作为共享库正常工作。FLTK还包括一个出色的UI生成器,称为FLUID,可在几分钟内创建应用程序。
网址:https://www.fltk.org/index.php
源码:https://www.fltk.org/software.php
文档:https://www.fltk.org/documentation.php
下面我们通过一个小例子来展示使用FLTK构建GUI程序的过程,在开始之前,需要取得FLTK的源码,并编译成静态库供我们自己开发过程中调用。使用Visual Studio 2013版本的同学可以直接下载我编译好的一个静态库:https://pan.baidu.com/s/1rQtGmVzOYKRR-jV9lduHcQ 提取码:qhpd,下载的文件结构如下:
当然,大家也可以使用自己版本的VS进行编译,这里也提供了一份FLTK的源码:https://pan.baidu.com/s/1M9R0QNWaR_Lp1_j_bYvqoA 提取码:ucz7。如果过程中遇到什么麻烦,可以私信我讨论~
点名器,大家应该都不陌生,我也是中毒者之一,但是它开发起来简单,比较适合在这里介绍。借助FLTK库,几十行代码就可以完成这个比较实用的小工具,感兴趣的话,大家也可以打开脑洞,做一些稀奇古怪的工具出来。如果大家想进一步学习FLTK,可以去翻翻FLTK的文档,里面有更综合一些的例子值得研究。
void menu_import_clicked(Fl_Widget *widget, void *data)
{
char *new_file = fl_file_chooser("Import file?", "*.txt", "");
if (new_file != NULL)
{
std::ifstream ifs(new_file);
if (ifs.is_open())
{
std::string line;
while (ifs >> line)
g_names.push_back(line);
ifs.close();
}
g_btn->activate();
}
}
void btn_clicked(Fl_Widget *widget)
{
static bool is_odd = true;
if (is_odd)
{
widget->label("| |");
...
is_odd = false;
}
else
{
widget->label(">");
...
is_odd = true;
}
}
void WINAPI timer_proc(HWND hwnd, UINT msg, UINT_PTR id, DWORD elapsed)
{
static int name_index = 0;
g_timer_id = id;
if (name_index >= g_names.size())
name_index = 0;
g_name_box->label(g_names[name_index++].c_str());
}
btn->callback(btn_clicked);
about_confirm->callback(about_confirm_clicked)
{ "&Import...", 0, (Fl_Callback *) menu_import_clicked },
{ "E&xit", FL_COMMAND + 'q', (Fl_Callback *) menu_quit_clicked, 0}
{"&About", 0, (Fl_Callback *) menu_about_clicked },
点名器的源码下载:
https://pan.baidu.com/s/1ikReql_RAawtstPJA6MHmg 提取码:5s1t
FLTK库就简要介绍到这,有需求的同学可以继续前进,提前熟悉使用一个GUI框架有很多好处,如写工具,提高编码能力,也可以完成一些任务…遇到什么麻烦,欢迎大家找我交流~
来源 | 作者:zhumo
编辑:zhumo
封面:zhumo
听说给点赞的最后都会混的和我一样~