寒假学习 第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();
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);//停一秒钟 } }
#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; }