我有一个GUI系统的想法,不知道能不能找到投资人、开发、推广团队

现在的GUI设计非常复杂,实际上,GUI程序,可以分成好几个部分:一是图形界面部分,其次是交互,处理键盘、鼠标事件,第三可能则是程序背后的逻辑了,也许你的GUI程序是要看网络视频,或者本地文件。

我们的GUI系统主要解决第一和第二部分,也就是图形界面的描述、布局以及键盘鼠标处理函数。

至于第三部分,有各种相应的库,比如网络库,数学库,影视频解码库等等,不在我们的考虑之内。

一个界面描述文件大致是这样的:

(Window
    (Id first)
    (Click "Firstclick")
    (Title "First Window")
    (Top  100)
    (Left 100)
    (Width 100)
    (Height 100)
    (Image "D:\test.bmp")
    (Text
      (Top  100)
      (Left 100)
      (size 12)
      (Caption "My name is zhang xiao ping")
    )
    )
)

(Window
    (ID "Second")
    (Click "SecondClick")
    (Title "This is Second Window")
    (Top 50)
    (Left 50)
    (Width 50)
    (Height 50))
    (Image "D:\test.bmp")
)

我们的库能简单调用一个函数读取该文件,当分析得到一个(window ...)时,就知道,用户想创建一个窗口,该窗口有最大化最小化按钮,top left width height分别表示左上坐标和宽度、高度。

然后,读到WIndow里有个(Text)就知道,要在Windows里写一个字符串,字符串内容、字体大小等信息都在(Text)里描述。

比较难一点的是控件的处理函数,也就是(Click "Firstclick"),每个控件都有一个处理函数,用于处理键盘和鼠标事件。

你的程序必须写好FirstClick来处理点击函数。这里问题也很多,单击、双击、滚轮滑动,键盘都要处理。如果不提供,则使用系统默认的处理函数 --- 最好是什么都不做。

我觉得,我的这一套系统非常容易理解,易于编程,强过市面所有的GUI库。其特点是:排版设计和程序设计要分开,类似于浏览器用html和javascript来处理页面排版和程序设计。

另外,到底哪些控件应该被实现非常值得商酌。Window,一个标准的窗口,Text,在窗口上画文本,这是少不了的,其余呢?需要慢慢打磨。


目前,我有一个基于json描述的C程序:

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

这个程序读取一个json文件,该文件描述窗口的布局,大致这样:

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

\[

{

"Name": "Window",

"ID": "First",

"Click": "FirstClick",

"Title": "First Window",

"Top": "100",

"Left": "100",

"Width": "100",

"Height": "100",

"Image": "D:\\test.bmp",

"Child": \[{

"Name": "Window",

"ID": "Sc",

"Click": "FirstClick",

"Title": "Second",

"Top": "50",

"Left": "50",

"Width": "50",

"Height": "50",

"Image": "D:\\test.bmp",

"Child": \[{

"Name":"Text",

"Caption":"My name is zhang xiao ping"

}\]

},{

"Name": "Window",

"ID": "three",

"Click": "three",

"Title": "The three Window",

"Top": "50",

"Left": "50",

"Width": "50",

"Height": "50",

"Image": "D:\\test.bmp"

}\]

},

{

"Name": "Window",

"ID": "Forth",

"Click": "SecondClick",

"T": "80",

"L": "70",

"W": "60",

"H": "30",

"Comments" : "Child中即使只有一项,也要用\[\]。"

}

\]

这里用json,是因为网上很容易找到开源的分析读取json文件的cpp库,而文章开头的()形式的语法分析,则要自己做 ---- 实际上,()语法分析更简单。

上面的C程序可以读取json文件,并创建显示窗口,窗口里又有两个窗口,目前的问题是,文本显示不出来。

等这套GUI系统完成后,程序设计者的主要工作变成了,如何编写这个“窗口描述文件”。实际上,编写这个窗口布局描述文件的过程非常像编写html,特别是文章开头的()语法,如果你把(Window ...)改成,<window> </window>,其实就是xml/html了,这两者形式不同,但是意义相等。

