在UNIX下如何用C语言保存和恢复屏幕(6)
来源:asp之家 发布时间:2010-05-20 18:24:00
■ 视窗的卷动
视窗的卷动, 掖Q用来配合视窗的处理, 当我们持续对视窗输出直到视窗的游
标移动至最後一列时, 如果我们再输出一列或是输出一个换行字元时, 视窗可
整个往上卷动一行. 这对我们撰写一个编辑程式时, 是尤其重要的, 一个画面
无法卷动的编辑器, 势必无法处理超过一个萤幕大小的档案.
视窗的卷动是预设为关闭的, 并以 scrollok() 来控制开闭.
scrollok(win,TRUE); 开启
scrollok(win,FALSE); 关闭
下面的例子因为不断地输出 0,1,2.. 故将以一个 40 * 10 的视窗不停的卷动
#include <curses.h>
main()
{
int i;
WINDOW *scrwin,*boxwin;
initscr(); ←┐
cbreak; │ 启动 curses 模式
noecho(); │
nonl(); ←┘
scrwin=newwin(10,40,LINES/2-6,COLS/2-25); /* 设定另一视窗大小 */
boxwin=newwin(12,42,LINES/2-7,COLS/2-26); /* 设定外框视窗大小 */
scrollok(scrwin,TRUE); /* 开启视窗卷动功能 */
box(boxwin,'|','-');
refresh();
wrefresh(boxwin);
for (i=0;;++i) /* 不断地在视窗内输出 0-8 的数字,使视窗卷动*/
{
wprintw(scrwin,"%d",i%9);
wrefresh(scrwin);
}
}
执行结果:
┌——————————————————————┐
│ □---------------------□ │
│ |3456780123456780123412| ↑ 视 │
│ |3456780123456780123456| │ 窗 │
│ |7801234567801234567801| │ 不 │
│ |2345678012345678012345| │ 停 │
│ |6780123456780123456780| │ 往 │
│ |1234567801234567801234| │ 上 │
│ |5678012345678012345678| │ 卷 │
│ |0123456780123456780123| │ 动 │
│ □---------------------□ │
│ │
└——————————————————————┘
■ □例 - 模拟 joe 分割画面同时编辑两个档案
在下面的例子里, 我们应用了多视窗处理的函式, 改良上回介绍的编辑器,
在这个程式里, 我们可以同时编辑两个画面, 并以 [ESC] 做不同视窗间的
切换. 同时, 按下 [TAB] 键, 会出现 POP-UP 的 ONLINE HELP.
#include <curses.h>
void initial();
main()
{
WINDOW *win[2],*curwin,*helpwin;
int nowwin;
int x,y;
int i;
int ch;
initial();
win[0]=newwin(LINES/2-1,COLS-1,0,0); /* 设定两个视窗的大小*/
win[1]=newwin(LINES/2-1,COLS-1,LINES/2,0);
helpwin=newwin(3,30,2,COLS/2-15 ); /* ONLINE HELP 的大小 */
box(helpwin,'|','-');
mvwaddstr(helpwin,0,10,"ONLINE HELP"); /* ONLINE HELP 的内容 */
mvwaddstr(helpwin,1,4,"Hit any key to continue..");
for (i=0;i<COLS-1;++i) /* 画两个视窗间的界限 */
mvaddch(LINES/2-1,i,'-');
nowwin=0; /* 先指定游标在第一视窗 */
curwin=win[nowwin];
getyx(curwin,y,x);
move(0,0);
refresh();
refresh();
do {
ch=getch();
switch(ch) {
case KEY_UP: --y; /* 判断是否"↑"键被按下 */
break;
case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 */
break;
case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 */
break;
case KEY_LEFT: --x; /* 判断是否"←"键被按下 */
break;
case '\r': /* 判断是否 ENTER 键被按下 */
++y;
x=0;
break;
case '\t': /* 判断是否 TAB 键被按下 */
touchwin(helpwin);
wrefresh(helpwin); /* 呼叫 ONLINE HELP */
getch();
touchwin(win[1-nowwin]); /* 重画第一,二视窗 */
wrefresh(win[1-nowwin]);
touchwin(curwin);
wrefresh(curwin);
break;
case 127: /* 判断是否 BACKSPACE 键被按下 */
wmove(curwin,y,--x);/* delete 一个字元 */
waddch(curwin,' ');
break;
case 27 : nowwin=1-nowwin; /* [ESC] 键切换视窗 */
curwin=win[nowwin];
getyx(curwin,y,x);
break;
default:
waddch(curwin,ch);
x++;
break;
}
wmove(curwin,y,x);
wrefresh(curwin);
} while(1);
}
void initial()
{
initscr(); ←┐
cbreak(); │ 启动 curses 模式
nonl(); │
noecho(); ←┘
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
执行结果:
┌—————————————————————————————┐
│ screen1 │
┌→ │ this is screen 1, you can press [ESC] to │
以 │ │ switch between screen 1 and screen 2. │
[ESC]│ │ │
切 │ │ │
换 │ │----------------------------------------------------------│
游 │ │ screen 2 │
标 │ │ │
位 └→ │ _ (游标) │
置 │ │
└—————————————————————————————┘
↑ 按下[TAB] 键,出现 ONLINE HELP
↓
┌—————————————————————————————┐
│ screen1 │
│ this is screen 1, you can press [ESC] to │
│ switch□--------ONLINE HELP--------□ │
│ | Hit any key to continue..| │
│ □---------------------------□ │
│----------------------------------------------------------│
│ screen 2 │
│ │
│ │
│ │
└—————————————————————————————┘
↑ 按任意键, ONLINE HELP 关闭
↓
┌—————————————————————————————┐
│ screen1 │
│ this is screen 1, you can press [ESC] to │
│ switch between screen 1 and screen 2. │
│ │
│ │
│----------------------------------------------------------│
│ screen 2 │
│ │
│ _ (游标) │
│ │
└—————————————————————————————┘


猜你喜欢
- 在搜索引擎优化过程,我觉得最难就是解决搜索引擎收录网页的数量,再就是轻松的获取站外链接。突然看到有一个系统做泛外链,用404作优化。猛如醍醐
- 天下熙熙皆为利来,天下攘攘皆为利网(往)!当新一代中国商人爱上网络,当商人爱上商业搜索,世界将“利来利网”!网络经济,挟全球经济一体化的大潮
- VMware workstation 虚拟机兼容性问题,如何解决?我在自己的本基本上安装了 VMware Workstation 10,准备
- 一个配置好的MAIL服务器除基本功能外应该具有的其它功能:* 反垃圾邮件能力。检查连接或内容,阻挡某些认为是不良的连接以及信件。* 反病毒能
- 11月11日消息,据外国媒体报道,eBay首席执行官John Donahoe称,eBay将关注中国的出口商,并与与中国当地的公司扩大合作。D
- 难怪最近老中病毒,而且每次中毒时都自动打开了RealPlayer播放器,我就很奇怪,当时每注意,直到又一次中毒。原来是RealPlayer的
- 一:利用百度,谷歌搜索引擎,输入你要了解的广告联盟名字,看看他们有多少新闻报道,也能通过搜索看看他们有没有负面的新闻报道,要是负面新闻过多,
- 在centos7中,/etc/rc.d/rc.local文件的权限被降低了,没有执行权限,需要给它添加可执行权限。chmod +x /etc
- 1、把系统安装光盘插入,重启机器,启动时迅速按下Del键,进入CMOS,把启动顺序改为光盘先启动,这样就启动了Linux安装程序,按F5,按
- 中国电信最近对于Google若干服务(Google工具栏、Google拼音、Google Picasa等)的屏蔽是一个很特别的屏蔽,因为这些
- 安装CentOS7这里我们要安装CentOS7 64位,所以选择CentOS7 64位配置我们点击存储后,vmware会自动帮我们创建一个虚
- 作为一个新站长,我实在不想写这篇文章. 但是今天我发现我的一个小炒作竟然成功了.所以还是和大家分享一下这20多天的建站历程.我的网站是一个图
- 昨天呢,gnomeontherun.com上面冒出了一篇文章,Comparing Wordpress, Drupal, and Joomla
- 涉及程序:Microsoft IIS server描述:IIS使有权上传和使用asp程序的用户能更改任何文件详细:这是IIS的一个非常严重的
- 在vmware下安装完一台centos8服务后再进行复制后出现如下问题拷贝前的源centos与拷贝后的centos服务都没有了IP,需要重新
- 提示需要输入密钥,选择【我没有密钥】选择有桌面体验的自定义新建C盘 100G选择100G的主分区,下一步PS:未分配的空间,先不理,安装完系
- 一、Brigde——桥接:默认使用VMnet01、原理:Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中
- 本文来自2008年第一期电脑报(1.7日)a8-a10版介绍我们草根的站长故事。从互联网在中国出现的第一天起,它在社会大众心目中的印象,就和
- 启用网站的身份验证功能做好了上面的各项准备工作后,目标网站的SSL安全加密功能仍然还没有生效,此时我们还需要对该网站进行进一步的配置。按照前
- 作为个人站长,相信很大一部分的流量是来自百度,如果你做网站只要是想依靠网站来获取收入,那么可以说百度就是网站生存的衣食父母。当然除了一小部分