您的位置:首页 > 产品设计 > UI/UE

一个使用 ANSI.SYS Escape Sequences 进行时间显示的例子

2008-07-11 16:14 399 查看
#include <stdio.h>

#include <time.h>

#include <memory.h>

#include <string.h>

#include <unistd.h>

int main(void)

{

time_t t_time;

char *a_time;

char *day;

char *hour;

day=(char*)malloc(15);

hour=(char*)malloc(15);

printf ("/033[2J");

if ( fork () )

exit(0);

while (1) {

printf("/33[s");

time (&t_time);

a_time=asctime(localtime(&t_time));

bzero(day,15);

bzero(hour,15);

memcpy(day, a_time, 10);

memcpy(hour, a_time+10, 10);

printf("/033[1;45H/033[K +-----------------------+");

printf("/033[2;45H/033[K + net_robber tell you: +");

printf("/033[3;45H/033[K + %s +",day);

printf("/033[4;45H/033[K + %s +",hour);

printf("/033[5;45H/033[K +-----------------------+");

printf("/33[u");

fflush(stdout);

sleep(1);

}

}

ANSI ESCAPE SEQUENCES实例掌握
/*------------CopyRight-------------
Name:ANSI ESCAPE SEQUENCES实例掌握
Version Number:1.0
Type:Article
Date:2005-08-06
Author:BitBull
Email:bitbull.cn(at)gmail.com
--------------------------------------------*/
0.想在单调的文本模式下写出五彩的程序吗?想让游标如您所愿的游走于屏幕任意地方吗?
这些只需要对ANSI ESCAPE SEQUENCES有点了解就能轻松办到,ANSI ESCAPE SEQUENCES又称为VT100系列控制码,国内译为ANSI控制码.顾名思义,需要VT100系列终端的支持,当然现在已经不在局限于VT100了,包括xterm,linux都能很好完成.(注:在linux下使用困难请man terminfo或termcap取得帮助,在DOS或Windows下,在config.sys中加入ansi.sys(或nansi)即可.)

文章里涉及测试均在以下系统里测试通过:
Red Hat Enterprise Linux AS release 4 (Nahant)
GNU/Linux kernel 2.6.9
GNU bash 3.00.15
80 X 24终端

1.做了简单的介绍后,我们从ANSI控制码的Set Graphics Rendition讲起,先来做个小演示

echo -ne "/33[31m"