总之,网页设计师知道,编写网页时,html和Javascript可能各占一半,当我们的用户使用EasyGUI时,可能也是这样,一半时间用于设计窗口显示布局,另一半时间则是编写各种窗口处理函数...

早期网页设计也出现了各种“可视化工具”,但是这些工具都消失了,现在人们几乎都是手工编写html和javascript。可以预见的将来,GUI设计,特别是PC,Mac上的GUI设计,将来也是这种,可视化的窗口设计将会消失。手机上也许是个例外,毕竟我对手机GUI几乎没有研究。

阅读 1.9k
2 个回答

不明白为什么这个回答会被踩,我寻思我的回答也不算没有帮助或有什么违规的地方吧?如果是题主踩的,那只能说没有交流的必要了.


编辑:

  1. <body>...</body> 在没有子节点的情况下本来就支持 <body /> 的形式. 另外请注意你说的 <body ... /> 里的 ... 是节点属性而不是子节点内容;
  2. 在现代开发环境下,有 IDE/编辑器的支持你真的需要每次都手打 <> 吗?单就 WEB 前端领域都有 emmet 这样的工具可以通过 div[tab] (中括号表示按下该键)来输出 <div></div>. 少敲几个字现在并不是什么 特殊 的优势;
  3. 我回答中并不是说只能用 xml 来描述界面,我说的是这种思路并不是什么新鲜东西;
  4. 为什么大家用 xml?因为你要允许用户自定义扩展组件,当某个组件只希望暴露特定的属性或有额外的自定义属性时,xml 这种载体能很好的适应. 我相信你的语法或许也能提供这样的能力,但我只是在告诉你一件事:这种做法大家已经用了很多年了.
  5. win32 createWindow(Ex) 这东西真没你想得那么少人会,你可以搜搜关键字 windows 自绘. win32 上窗口应用麻烦的地方不在于如何描述界面,而是如何高效率的绘制组件:计算可重绘区域、计算各 DPI 下的组件区域、避免嵌套组件间的事件冲突. 如果你提供的工具仅仅用于 描述界面,那么为什么要舍弃 Qt、WPF 这些成熟、已有生态、提供了高效率自定义组件的框架呢.
  6. 举一个小栗子,腾讯 QQ 的密码输入框,在几年或者十几年前,使用的系统自己的 msg_queue 来处理字符输入事件,导致 spy++、全局键盘监听 hook 这类工具都能获取到密码,后来腾讯为了搞定这个事情,自己额外做了一些逻辑,那么这种情况下你该如何允许代码接管 msg_queue 呢?
  7. 补充:当然,出于性能考虑,现在越来越多的应用开始直接用 DirectX 来绘制界面了,毕竟能显卡加速.

最后重申一遍:我作为开发者,关心的是框架、库能不能提高我的效率,少打几个字符这种 IDE/编辑器能帮我搞定的我并不在意(就个人来说),我在意是否有/能接入现有的生态从而避免重复开发一些组件.

提一个场景:一个列表框,里面有一万到十万行的内容,每行内容有十几个到几十个列,这种情况下显然不能直接生成那么多行数去绘制,那么你的工具在这种场景下能提供什么样的帮助呢?


可以看看轮子哥Gaclib.

事实上这种东西虽然不能说烂大街但已经是很常见的思路了:用 XML 描述界面。

包括但不限于:

要知道我本职是 Java WEB 开发,但就 win32 平台 GUI 开发而言我也知道有上面那两个.

你的设计目前来说有一个问题:看不出在复杂界面下有什么显而易见的优势,相比起任何(可能需要装插件的)编辑器 都能格式化的 XML,你的语法会是一堆括号互相嵌套分不清主次.

你可以先试着用你的语法描述一个稍微复杂的界面:任意 App、网页、或者你熟悉的 native 应用. 看看你的语法的表现力是否如你预想的那样.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进