当前位置: 首页 > Web前端 > HTML

一种类似于http-html的分布式GUI编程框架

时间:2023-04-02 16:25:13 HTML

作者构思了一种类似于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来存储变量名和值。有了以上三点,一键式GUI设计方法就完成了。剩下的工作就是实现各种控制。四、基本控件的实现。最简单、最基本、最必要的可能就是WINDOW和TEXT,这很容易。WINDOW用于创建标准的Windows窗口,TEXT用于写入文本。更重要的是容器控制。在OO库中,通常称为PANEL,用于放置各种控件,在html中为

的优点是可以嵌套。您可以将一个div放在一个div中并嵌套多次。PANEL也应如此。一些OOGUI库的PANEL控件使用了一个丑陋莫名的“布局对象”来控制里面控件的布局,我就不提了。一个好的设计看起来像这样:1WINDOWname="s"2PANELlayout="vertical"/"horizo??n"/"none"w=3h=43TEXTname="t1"caption="My..."layout可以取值vertical或horizo??ntal,表示这个PANEL的子控件是垂直还是水平布局。如果指定布局方式为None,则子控件将按照顶部宽度放置控件。w和h的意思是把PANEL平均分成3*4个矩形格子,依次把控件放进去。您可以按行或按列放置子控件。最后,还有“叶子”控件——它们必须放在容器空间Window或PANEL中。您不能在叶控件内添加控件。通常,按钮、单行文本框、单选框、多选、图像控件……是叶控件。不同的OO库有不同的添加叶控件的方法。有些顶层窗口不能直接放置叶子控件,必须加一个PANEL,有些则可以直接放置。我认为每个人都有自己的理由。作者不想成为束缚。实施者考虑自己的需求,是灵活的。DELPHIVCL自带菜单控件TMENU,而在我们的GUI系统中,没有MENU控件,我们可以简单的用PANEL和TEXT拼出一个菜单:1WINDOWname="s"2PANELlayout="horizo??n"w=1h=23PANELname="menu"layout="horizo??n"w=5h=14TEXTname="file"caption="file"click="subshow"4TEXTname="edit"caption="edit"4TEXTname="view"caption="View"4TEXTname="tools"caption="Tools"4TEXTname="help"caption="Help"3PANELname="submenu"layout="vertical"w=1h=3show=no4TEXTname="new"caption="New"4TEXTname="save"caption="Save"4TEXTname="open"caption="Open"3PANELname="content"layout="horizo??n"w=1h=1@subshowsubmenu.show上面这个名为menu的PANEL是一个菜单,我们的菜单可以用各种文字颜色显示,因为你已经实现了TEXT的颜色显示。submenu是文件菜单的子菜单,show=no表示默认不现实,只有调用@submennu.show时系统才会绘制子菜单。我们在名为文件的文本点击函数中调用这个函数。对于数据库记录的显示,我们可以使用上面的PANEL和TEXT控件:1WINDOWname="s"2PANELname="db"layout="vertical"/"horizo??n"/"none"w=3h=43TEXTname="t1"caption="My..."3TEXTname="t2"caption="My..."3TEXTname="t3"caption="My..."3TEXTname="t4在上面“caption="My..."的PANEL中,存储了3行4列的文本,每行文本显示数据库的一条记录。如果超过3条记录,只需要改变PANEL的w和h值,然后添加节点:;“|”变量后面表示该变量是数组变量。a|="0000",1,2,3@gui1WINDOWname="s"2PANELname="db"layout="vertical"/"horizo??n"/"none"w=3h=4;a|0在大多数程序中引用数组元素等同于a[0],使用单符号运算符可以使解析更容易。3TEXTname="t1"caption=a|03TEXTname="t2"caption="My..."3TEXTname="t3"caption="My..."@init;调用C++/Python等实现语言函数,获取数据库记录,存储在数组变量中。a|=cpp_fun()$db.w=10$db.w=10$t1.caption=a|0$t2.caption=a|1$t3.caption=a|0也许,我们应该添加一个for语句到这个GUI描述语言。<视频>控制。这里的难点在于vedio控件中的数据不是字符串,而是二进制数据。我们的GUI描述文件是如何获取C++程序的二进制数据的呢?5.分布式GUI基于以上框架,我们可以实现一个类似于html的控件/标签。1WINDOWname="first"click="firstclick"title="Test"top=100left=100width=100height=100image="D:\test1.bmp"2DIV3Ahref="GUI://gnu.org/test.gui"caption="GNUofficialwebsite"4TEXTname="t1"caption="My..."当用户点击时:3Ahref="GUI://gnu.org/test.gui"caption="GNUofficialwebsite"实际上是在远程机器上创建并显示一个GUI程序,它的文字描述和要调用的C++函数都在远程机器上。这个过程就像当你点击网页上的一个链接时,它会跳转到一个新的页面。同样的,你可以复制html的设计来打开一个新的窗口,旧的窗口不需要关闭。GUI服务器将在gnu.org上运行,并且将存在一个test.gui文件。GUI服务器类似于http服务器,用于接受客户端请求并返回test.gui文本和文本中编写的各种宿主语言的函数调用结果。假设GUI://gnu.org/test.gui的内容如下:@gui1WINDOWname="test"@init$test.show$.title=My_CPP_fun()gnu.org上运行的GUI服务器应该实现my_CPP_fun函数,并可以将其调用的结果返回给客户端。一个简单的GUI协议如下:GETGUI://gnu.org/test.gui这个类似于HTTP的GET请求用于返回文本文件的内容。下面是用来调用远程函数的:GETGUI://gnu.org/My_CPP_fun12"test.abc"223.4上面调用远程服务器的My_CPP_fun函数,参数是12"test.abc"223.4在这个way,我们的GUI框架,有网络分布式的能力。我们写的GUI不仅可以在本地执行,还可以把URL地址告诉别人,别人就可以简单的使用你的带有A标签的GUI程序。这个看起来很像Windows的远程协助,您可以让朋友控制您的计算机。