终端字符是不是变红色了?这里echo只作为设置用,printf等命令都可代替.
ANSI控制码开始的标志都为ESC[,"ESC"对应ASCII码表的033(八进制),所以我们刚才用-e启用转义,/33来输入ESC,/33[31m即为ESC[31m.

如果不想使用转义,可直接输入,方法:ctrl-v,按ESC

┏━━━┳━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 前景 ┃ 背景 ┃                颜                    色              ┃
┣━━━╋━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  30  ┃  40  ┃  黑色                                               ┃
┃  31  ┃  41  ┃  红色                                               ┃
┃  32  ┃  42  ┃  绿色                                               ┃
┃  33  ┃  43  ┃  黄色                                               ┃
┃  34  ┃  44  ┃  蓝色                                               ┃
┃  35  ┃  45  ┃  紫红色                                             ┃
┃  36  ┃  46  ┃  青蓝色                                             ┃
┃  37  ┃  47  ┃  白色                                               ┃
┗━━━┻━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
我们可以把前景和背景色一起来设置(ESC[X;X;....;Xm,X替换具体色码)

echo -ne "/33[31;46m"

ANSI控制码除了颜色,还提供了一些"特效"喔, :-)
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃   代   码    ┃              功      能                             ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃      0       ┃  所有属性 OFF,即返回正常显示模式 (Normal)            ┃
┃      1       ┃  高亮度显示 (Bright)                                 ┃
┃      4       ┃  加下划线 (Underline)                                ┃
┃      5       ┃  闪烁显示 (Flash)                                    ┃
┃      7       ┃  反相显示 (Inverse)                                  ┃
┃      8       ┃  不可见 (Invisable)                                  ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
clear
试一试:

echo -ne "/33[5;32;45m"

HOHO~这里只为说明问题,颜色搭配确实很糟糕,各位自己来
要取消定义用

echo -ne "/33[0m"

记得把终端还原,再来做下面的例子
如果只要把用echo或printf输出的字符上色,其他终端颜色不改变,可以用类似

echo -e "/33[32mHello LinuxWorld/33[0m"

这次效果是不是还不错?

Set Graphics Rendition除了上面这些,官方文档还有下面控制码

ESC[=#;7h or                   Put screen in indicated mode where # is
ESC[=h or                          0 for 40 x 25 black & white
ESC[=0h or                         1 for 40 x 25 color
ESC[?7h                            2 for 80 x 25 b&w
3 for 80 x 25 color
4 for 320 x 200 color graphics
5 for 320 x 200 b & w graphics
6 for 640 x 200 b & w graphics
7 to wrap at end of line

ESC[=#;7l or ESC[=l or         Resets mode # set with above command
ESC[=0l or ESC[?7l
这些都为不常用的终端属性控制,各位有需要可自行设置,这里不做一一介绍.

2.下面我们来讲讲ANSI控制码的另一块比较常用的功能,Cursor Controls

clear
echo -ne "/33[10;40H"    #把游标移动到第10行,第40列
echo -ne "/33[3A" #上移3行
echo -ne "/33[3B" #下移3行
echo -ne "/33[3C" #左移3列
echo -ne "/33[3D" #右移3列

echo -e "/33[10;40HHello LinuxWorld" #把字符显示在特定位置,其他ABCD控制可类似操作

echo -ne "/33[6n"
#报告游标坐标,参阅官方文档是"ESC[#;#R Reports current cursor line & column",不知道是系统差异还是手头的官方文档滞后了

echo -ne "/33[s" #保存当前游标位置
echo -ne "/33[u" #把刚才已经保存的游标位置恢复

游标控制就这么些指令,这里来作个汇总
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃  控  制  码  ┃                功                    能             ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃    [X;YH     ┃  将游标移至第 X 行 Y 列的位置                         ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [nA      ┃  游标上移 n 行                                       ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [nB      ┃  游标下移 n 行                                       ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [nC      ┃  游标向右 n 列                                       ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [nD      ┃  游标向左 n 列                                       ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [6n      ┃  报告游标位置。(手头的官方档为[#;#R)                  ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [s       ┃  保存当前游标位置                                    ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃     [u       ┃  把刚才已经保存的游标位置恢复                         ┃
┗━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

3.Cursor Controls和Graphics Rendition的结合

clear
echo -ne "/33[5;31;42m/33[13;30HWarning:XXXXXXXXXXX/33[0m"
#通过上面的介绍,这句应该很容易看懂,效果是不是还不错

其他大家自己举一反三,结合ascii art,能做出多彩的字符画

4.Erase Functions

echo -ne "/33[2J" #擦除屏幕,和clear命令效果一样
echo -ne "/33[K" #擦除到行尾

5.接下来,我们要讲的是Keyboard Reassignments

这其实是个挺有意思的功能,键盘重赋值

ESC[65;81p  #把ASCII码表的65的A变成81的Q,注意这里的数字为10进制

Fn按键对应的ASCII表:
F1=59,F2=60,F3=61,F4=62,F5=63
F6=64,F7=65,F8=66,F9=67,F10=68

6.最后,谈谈ANSI控制码的用途

由于ANSI ESCAPE SEQUENCES倚赖终端,不是倚赖语言,所以在shell,perl,c里应用都没有问题
这里给个C实例,基本没啥变化
#include <stdio.h>

main()
{
printf("/33[32mHello LinuxWorld/33[0m/n");
}
编译看看,和echo的效果是不是一样

至于ANSI控制码到底能干嘛,这也要靠读者发挥自己的想像喽,比如把终端打扮得漂亮点,或者写漂亮点的文本游戏,把警告等提示信息用红色加强..................太多太多了

很高兴您能看到这里,希望文章有您需要的东西.

转载请保持版权声明完整,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