发信站: 日月光华 (2002年06月03日05:14:29 星期一), 站内信件
menu.ini入门到精通
此文写给有志于将AsciiArt与BBS系统完美结合的青老年朋友...
——shipping
btw:文中所说的menu.ini均指Firebird 3.0及以后版本所用,之前版本没有涉及过,不
敢
乱说。
Que 1: 什么是menu.ini
Ans 1: menu.ini是搭建BBS的Firebird系统中的一个系统档案,也是供系统管理员调整B
BS
界面的一个接口。menu.ini的改动直接反映在BBS的界面上。
Que 2: 如何修改menu.ini
Ans 2: BBS的普通用户当然不可能修改系统档案。一般来说,menu.ini只允许比较高的
权
限比如系统管理员才可以修改。
Ans 3: 首先是要对menu.ini本身结构的了解, 如果能有相当的Ansi功底, 就能够锦上
添花。
Que 4: 学习menu.ini难不难
Ans 4: 明确告诉你, 不难。
没什么好问的了, 我们开始吧。
事先说明一点:因为对一个BBS站点而言, 拥有了修改menu.ini的权限实际上已经拥有
了
最高权限, 所以正规的站点当然不会把menu.ini随便拿来给你修改。因此建议,为了更
好更快地学习menu.ini,可以在自己的电脑上架设一个BBS,Linux下的Firebird和Window
s
下的Firebird都可以在网络上获得。
发信人: shipping (小平~~~~繁华落尽), 信区: ANSI
标 题: menu.ini的整体结构初探
发信站: 日月光华 (2002年06月03日05:15:39 星期一), 站内信件
menu.ini整体结构:
menu.ini的内容是由多个块构成,每个块的都是以%开始,以%结束的一段字符。
同时每个块都有自己的名字,可以在其他块当中调用。这很类似编程语言的过程or子程
序
下面具体介绍块的结构。
一个很典型的块:
%S_MAIN
*[42m *[m
*[11;29H*[m┭┴┬┶┳*[1m┵┰┴┰┶┳*
[1
*[12;29H*[m┴┬*[0;47m
*[13;29H*[m┭┴*[0;34;47m
*[3I*[13;3
*[14;29H*[m┴┮*[0;34;47m
*[3I*[14;3
*[15;29H*[m┭┴*[0;34;47m
*[3I*[15;3
*[16;29H*[m┴┬*[0;34;47m
*[3I*[16;3
*[17;29H*[m┬┴*[0;34;47m
*[3I*[17;3
*[18;29H*[m┴┮*[0;34;47m
*[3I*[18;3
*[19;29H*[m┬┴*[0;47m *[1;31m▓*[0;34
;4
*[20;29H*[m┴┬*[0;30;47m
*[21;29H┭┭┴┬┶┳┵*[1m┰┴┰┶┳┵
*[
%
这个块定义了一个背景图案,块的名字叫 S_MAIN。
现在大家明白了,开头的%之后紧跟的字符串就是这个块的名字。
这个块的内容就是从下一行开始到%结束所有的东西。
有什么东西呢? 我们根据内容的性质不同,把所有的块分成两种——菜单块和背景块。
首先需要明白我们所看到的BBS的界面,都是由菜单+背景构成的。那么
顾名思义,菜单块和背景块的含义就不用说明了。
--
发信人: shipping (小平~~~~繁华落尽), 信区: ANSI
标 题: menu.ini菜单块语句分析
发信站: 日月光华 (2002年06月03日05:18:48 星期一), 站内信件
现在我们来分析一行很典型的菜单块语句
!M_EGROUP 10, 5, 0, "EGroup", "E) 分类讨论区"
!M_EGROUP 这表示菜单的这一行是指向下一个菜单也就是分类讨论区的菜单。其实如
果我们往后面看看,就能发现有一个%M_EGROUP %的菜单块,在这里被
引
用。
10,5 表示这一行菜单的标签将在屏幕的第10行第5列显示。——显示什么呢—
—
就是后面双引号里面的“E) 分类讨论区“。
0 , 这个0表示任何用户都能看到这个菜单。 BBS的权限在这里体现。
"EGroup", 这是这个菜单项的英文标签,并不显示出来,但是有一个很重要的用途—
—这个字符串的第一个字母将是这个菜单项的快捷键。没错,不要误以为
后面分类讨论区前面写着 E 就是设定快捷键, 真正的快捷键字母在这里
作为对照,我们来看另外一行语句
@ExecBBSNet 0, 0, PERM_POST, "OBBSNet", " O) 网路连线 "
@ExecBBSNet 这表示这个选项的功能是调用系统的一个叫做"ExecBBSNet"的功能,简
单的说,第一个字符是!的话表示指向另一个菜单,而如果是@的话表示执
行某一项功能。
0,0, 注意这并不是表示这一行将在0,0的位置显示, 而是表示将在上一行菜
单
选项的位置向下平移一行显示。比如说现在这一行就是紧接着上面那个例
子那一行,那么这一行将在11,5的位置显示。这种方法非常有用,后面我
们会说到。
PERM_POST, 这在上面那个例子是0, 很容易知道, 这里就是表示并不是所有的用户
都
能看到这个菜单选项, 哪些用户能够看到呢——拥有PERM_POST权限的用
户才能看到。PERM_POST是BBS系统对于用户权限的一个标志,指的是拥有
发文权限。所以我们现在可以解释为什么一个用户被封禁了全站的发表文
章权限之后,会发现同时也不可以穿梭了——因为他根本看不到这个菜单
选项了。
"OBBSNet", 类似的, 快捷键是 "O" (大小写不敏感)
#----------------------------------------------------------------------------
有了上面的理解, 普通的menu.ini你就应该能够读懂了, 怎么样, 很简单是不是。
--
现在要介绍一些更深层次的东西:
下面是menu的ansi制作的困难点---背景和前景的重叠问题.
我发现系统好像只是很简单的把背景和前景的menu ansi代码重叠到一起然后
解释, 这样, 代码本身在屏幕上的位置也就要考虑不可以互相影响.
上面这一点可以解释为什么我们的菜单选项经过多次调整还是全部放在了左边
而且几乎所有的bbs的菜单都是在左边(如果有稍微复杂的背景的话)----因为菜单
摆在右边的话几乎不可避免地要跟背景左边的代码重叠产生错误(实际上情况比这个
还要复杂一些) .
菜单在左边 看板在右边确实不会发生任何问题
而一旦菜单的左边有看板(or一部分看板),就不能不考虑看板的代码长度问题,
一般稍微多一点着色,代码都会比较长(只要超过了菜单最左边的字符的位置,就算长
), 协调的方法两种:要么压缩代码,(优化代码or取消部分上色),要么
菜单右移。
会出现, 现象如下所示:
> E) 分类讨论区
有时候也可能 E) 分类讨论区 >
实际上>这个东西应该在紧靠E)的地方。
部分解决的方法如下:
如果光标在在菜单右边,就增加菜单的补偿位移(左边有了ansi控制符号之后,
右边的菜单会相应的向左边偏移若干,为了补偿这个偏移量,在菜单项的前面就添加
了相同的空格,我把这个叫做补偿位移)。
如果光标在菜单的右边,就增加相应冗余ansi控制符号,这样可以让菜单向左补偿
达到正确位置。(这个的典型案例请看复旦泉工具箱菜单)
当然,上面说到的实际上是非常耗费功夫的操作,因此把菜单项安排在背景的左边是
很讨巧的选择。
menu.ini修改过程中容易出现的问题
1. 菜单修改之后cterm等不支持鼠标点取
这是因为背景上一行末尾少了一个*[m
2. 修改menu之后shift~刷新的时候会吊线
这个需要修改BBS源程序。 具体在 comm_lists.c中的#define SC_BUFSIZE
10240,?
3. 有些浏览工具比如Telnet, Netterm的用户会发现界面折叠起来像百叶窗
这是因为背景一行代码过长, 请精简代码。 另外Netterm用户窗口本身过窄也会
有?
4. 每一行背景会有不同程度偏移
参看上面的“补充位移”。一种解决办法是对背景的每一行用强行定位显示。这
里些
5. 修改menu.ini之后发现某些菜单不能用了
最不希望出现的是连admin也进入不了,这往往是某一个块缺少了结束符%,最直
接
的后果就是在此之后定义的所有菜单都不可用,并且糟糕的是不能简单修改——
需要登陆主机直接修改menu.ini文件才可以。
--
.
0 > BBS 系统--[站内] .
1 复旦大学-.[本校] .
2 光华公司--[勤助] . . ●
3 社团组织--[团体] . .
4 竞赛活动--[临时].
5 谈天聊地--[感性] . . .:
6 游戏休闲--[休闲]
7 个人风采--[个人] : . .
B 所有讨论区 ALL .
N 阅读新文章 NEW █
E 回到主选单
_____________________________________________________________________________
_
上面是复旦泉分类讨论区的界面。有没有发现一点不同的地方:菜单项和背景融为一体
了
。这就是我下面要说到的扩展menu用法。
也许要问了,如果不用所谓扩展menu方法就不能做到这一点么——我告诉你,确实不能
。
不错,菜单项里面显示标签可以加ansi控制符使得显示出彩色的菜单来(复旦泉主菜单
)
但是这样因为ansi代码本身占用了空间,背景在这个位置就不可能有代码存在,用绝对
定位也不可以——这样的直接后果就是:菜单和背景之间必须有一定距离是空白而不可
能
是连在一起的(参看复旦泉主菜单和惠州明月湾主菜单)
介绍扩展menu方法首先要说菜单项语句的精确涵义:看语句
!M_EGROUP 10, 5, 0, "EGroup", "E) 分类讨论区"
系统所作的事情实际上是将光标定位到(10,5)位置,从这里的后一个位置显示“E) 分
类讨论区”并且在实际的界面过程中在这个(10,5)的位置会有一个">"作为选择标志
。
因此,当这里的“E) 分类讨论区”字符串为空时,系统仍然要占用两个半角字符位置,
其中一个用来显示>,另一个是预留的空格。
可能大家看到这里已经猜到了所谓的扩展menu方法就是将"E) 分类讨论区"之类菜单项全
部
置为空串,而将这几个字符固化在背景里面——这就很容易解释为什么上面那个范例的
菜
单和背景为什么能够融为一体——因为他们本就是一体,都在背景里面! 而菜单块实际
上除了那个活动的>什么都没有显示。
这个方法的好处,就是管理员可以专心制作背景而不需要过多考虑菜单和背景的配合问
题
。当然,即便如此,菜单和背景之间仍然会有冲突——冲突就在那个>的位置。这个位置
和
控制符的时候也必须很小心,因为一旦ansi控制符跟>重叠, ansi的控制效果就没有了
。
不管怎样, 这样一个小小诀窍确实大大扩展了menu的制作空间。并且我相信,当你掌握
这种方法之后, 看当今所有Firebird系统下的BBS界面, 都能一眼看穿其制作方法。
Now,你已经掌握了menu制作的基本上全部要点, 剩下的就是实践,和创意。——这也是
为什么要求menu制作人员需要相当的Ansi制作功底——的确可以锦上添花。
Enjoy it.
刚刚访问暨南大学bbs, 发现他们采用的正好相反的途径, 也就是并非把菜单固化在
背景里面, 而是——相反, 把背景直接写在菜单里面。
这样的一个最大的好处就是, 只要处理的稍微巧妙一些, 就可以应用于需要权限控制
的菜单。 这很重要。
真该死, 以前怎么没有反过来思考呢?
--
FROM 218.197.192.163