08 屏幕编程curses库

tech2024-09-28  14

1、屏幕编程curses库

curses库是一组函数,是用来设置光标位置和终端屏幕上显示的字符样式。curses将屏幕看成二维网格,原点是屏幕左上角,行坐标自上往下递增,列坐标自左向右递增。基本的curses函数:

initscr():初始化curses库和ttyendwin():关闭curses并重置ttyrefresh():使屏幕按照你的意图显示move(x,y):移动光标到屏幕(x,y)位置addstr(s):在当前位置画字符串saddch(c):在当前位置画字符cclear():清屏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; }

 

 
最新回复(0)