乐趣区

分布式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 中的 <tr><td> 这种表格形式。

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 描述就可以连接到服务器取得该文件,解释执行。

退出移动版