在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 │
│ │
│ _ (游标) │
│ │
└—————————————————————————————┘


标签:unix,c语言,屏幕
0
投稿

猜你喜欢

  • win10使用清华源快速安装pytorch-GPU版(推荐)

    2021-05-01 03:18:57
  • CentOS 7下用firewall-cmd控制端口与端口转发详解

    2023-11-01 05:33:21
  • linux服务器后台设置小技巧

    2023-03-30 15:28:28
  • 囧详解:囧怎么读 囧是什么意思

    2008-07-22 19:23:00
  • 教你巧用Discuz!7.0后台防灌水功能

    2009-03-22 14:24:00
  • Apache服务器主配置文件httpd.conf详解

    2021-06-08 17:23:32
  • zblog新版后台功能预览

    2012-07-25 18:38:40
  • “活着”和“不违背价值观”

    2010-03-24 12:01:00
  • 网站防篡改 立即部署WEB应用防火墙(图)

    2009-05-28 08:45:00
  • 中国商业网址经验谈之网站评论体系

    2009-02-03 08:42:00
  • DEDE首页digg 效果

    2009-02-13 16:57:00
  • Windows 2003的Web服务器配置方法

    2007-09-10 10:50:00
  • 提高内容类网站粘度的常见方法

    2009-07-16 16:12:00
  • arm linux利用alsa驱动并使用usb音频设备

    2023-08-14 23:56:52
  • 设置UCenter Home好友上限与“150法则”

    2009-04-15 07:18:00
  • APACHE 配置文件中文版 httpd.conf FOR Apache 2.2.13

    2021-02-11 15:08:59
  • 浅谈docker-compose网络设置之networks

    2023-05-11 14:17:19
  • 微软180度大转弯 否认Windows7借鉴Mac OS

    2009-11-13 08:29:00
  • VMware安装Centos7超详细过程(图文)

    2022-04-25 18:43:49
  • GoDaddy:如何设置目录文件权限

    2010-04-26 12:56:00
  • asp之家 网站运营 m.aspxhome.com