分布式GUI系统

鄙者在本站发表多篇对于GUI的文章,虽然有些评论,但多是保守派 --- 所谓的保守派,就是以现存的GUI库、各种技术为尊,多数人缺乏创新思想,不敢创新,或者认为其代价太大。

另外,我的文章写的不好,考虑不周全,求学态度不谦虚,也是因素。

对于程序设计语言,相信本站的同学都不陌生,可能你会几门甚至十几门程序设计语言,可能读者也时不时看一下TOIBE排名,了解前100名都是哪些程序设计系统。

对于各种程序设计系统的发明创造,笔者不敢一概而论其发明原因 --- 每种可能都有一个原因,一个目的。比如C语言的发明,可能是因为不同的机器使用不同的汇编太麻烦,统一使用C语言写操作系统更为简单,Unix和C是同时流行的,互相成就;PHP的发明则是为了写网页服务端程序更简单...

当然,有很多通用型程序设计系统。如果单轮关键字、语法,一种程序设计系统的关键词可能只有100个,但是其程序库(函数库、类库)则是五花八门,无所不包的。

如果用一句话概括我的发明 --- 一种以图形界面(UI、GUI)设计为核心的分布式程序设计系统。如果用现存的系统作比喻,那就是和现存的Web有类似的结构,http服务器--GUI服务器,javascript+html -- 笔者自创的GUI描述。

另外,笔者使用C++实现,除了教给用户一套分布式程序设计方法,还提供一个解释执行GUI描述的exe程序 --- 这个程序类似于浏览器解释执行html和javascript,只是我们的GUI描述更为简单。

我们的GUI服务器也很简单,总体上类似与http服务器的get请求、post请求模式,我们提供给用户几个用于编程的API函数,用户简单调用就能实现一个GUI服务器,并在其中添加各种功能函数,便于GUI在描述中调用。

使用者甚至不需要懂tcp/ip以及socket网络编程,只需要简单的添加自己的功能函数在GUI描述中调用即可。

当然,服务器可能做的很复杂 -- 多线程,erlang协程... 各种不同的服务器,有的专注于高并发高连接。初期,我们并不指望能一步做到最好 -- 一个简单的C++、tcp服务器程序,封装起来并不困难。

; 变量定义,下文中所有部分可以直接使用。
@var

a=12 b="helo world" c=12.5 server="gui://edu.cn"

end

; 图形界面描述。
; 每一个图形元素可指定处理过程;在子元素对应的屏幕范围内,其处理过程会覆盖父元素的处理过程;
; 对于兄弟元素,如果有重叠,重叠区域内,z-index大的会覆盖小的。

@gui

; z-index属性决定绘制图形元素的次序,数字大的后绘制,可能会覆盖z-index小的图形元素。 
; top left width height 通过百分比定位而不是像素定位
1 WINDOW name="first" top=0.1 left=0.2 width=0.5 height=0.5 image="D:\test 1.bmp" z-index=1
2 REGTANGLE name="f1" top=0.1 left=0.1 width=0.2 height=0.2
2 A href="file://d/second.gui" caption="你好"
2 A href="file://d/third.gui" caption="测试"
2 REGTANGLE name="f2" top=0.5 left=0.6 width=0.4 height=0.4
2 TEXT name="t1" caption="点击以下文字运行示例程序"   

1 WINDOW
2 BUTTON name="b1" caption="按钮"
2 PANEL
2 TABVIEW
2 TEXT caption=b
2 PANEL
3 IMAGE
2 TEXT caption="Hello world"

end

; 初始化过程
@init

; 默认连接本地的gui服务器,调用函数。
a=cpp_fun1(12,"hello")
; 指定远程服务器
a=cpp_fun1(12,"hello")@"gui://163.com"
a=cpp_fun1(12,"hello")@server

$first.title=a

$first.show

;为@gui添加一行节点 这里将在第一个参数指向的控件后,添加一个控件节点。该函数不做控件"层次"检查。
; 你可以在第一层控件后添加第三层控件。也就是说,即使你push_back成功了,不表示你的窗口描述就是正确的。
;系统在创建并绘制控件时,会做检查,如果检查到你的树形结构中,第一层控件节点有个第三层子节点,报错。

$first.push_back("t1",4,"TEXT","caption","在函数里添加控件")

end

; 控件的键盘、鼠标处理过程
; 子控件处理函数会覆盖父控件的处理函数
; z-index大的图形控件处理函数可能会覆盖z-index小的处理函数
@first.click

$first.title="Changed Titile"

end


@f1.click

end


@f2.click

end

@var为变量定义部分

注意:=前后不能有空格。这么做是为了减少程序员和计算机的工作。

