C指针原理教程之Ncurses介绍
1、安装Ncurses
Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。
Ncurses是一个能提供基于文本终端窗口功能的动态库.Ncurses可以:
·只要您喜欢,您可以使用整个屏幕
·创建和管理一个窗口
·使用8种不同的彩色
·为您的程序提供鼠标支持
·使用键盘上的功能键
Ubuntu下
mysea@mysea-desktop:~$sudoapt-getinstalllibncurses5-dbglibncurses5-dev mysea@mysea-desktop:~/test$gcc-lncurses-ocursestestcursestest.c
Freebsd下
cd/usr/ports/devel/ncurses-devel makeinstallclean
2、hello,world
#includeintmain(void){ initscr();//初始化 box(stdscr,ACS_VLINE,ACS_HLINE);//画边框 mvaddstr(15,2,"hello,world");//在15,2显示字符串 refresh();//刷新屏幕 getch();//等待按键 endwin();//结束 return0; }
编译及运行
dp@dp:~/cursestest%gcc-lncurses1.c-omytest dp@dp:~/cursestest%./mytest
3、色彩
然后编写下面代码:
#include#include #include intmain(void){ //init_pair(shortindex,shortforeground,shortbackground)初始化颜色索引 //attron(COLOR_PAIR(索引号)|属性) setlocale(LC_ALL,""); initscr();//初始化 box(stdscr,ACS_VLINE,ACS_HLINE);//画边框 if(!has_colors()||start_color()==ERR){ endwin(); printf("终端不支持颜色\n"); return0; } init_pair(1,COLOR_GREEN,COLOR_BLACK); init_pair(2,COLOR_RED,COLOR_BLACK); init_pair(3,COLOR_WHITE,COLOR_BLUE); inti=0; for(i=1;i<=3;i++){ attron(COLOR_PAIR(i)); move(i,10); printw("hello,world:%d",i); } for(i=1;i<=3;i++){ attron(COLOR_PAIR(i)|A_UNDERLINE); move(i+5,10); printw("hello,world:%d",i); } refresh();//刷新屏幕 getch();//等待按键 endwin();//结束
执行
4、对中文的支持
dp@dp:~/cursestest%cat1.c #include#include #include intmain(void){ //init_pair(shortindex,shortforeground,shortbackground)初始化颜色索引 //attron(COLOR_PAIR(索引号)|属性) setlocale(LC_ALL,""); initscr();//初始化 box(stdscr,ACS_VLINE,ACS_HLINE);//画边框 if(!has_colors()||start_color()==ERR){ endwin(); printf("终端不支持颜色\n"); return0; } init_pair(1,COLOR_GREEN,COLOR_BLACK); init_pair(2,COLOR_RED,COLOR_BLACK); init_pair(3,COLOR_WHITE,COLOR_BLUE); inti=0; for(i=1;i<=3;i++){ attron(COLOR_PAIR(i)); move(i,10); printw("hello,世界%d",i); } for(i=1;i<=3;i++){ attron(COLOR_PAIR(i)|A_UNDERLINE); move(i+5,10); printw("hello,世界:%d",i); } refresh();//刷新屏幕 getch();//等待按键 endwin();//结束 return0; }
编译时注意要使用ncursesw库,不使用ncurses库
dp@dp:~/cursestest%gcc-lncursesw1.c-omytest dp@dp:~/cursestest%./mytest
5、窗口与子窗口
dp@dp:~/cursestest%cat1.c
#include#include intmain(){ //init_pair(shortindex,shortforeground,shortbackground)初始化颜色索引 //attron(COLOR_PAIR(索引号)|属性) //newwin建立窗口,derwin建立窗口的子窗口(相对于父窗口相对位置),subwin建立窗口的子窗口(相对于根窗口绝对位置) setlocale(LC_ALL,""); WINDOW*win1,*win2,*subwin; initscr();//初始化 win1=newwin(15,50,1,1);//新窗口(行,列,begin_y,begin_x) box(win1,ACS_VLINE,ACS_HLINE); mvwprintw(win1,1,1,"WIN1"); mvwprintw(win1,2,1,"您好,很高兴认识您"); win2=newwin(10,40,10,30);//新窗口(行,列,begin_y,begin_x) box(win2,ACS_VLINE,ACS_HLINE); mvwprintw(win2,1,1,"WIN2"); mvwprintw(win2,2,1,"您好,很高兴认识您"); subwin=derwin(win2,3,20,3,5);//子窗口 box(subwin,ACS_VLINE,ACS_HLINE); mvwprintw(subwin,1,5,"按任意键退出");//(窗口,y,x,字符串) refresh();//刷新整个大窗口stdscr wrefresh(win1); wrefresh(win2); touchwin(win1);//转换当前窗口为win1 wrefresh(win1); getch();//win1显示完,等待按键显示win2 touchwin(win2);//转换当前窗口为win2 //使用doupdate,可以事先定义要刷新的部分,然后刷新 wnoutrefresh(win2); wnoutrefresh(subwin); doupdate(); getch();//等待按键 delwin(win1); delwin(subwin); delwin(win2); endwin();//结束 return0; }
dp@dp:~/cursestest%gcc-lncursesw1.c-omytest
dp@dp:~/cursestest%./mytest
6、自动滚屏
dp@dp:~/cursestest%cat2.c
#include#include intmain(void){ inty,x,i,j,h,w; setlocale(LC_ALL,""); WINDOW*pad; initscr();//初始化 getmaxyx(stdscr,h,w);//获得屏幕尺寸 //画背景 for(i=0;i dp@dp:~/cursestest%gcc-lncursesw2.c-omytest
dp@dp:~/cursestest%./mytest
7、在窗口中移动光标
dp@dp:~/cursestest%cat2.c
#include#include intmain(void){ //init_pair(shortindex,shortforeground,shortbackground)初始化颜色索引 //attron(COLOR_PAIR(索引号)|属性) //newwin建立窗口,derwin建立窗口的子窗口(相对于父窗口相对位置),subwin建立窗的子窗口(相对于根窗口绝对位置) intx,y; setlocale(LC_ALL,""); WINDOW*win1,*win2,*subwin; initscr();//初始化 win1=newwin(15,50,1,1);//新窗口(行,列,begin_y,begin_x) box(win1,ACS_VLINE,ACS_HLINE); mvwprintw(win1,1,1,"WIN1"); mvwprintw(win1,2,1,"myhaspl@myhaspl.com"); win2=newwin(10,40,10,30);//新窗口(行,列,begin_y,begin_x) box(win2,ACS_VLINE,ACS_HLINE); wmove(win2,1,1);//移动某窗口的光标 printw("WIN2"); wmove(win2,2,1);//移动某窗口的光标。(窗口,y,x) printw("myhaspl@myhaspl.com"); subwin=derwin(win2,3,20,4,5);//子窗口 box(subwin,ACS_VLINE,ACS_HLINE); mvwprintw(subwin,1,5,"按任意键退出");//(窗口,y,x,字符串) refresh();//刷新整个大窗口stdscr wrefresh(win1); wrefresh(win2); move(5,60);//在stdscr移动光标 printw("hello........."); touchwin(win1);//转换当前窗口为win1 wrefresh(win1); getch();//win1显示完,等待按键显示win2 touchwin(win2);//转换当前窗口为win2 //使用doupdate,可以事先定义要刷新的部分,然后刷新 wnoutrefresh(win2); wnoutrefresh(subwin); doupdate(); getyx(subwin,y,x);//获得当前逻辑光标位置 mvwprintw(subwin,y+1,x,"................");//在“按任意键退出"下一行输出"..............." getch();//等待按键 delwin(win1); delwin(subwin); delwin(win2); endwin();//结束 return0; } 编译后运行
dp@dp:~/cursestest%gcc-lncursesw2.c-omytest
dp@dp:~/cursestest%./mytest
8、菜单
dp@dp:~/cursestest%cat2.c
#include#include #include #include //定义菜单项 staticconstchar*menus[]={ "1-1","1-2","1-3","2-1","2-2","2-3" }; #defineCITEMsizeof(menus)/sizeof(menus[0])//菜单项数 ITEM*items[CITEM]; intmain(intargc,char*argv[]){ inti; intch; intmrows,mcols; WINDOW*win,*subwin; MENU*mymenu; //初始化屏幕 initscr(); //不用等待回车键 cbreak(); //不回显 noecho(); //可以处理功能键 keypad(stdscr,TRUE); //建立菜单项 for(i=0;i ");//菜单选中的MARK //获得菜单的行列数 scale_menu(mymenu,&mrows,&mcols); //建立窗口和子窗口 win=newwin(mrows+2,mcols+2,3,30); keypad(win,TRUE); box(win,0,0); subwin=derwin(win,0,0,1,1); //设置菜单的窗口 set_menu_sub(mymenu,subwin); //在子窗口上放置菜单 post_menu(mymenu); refresh(); wrefresh(win); //获得输入,并移动选择到相应的菜单项 while(toupper(ch=wgetch(win))!='\n'){ if(ch==KEY_DOWN) menu_driver(mymenu,REQ_DOWN_ITEM);//移动菜单选择 elseif(ch==KEY_RIGHT) menu_driver(mymenu,REQ_RIGHT_ITEM); elseif(ch==KEY_UP) menu_driver(mymenu,REQ_UP_ITEM); elseif(ch==KEY_LEFT) menu_driver(mymenu,REQ_LEFT_ITEM); } //输出当前项 mvprintw(LINES-2,0,"youselecttheitem:%s\n",item_name(current_item(mymenu))); refresh(); unpost_menu(mymenu); getch(); //释放内存 free_menu(mymenu); for(i=0;i 编译并运行
dp@dp:~/cursestest%gcc-lncursesw-lmenu2.c-omytest
dp@dp:~/cursestest%./mytest