1、屏幕编程curses库
curses库是一组函数,是用来设置光标位置和终端屏幕上显示的字符样式。curses将屏幕看成二维网格,原点是屏幕左上角,行坐标自上往下递增,列坐标自左向右递增。基本的curses函数:
- initscr():初始化curses库和tty
- endwin():关闭curses并重置tty
- refresh():使屏幕按照你的意图显示
- move(x,y):移动光标到屏幕(x,y)位置
- addstr(s):在当前位置画字符串s
- addch(c):在当前位置画字符c
- clear():清屏
- standout():启动standout模式(一般使屏幕反色)
- standend():关闭standout模式
2、curses内部工作原理
真实屏幕是眼前的一个字符数组。curses保留了屏幕的两个内部版本。一个内部屏幕是真实屏幕的复制。另一个是工作屏幕,其上记录了对屏幕的改动。每个函数,如move都只在工作屏幕上进行修改。工作屏幕就像磁盘缓存,curses中的大部分函数都只对它进行修改。refresh函数比较工作屏幕和真实屏幕的差异。然后refresh通过终端驱动送出那些能使真实屏幕与工作屏幕一致的字符串和控制码。
3、使用curses库屏幕编程例子
hello1.c
展示一个curses程序的基本逻辑
#include<stdio.h>
#include<curses.h>
int main()
{
initscr();
clear();
move(10,20);
addstr("Hello,world");
move(LINES-1,0);
refresh();
getch();
endwin();
return 0;
}
hello2.c
将curses函数与循环、变量和其他函数组合在一起产生更复杂的显示效果
#include<stdio.h>
#include<curses.h>
int main()
{
int i;
initscr();
clear();
for(i=0;i<LINES;i++)
{
move(i,i+i);
if(i%2==1)
standout();
addstr("Hello,world");
if(i%2==1)
standend();
}
refresh();
getch();
endwin();
return 0;
}
hello3.c
在curses程序中添加时间响应
#include<stdio.h>
#include<curses.h>
int main()
{
int i;
initscr();
clear();
for(i=0;i<LINES;i++)
{
move(i,i+i);
if(i%2==1)
standout();
addstr("Hello,world");
if(i%2==1)
standend();
sleep(1);
refresh();
}
endwin();
return 0;
}
hello4.c
创造移动的假象,两次请求之后通过调用refresh来保证每次循环后旧的影像消失,新的影像显示
#include<stdio.h>
#include<curses.h>
int main()
{
int i;
initscr();
clear();
for(i=0;i<LINES;i++)
{
move(i,i+i);
if(i%2==1)
standout();
addstr("Hello,world");
if(i%2==1)
standend();
refresh();
sleep(1);
move(i,i+i);
addstr(" ");
}
endwin();
return 0;
}
hello5.c
使用变量dir来控制字符串的移动速度
#include<stdio.h>
#include<curses.h>
#define LEFTEDGE 10
#define RIGHTEDGE 30
#define ROW 10
int main()
{
char *message="Hello";
char *blank=" ";
int dir=1;
int pos=LEFTEDGE;
initscr();
clear();
while(1)
{
move(ROW,pos);
addstr(message);
move(LINES-1,COLS-1); //park the cursor at (LINES-1,COLS-1)
refresh();
sleep(1);
move(ROW,pos);
addstr(blank);
pos+=dir;
if(pos>=RIGHTEDGE)
dir=-1;
if(pos<=LEFTEDGE)
dir=1;
}
return 0;
}