作者构思了一种类似于http/html的分布式GUI编程框架,适用于WIndows、桌面Linux、MacOS以及C++、Java、Python等一个编程系统支持GUI编程。但是对于手机的小屏幕来说,可能就不适合了。本系统包括窗口描述规则;gui.exe--命令行程序,用于解释和执行规则,你可以把gui.exe看成是python.exe一样的解释器,不同的是gui.exe只解释和执行图形程序;guid.exe---这是一个GUI服务器,用来编写实际的C++函数,对应客户端请求的页面或函数调用,并将页面和函数调用结果传送给客户端。1.页面描述,请求服务器页面,函数调用;变量定义@vara=12b="heloworld"c=12.5;图形界面描述@gui1WINDOWname="first"click="firstclick"title="test"top=100left=100width=100height=100image="D:\test1.bmp"2PANEL3TEXTname="t1"caption="My..."2WINDOW3TEXTcaption=b3PANEL4TEXTcaption="Helloworld";初始化函数@init;在本地或远程GUI服务器中调用函数,并将返回值存储在变量中。a=gui://localhost/cpp_fun1(12,"hello")$first.title=a$first.show;为@gui添加一行节点这里会在第一个参数指向的控件后面添加一个控制节点。此函数不执行控制“层次结构”检查。;您可以在第一层控件之后添加第三层控件。也就是说,即使你的push_back成功了,也不代表你的窗口描述是正确的。;当系统创建和绘制控件时,它会检查。如果它检查你的树结构中,一级控制节点有一个三级子节点,就会报错。$first.push_back("t1",4,"TEXT","caption","在函数中添加控件");控件的键盘鼠标处理函数@firstclick$first.title="ChangedTitle"鼠标键盘处理函数,只需指定控件的以下属性即可:click:点击dblclick:双击mousedown:鼠标按下mouseup:鼠标弹起mouseover:mousehovermouseout:mouseleavemousemove:mousemovemouseenter:mouseentermouseleave:mouseleavekeydown:keyPresskeyup:按键抬起keypress:按键抬起cpp_fun1是GUI服务器程序中的一个函数。它的返回值将被GUI客户端使用。上面@gui部分其实是对html的改进,目的是为了简化编程,让程序员和计算机少做事。作者实现上面@gui部分,使用c++大概500行代码,如果使用html/xml,作者在网上找了一些开源的xml解析库,一般十几到几十个文件,算上几万行代码,甚至更多。也就是说,代码量小了10倍甚至几十倍。相应软件的分析效率估计提高10倍甚至更多。为什么作者的胡乱设计比html和xml好那么多?因为作者给它定义了语法:它以数字开头,表示控件的级别。html/xml没有这个,但是一个真正的GUI设计者应该很清楚自己控件的层次。标签/控件不需要重复两次,html就是这样写的。<身体>身体>3。以行为为单位。您不能在@gui中拆分一行来编写它。4、赋值语句不能有空格,也就是说“a=3”不能写成“a=3”。同样,函数调用和参数之间不能有空格。5.区分大小写。通过限制语法,计算机和程序员都可以做更少的工作。我们可以在上面的GUI中写几个窗口:1WINDOWname="first"click="firstclick"title="test"top=100left=100width=100height=100image="D:\test1.bmp"2DIV3Ahref="http://gnu.org/test.gui"4TEXTname="t1"caption="My..."1WINDOWname="s"2TEXTname="t1"caption="My..."然后在@init中显示一个特定的窗口:$first.show如果你想,连续显示多个窗口:$first.show$s.show在大多数情况下,用户可能在键盘上像@firstclick,在鼠标处理函数中创建并显示窗口。2.百分比指定控件的大小和位置。大多数GUI库的作者没有意识到——尤其是那些跨平台的库——GUI库的各种控件应该以百分比而不是像素来指定父控件中的长度、宽度和位置。创建窗口或按钮时,应按百分比指定大小和位置。GUI库应该有自动将百分比转换成像素的功能。凡是号称跨平台的GUI库都应该加上这个功能,所有的控件都可以按百分比定位。这是HTML教给我们的常识。遗憾的是,Web设计人员的常识已成为GUI库的奢侈品。我们鼓励使用百分比来指定窗口大小和位置。下面的代码创建一个窗口,从屏幕左上角开始分别占据屏幕长和宽的10%和20%,窗口的大小也是屏幕长和宽的80%和90%。1WINDOWname="first"click="firstclick"title="test"top=10%left=20%width=80%height=90%image="D:\test1.bmp"三、C++实现。在gui.ex中,我们使用一个简单的函数来读取和解析上面的文本:read_gui("test.gui");这个函数的作用是读取测试文本,然后得到一个树状结构——这个过程类似于Browser解析html是类似的。然后,遍历结构体,先父亲,再儿子,先兄弟,创建并显示窗口。作者使用WindowsAPI制作了一个快速原型。如果要跨平台,用GTK比较好---注意,不要用QT。除了这个函数,我们还需要实现test.gui中使用的宿主语言函数,即上面的cpp_fun1。我们的解析器解析test.gui调用cpp_fun1,并将函数调用的结果赋值给变量a--注意变量a是test.gui的变量,不是c++程序中的变量。在实现中,我们可以使用map
