linux 环境编程学习笔记 第12天 curses(2)


寒假学习 第12天 (linux 高级编程)  笔记 总结

 

curses

接着前天

6.字符属性与颜色

判定终端是否支持颜色
bool has_colors();//都支持颜色,建议不判定
初始化颜色:
int start_color();
定义颜色对
int init_pair(short pair,short fore,short back);   init_pair 一定要放在 start_color()后面
使用颜色对
COLOR_PAIR(short pair)
设置属性
attron()开启属性
attroff()关闭属性
这组函数一定要在initscr后调用
背景函数:
bkgd();
例子见下面

7.输出字符串

int addstr(const char *);
int printw(const char *fmt, ...);
它们也有 mv×× mvw×× 等一系列函数

例子:

#include <curses.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    initscr();
    box(stdscr,0,0);

    start_color();    //初始化颜色
    init_pair(1,COLOR_CYAN,COLOR_WHITE);   //定义颜色对,init_pair()一定要放在start_color()后面
    init_pair(2,COLOR_RED,COLOR_BLACK);
    init_pair(3,COLOR_BLACK,COLOR_BLUE);


    bkgd(COLOR_PAIR(3));  //设置背景色

    mvaddch(2,10,ACS_PI|COLOR_PAIR(1));
    mvaddch(4,10,'A'|COLOR_PAIR(2));
    
    attron(COLOR_PAIR(1));  //想要加入下划线,粗体等 可以  COLOR_PAIR(1)|A_BOLD 等
    mvaddstr(6,10,"Hello");
    attroff(COLOR_PAIR(1));  //关闭属性 ,不一定要全部关闭,可以关闭你要的属性

    attron(COLOR_PAIR(2));
    mvprintw(8,10,"PID is %d\n",getpid());
    mvprintw(9,10,"lines:%d cols:%d\n",LINES,COLS);
    attroff(COLOR_PAIR(2));

    getch();

    endwin();
    return 0;
}
 
案例1:在屏幕显示时间
#include <curses.h>
#include <time.h>
#include <unistd.h>

void init();
void drawui();
void business();
void destroy();

int main(int argc, const char *argv[])
{
    init();
    drawui();
    business();
    destroy();

    return 0;
}


void init()
{
    initscr();
    start_color();
    init_pair(1,COLOR_RED,COLOR_BLUE);

}

void destroy()
{
    endwin();
}

void drawui()
{
    box(stdscr,0,0);
    bkgd(COLOR_PAIR(1));
}

void business()
{
    time_t tt;
    struct tm *t;
    while(1)
    {
        tt = time(0);      //获取时间
        t = localtime(&tt);

        mvprintw(LINES/2,COLS/2,"%03d/%02d/%02d %02d:%02d:%02d\n",
                t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
        refresh();  //刷新

        sleep(1);//停一秒钟
    }
}
 
案例2:显示登陆界面
#include <curses.h>
#include <unistd.h>
#include <string.h>

void init();
void drawLogin();
void destroy();

int main(int argc, const char *argv[])
{
   init();
   drawLogin();
   destroy();

   return 0;
}

void init()
{
    initscr();
    start_color();
    init_pair(1,COLOR_BLACK,COLOR_BLUE);
    init_pair(2,COLOR_RED,COLOR_BLUE);
}

void drawLogin()
{
    box(stdscr,0,0);
    bkgd(COLOR_PAIR(1));
    char *heads="Login";
    char *user="username [          ]";
    char *pass="pass     [          ]";

    attron(A_BOLD|COLOR_PAIR(2));

    mvaddstr(3,COLS/2,heads);
    mvaddstr(6,(COLS-strlen(user))/2,user);
    mvaddstr(8,(COLS-strlen(pass))/2,pass);
    attroff(A_BOLD);

    refresh();
}

void destroy()
{
    getch();
    endwin();
}


8.输入

int getch(void);         输入字符
int getstr(char *str);   输入字符串
int scanw(char *fmt, ...);   格式输入
int necho(void ); 禁止回显
int keypad(WINDOW *win, bool bf);   bf为TRUE 使功能键有效
 
例子1:
 
#include <curses.h>

int main(int argc, const char *argv[])
{
    initscr();
    int ch;

    noecho();

    while(1)
    {
        ch = mvgetch(5,10);
        mvprintw(8,10,"you input is:%c",ch);
    }

    endwin();
    return 0;
}

例子2:控制字母移动
#include <curses.h>

int main(int argc, const char *argv[])
{
    int ch;
    int x,y;
    initscr();
    keypad(stdscr,TRUE);
    
    noecho();
    y = LINES/2;
    x = COLS/2;
    mvaddch(y,x,'A');

    while(1)
    {
        ch = getch();
        mvaddch(y,x,' ');//等同于erase() ,也可用clear()
        switch(ch)
        {
        case KEY_UP:
            y--;
            break;
        case KEY_DOWN:
            y++;
            break;
        case KEY_LEFT:
            x--;
            break;
        case KEY_RIGHT:
            x++;
            break;
        }
        mvaddch(y,x,'A');
        refresh();
    }

    endwin();
    return 0;
}
 
 
 
例子3: 输入字符串
#include <curses.h>

int main(int argc, const char *argv[])
{
    char name[9];
    char pass[9];

    memset(name,0,9);

    initscr();
    
    mvaddstr(4,10,"user:[        ]");
    mvgetnstr(4,16,name,8);


    mvprintw(7,10,"your input is:%s\n",name);

    refresh();
    getch();

    
    endwin();
    return 0;
}

例子4:
格式输入
#include <curses.h>

void init();
void drawUi();
void dealInput();
void destroy();

int main(int argc, const char *argv[])
{
    init();
    drawUi();
    dealInput();
    destroy();

    return 0;
}

void init()
{
    initscr();
}

void destroy()
{
    endwin();
}

void drawUi()
{
    mvaddstr(2,2,"[     ]+[     ]=[      ]");
    refresh();
}

void dealInput()
{
    int a,b;
    while(1)
    {
        mvaddstr(2,2,"[     ]+[     ]");
        mvscanw(2,3,"%d",&a);
        mvscanw(2,11,"%d",&b);
        mvprintw(2,19,"%d",a+b);
        refresh();
    }

}

9.清屏

int erase(void); 相当与上面例子2中用的清屏,拷贝一个空白字符进去
int clear(void);  把整个清掉
int clrtobot(void); 从当前位置删到最后一行
int clrtoeol(void);从当前位置删到行尾
 

10.光标控制

void getsyx(int y, int x);  得到光标位置
void setsyx(int y, int x);  设置光标位置
int curs_set(int visibility);  设置光标是否可见
 

11.创建窗口

subwin()   //创建子窗口 坐标采用标准屏幕坐标
derwin()    //创建子窗口 坐标采用父窗体坐标
 
例子:
#include <curses.h>

int main(int argc, const char *argv[])
{
    WINDOW *w;
    initscr();
    box(stdscr,0,0);

    w=derwin(stdscr,4,20,5,3);
    box(w,0,0);

    refresh();
    wrefresh(w);
    getch();

    endwin();
    return 0;
}