GUI的优势在于上手比较容易,而CLI的优势在于效率更高。
(BTW: 最开始vimperator给我看Google Reader造成了很大的不便,
不过Ubiquity似乎比普通CLI要跟强一些,
Graphical User Interface Timeline
里面介绍BeOS时 说: One of the most noted features of BeOS is its use of tabs instead of typical title bars. This perhaps saves a little bit of screen space and definitely gives the windowing system a unique appearance. 这正是我最近用xfwm4的beos风格替代metacity的原因 :-)
罗梅洛说: “我们的计划就是,让全世界游戏制作者都用上NeXTSTEP,让所有人都连到因特网上,让每个人都拥有一辆法拉利。” 到底NeXTSTEP是个怎样的东西,居然有这么大魅力? 这里也有NeXTSTEP的后继OPENSTEP的介绍(这种风格跟我们现在常见的风格差别太大了,都有点边缘化了,搞得GNUstep现在有点冷清)。
P.S: NeXTSTEP和OPENSTEP居然也是Apple弄出来的。
在FootNotes上看见Gimmie这 个东西,对桌面提出了一个新的构想,不再是Windows那样的以程序/窗口为导向(我得说,GNOME/KDE是在学Windows,从开始菜单到窗口 列表,从桌面图标到TrayIcon),而是以对象为导向: 有哪些文档,跟哪些人联系,有哪些电脑以及电脑上有哪些设备,能否根据某个标记(tag)找到某个对象(还有提议说跟beagle集成起来最好了)。
Gimmie目前只有一个雏形,还只是一个应用程序,还不能让众多程序告知它信息(比如直接从nautilus中打开的文档目前并不能被gimmie在Documents中列出)。目前它表现为一个面板(所以作者给了个副标题叫Panel Revisited),如下。
但这里有个按这种方式组织桌面的一个mockup。
BTW: 那个Application栏的搜索功能我比较喜欢。你有没有在开始菜单中一个个查看以试图找到某个程序的痛苦经历,反正我有。
相关资料:
但UI怎么办呢? 当然是要求有一些常用控件的,而且有事件响应能力,脚本中也要求能够操纵这些UI元素。基于俺个人多年的爱好,最好是能够同时编辑UI和事件处理代码(我认为没有这个功能就不能叫RAD:-)。
从目前看到的一些东西来看,Windows下比较接近我们的需求的是Script Builder, 它是基于Delphi的,可以直接使用ActiveX或者Delphi编写的package,支持ActiveScript(也就是说可以使用 VBScript, JScript, Python和Perl了)和DelphiScript。如果我们自己的项目是用Delphi开发的,把这个集成进去应该是件很酷的事情。(这个东西实际 是基于以前见过的Dream Scripter,只是UI表现上做得更加接近了我们“用脚本写程序”的想法而已。)
再看一些其他的GUI toolkit吧:
说了这么些,有朋友会问,到底你们用的哪种?呵呵,记住我们的程序是用MFC写的,也没有买Qt这样的界面套件。最后我们用了用友华表的 Cell控件做模板来模拟UI,上面也可以放些按钮、下拉框什么的,虽然显得很不专业,但总算能对付过去。
想 想也知道为什么这种东西没有基于MFC的: 要在脚本中操纵UI控件(当然是说比较自然的方式,比如MainForm.Statubar1.SimpleText = "hello, world", 不是我见一些高手在tcl里面用c代码封装SendMessage来操纵的那种),这显然要求界面库有良好的RTTI,以便宿主程序能够很方便地将界面控 件对象加到脚本解释器当中去,否则脚本中怎么操纵它们。MFC有这些个嘛? ──除非完全自己手工来折腾。
补充:
1. 忘了gambas了,这个接近于Visual Basic,UI是用Qt写的。
2. mozilla的XUL应该是一个很不错的选择,而且传言很快将加入python支持,只是比较耗内存(似乎也没界面编辑器)。
今日在公司阅读其他人给出的一份界面可用性“规范”,里面看见一条“对话框不应可调整大小”,不仅哑然失笑:这是那门子的规矩。
Windows下的这些程序喜欢将控件固定放在第(x,y)象素,所以调整窗口大小的时候,移动窗口上控件的位置就是一件相当麻烦的事情了,因为要自己写代码来计算各个控件的相对位置,决定是固定大小、随着某边延长还是固定距离某边多宽。
我最受不了MFC的就是这个。
这用ShBrowserForFolder这个Windows API可以实现。
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(
LPBROWSEINFO lpbi
);
在Delphi中有下面这个函数可以使用:
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload; (1)
但我更喜欢用这个(在一些简单的场合):
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload; (2)
但很多朋友不愿意,认为后面这个太难看。但在我看来,第一个对话框在可用性上是存在很大问题的:
* 不能设置(并展开到)缺省的选择
* 不能手工输入,这使得要进入一个层次深一点的目录非常麻烦
* 不能新建目录
其 实就ShBrowserForFolder这个API而言,第一个问题是很容易解决的,不过M$提供的是一种挺麻烦的方式: 你必须得编写回调函数(BrowseCallbackProc),在BFFM_INITIALIZED消息里面发送BFFM_SETSELECTION消 息。(我觉得Delphi在提供SelectDirectory(1)这个函数时就应该包装这个功能。)
对于第二个问题, 如果你的shell32.dll版本大于或等于4.71, 就可以有个手工输入路径的编辑框了, 只要在flags中包含BIF_EDITBOX;
对 于第三个问题, 如果你的shell32.dll版本大于或等于5.0, 就可以有个"新建文件夹"按钮了, 只要在flags中包含BIF_NEWDIALOGSTYLE (而且这个版本有其他一些特性: 对话框大小可调, 目录可拖动, 目录有context menu(这可以带来其他一些功能)。
BTW:
1. lazarus中有TSelectDirectoryDialog控件,功能上等于Delphi的SelectDirectory(1)函数加上设置缺省目录功能。
2. DFS套件(Torry.Net上的信息)里面有一个dfsBrowseDirectoryDlg控件,支持shell32 5.0的NewDialogStyle,对这个功能包装得比较完整(其实上面的第三个图用得就是这个控件),要添加新版本的特性(比如6.0的BIF_NOTRANSLATETARGETS等)也很容易。
我认为比较好的方式是什么呢? 是WindowMaker的"最小化为图标"。
在最小化为图标的方式下,你可以将图标自行组织,也不局限于一行。但在M$的风格里面,你被限定在这一排上了。而且在XP下,你还可以得到两个更“高级”的选项: 一个是变成几行,你可以上下来回切换,总会让你有点事情做;另外一个特性就是“分组”...
当 然,缩小为图标的时候,其他窗口最大化可能会覆盖这个窗口,这是个问题。但这个问题至少在WindowMaker上可以很容易地解决:在WPrefs里面 Window Handling Options(第二个图标)将When maximizing...do not cover icons选上就可以了。
最开始玩Windows 3.1的时候,最小化都是缩为一个图标的。后来知道Windows早期很多东西都是从X Window System上学的,OpenLook和CDE也都是缩小为一个图标。然后玩WindowMaker,也是这样。可惜现在GNOME和KDE也都学M$的 风格(好在还有一个Roll Up/Down,聊胜于无吧)......
P.S 前几天在一个论坛上看见一个M$ Windows的扩展: Desktop Mate,可以让你的窗口最小化为一个浮动图标:
Usage: right click on | ![]() | minimizes window to floating icon: |
vim的菜单是支持tear-off的(gtk, motif 1.2或者win32版本), 但装了cream(debian package)之后,菜单就不再能够拆下来了。
vim的文档里面说可以用":tearoff 菜单名"这个命令来手工将一个菜单拆下来。
注意: 1. 对于已经翻译过的菜单,直接使用翻译过的名字,比如简体中文环境可以用":tearoff 编辑(E)";
2. vim是采用'.'来分隔多级菜单的,比如用":tearoff 设置(S).色彩主题(C)"就可以拆下cream的color scheme菜单,然后我们就可以一个个地试验那个颜色比较养眼了。
当然,如果你想主菜单创建的时候就有那个用于拆卸的分隔条,也是可以办到的: set guioptions+=t,但我看见cream/cream- settings.vim里面特意关闭了这个选项,不知道是不是有什么特殊的原因。
链接:
Tear-off menu 有什么不好
vim -cream的菜单国际化(i18n)支持
但这并不适用与“开始”菜单,因为上述设置只影响gnome_menu_new()创建的菜单(由libgnomeui里面提供),而开始菜单gnome-panel是直接用gtk_menu_new()创建的。
对于这个功能的缺失我一直有点耿耿于怀。 今天下载源代码看了看,发现要加这个并不难,效果图见右,尤其是Debian菜单现在用起来方便多了。
但我不明白的是,当初为什么要删除这个功能?
--- gnome-panel/menu.c.orig 2005-06-07 03:08:56.000000000 +0800
+++ gnome-panel/menu.c 2005-11-23 00:07:22.000000000 +0800
@@ -257,6 +257,7 @@ GtkWidget *
panel_create_menu (void)
{
GtkWidget *retval;
+ GtkWidget *tearoff;
static gboolean registered_icon_theme_changer = FALSE;
if (!registered_icon_theme_changer) {
@@ -267,7 +268,11 @@ panel_create_menu (void)
}
retval = gtk_menu_new ();
+ tearoff = gtk_tearoff_menu_item_new();
+ gtk_widget_show(tearoff);
+ gtk_menu_prepend(retval, tearoff);
+
panel_gconf_notify_add_while_alive ("/desktop/gnome/interface/menus_have_icons",
(GConfClientNotifyFunc) menus_have_icons_changed,
G_OBJECT (retval));