寒假学习 第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;
}