@gui部分,为GUI描述,类似html,我们对其做了语法限定,以数字开头,表示该图形控件的层次,1为顶层,2层控件在1层控件内,3层控件在2层内 ..n+1层控件在n层内。

余下的则为控件的键盘鼠标处理函数。

我们的exe程序能解释执行以上文本,生成最终的图形界面程序。

gui服务器,类似于http服务器。做过网站应用的同学指导,http服务端可以使用多种程序设计系统,java php python,具体能做什么也是五花八门。

理论上,我们的gui服务器可以使用任何支持tcp/ip进行网络编程的程序设计系统,而不仅仅是C++。

我们的GUI解释器,将会连接到GUI服务器(连接到某个ip 和prot),调用gui描述中指定的函数,并返回结果,在图形界面上现实。

实际上,我觉得我这套设计,超越现存的各种GUI库 --- 现存的各种GUI库,一大半是OO方法,就是以程序设计语言为基础,给你一堆GUI控件的类,然后,你就用去吧。 稍微好一点的是提供xml描述gui界面,比如C#.net的WPF库。而其,他们大多只教授GUI库的使用,而并不涉及到分布式。

所谓的分布式,是使用类似html的控件,我们在窗口中添加如下代码,用户点击该连接,即可运行本地或者网络上gui服务器传过来的third.gui文本,解释执行,该过程和你点网页链接打开一个新网页类似:

2 A href="file://d/third.gui" caption="测试"

以下是调用网络上的一个gui文件:

2 A href="gui://baidu.com/third.gui" caption="测试"

在解释程序大行其道的今天,我们没有理由拒绝GUI解释程序,笔者不明白为什么现存的各种解释程序都是单行交互或者在cmd shell字符界面下运行。

为什么不能解释运行一个图形程序?html和javascript的流行,告诉我们,今后应该出现大量的GUI解释程序设计系统。

目前,以上所有的想法以及原型程序(C++ WIndows API)都是一个人做 -- 笔者感觉我这东西,实在太好。不愿私藏,希望有识之士能继续下去。本人一个人做,一来力量有限,二来孤单,三来,玩心太重,事业性欠缺,同时又缺乏办公司拉投资等各种实际经验,基本上,鄙者是个不问世事的技术宅男。

笔者确实希望,同行能为该GUI系统,添加各种美观、好用的GUI控件。

GUI描述中,一个重要的地方是用屏幕百分比定位、指定控件的长度和宽度。

如果,忘记,现存的GUI库教给你的分辨率,像素定位知识。
一个初识电脑,不懂什么是分辨率的人,显然对百分比定位,更加清晰。他们能说出:这个窗口的左上角与屏幕左上角的距离为屏幕长度和宽度的10%,20%,窗口的长度和宽度为屏幕长度宽度的80%,90%?这种描述,才是符合UI设计者的描述。

人们很容易用百分比定位来设计GUI界面,而不是用分辨率,毕竟人眼不能精确到某个像素。而现存的GUI库通常是像素距离的来制定的。

打个比方,像素定位类似机器、汇编语言,而百分比定位则是高级语言(人类语言)。

虽然,像素,分辨率的概念并不难,但是在GUI设计上,却显得太低级原始。希望将来所有的GUI库或者解释器都使用百分比定位,从百分比到像素的转化并不难,对于程序员来说,可能也就几行代码的事情,而且一次做好,其受益是无穷大的,每次设计一个GUI,你就少一次思考繁琐的像素定位,丑陋、变化的像素布局。 为什么不做呢?

当然,百分比定位,也有缺点,1024的3%不是一个整数。我们可以简单的四舍五入。这种精度的丧失,对多数人不是问题,人们基本难以区分一个像素的差距,也没必要 --- 不用把人眼当成高分辨率像机。

对GUI库和解释器,百分比定位强过像素定位。在本系统中,我们使用浮点数(float),也就是写上一个小数即可.

目前,这个原型是使用windows API实现,Window和TEXT很容易。PANEL容器控件,最好实现成html中的这种表格形式。

https://github.com/zhangyun00...

我这套系统受惠最多的可能是C/C++程序员,C++标准里没有GUI库,因为GUI和程序设计本来就是不同的领域,GUI不应该做成程序设计系统的函数库、类库,而是应该另外使用一套描述规则。html的设计者可能比任何人都懂GUI。

现有的C/C++gui库,大概gtk和qt应用较为广泛,但是对于我来说,不够好。我发明的这套GUI系统,大概可以视为gtk和qt同类型产品,区别是,我这个GUI系统是解释执行、网络分布式的,不用用户编写具体的C/C++代码,只要简单在解释文本中写好各种控件、位置参数等即可,而且,该GUI描述,可以分布在网络上所有的有ip地址的机器上,只要你运行GUI服务器,gui描述就可以连接到服务器取得该文件,解释执行。

你可能感兴趣的:(c++)