简介
GUISAN是一个基于SDL2的开源的GUI控件库,原本是为了一个叫GUICHAN的小游戏而编写的框架。虽然和Qt、C#中的GUI控件没法比,但是他更加简单,可以更好的通过他的代码来进行框架的研究学习。
源码
官方的版本托管在kallisti5的github上,不过由于它是用Sconscript来编译的,对于大多数人来说不是很习惯,因此我把他用makefile重新编译了一遍,把静态库独立出来方便以后的使用,同时顺便删掉了一些文件,并且用doxygen生成了一个文档方便学习。
我把修改后的版本放在了我的github上。
简要分析
GUISAN的include文件夹内容如下:
1 | include |
总体上来说,大概可以分为事件处理、基本控件和显示等辅助部分;对于显示部分,他这里不仅可以使用SDL2,还可以直接使用opengl。最后用一个头文件guisan.hpp对整个框架代码进行统一包含。
src文件夹和include文件夹的内容相互对应,不再细说。
事件处理
GUISAN的事件处理主要基于gcn::Event这个虚基类,派生的类图如下:
作为一个UI库,他设计的事件处理机制比SDL2相对庞大的机制相比已经简化很多了,也更加专注于与用户进行交互的事件。
基础控件
GUISAN的控件基本继承自gcn::Widget这个虚基类,派生的类图如下:
可以看到,控件都是用多重继承,既继承自Widget,又根据任务逻辑继承自各个事件监听器。这当中最常见的应该就是gcn::Container这个类了,这是存放所有其他控件的地方。当然,我们还可以根据需要自定义控件,例如上图中的FFXXX,这是demo里自定义的控件。
其他
除了上面这两个方面,GUISAN还提供了很多辅助的工具,比如gcn::Color,gcn::Exception,gcn::Image等等,以及一些必不可少的与SDL2相关的类。
样例
下面是GUISAN自带的最简单的例子,作为GUISAN框架使用的模板:
1 | /** |
编译的时候注意要将事先编译好的静态库加到PATH里或者写在编译命令里,并且要用-I参数包含头文件夹。
运行输出:
当然,下面这个样例展示了更多的控件: