08 屏幕编程curses库

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;
}

 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值