C指針原理教程之Ncurses介紹
1、安裝Ncurses
Ncurses是一個(gè)能提供功能鍵定義(快捷鍵),屏幕繪制以及基于文本終端的圖形互動(dòng)功能的動(dòng)態(tài)庫。
Ncurses是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫. Ncurses可以:
· 只要您喜歡,您可以使用整個(gè)屏幕
· 創(chuàng)建和管理一個(gè)窗口
· 使用8種不同的彩色
· 為您的程序提供鼠標(biāo)支持
· 使用鍵盤上的功能鍵
Ubuntu下
mysea@mysea-desktop:~$ sudo apt-get install libncurses5-dbg libncurses5-dev mysea@mysea-desktop:~/test$ gcc -lncurses -o cursestest cursestest.c
Freebsd下
cd /usr/ports/devel/ncurses-devel make install clean
2、hello,world
#include <curses.h> int main(void){ initscr();//初始化 box(stdscr,ACS_VLINE,ACS_HLINE);//畫邊框 mvaddstr(15,2,"hello,world");//在15,2顯示字符串 refresh();//刷新屏幕 getch();//等待按鍵 endwin();//結(jié)束 return 0; }
編譯及運(yùn)行
dp@dp:~/cursestest % gcc -lncurses 1.c -o mytest dp@dp:~/cursestest % ./mytest
3、色彩
然后編寫下面代碼:
#include <ncurses.h> #include <locale.h> #include <stdio.h> int main(void){ //init_pair(short index,short foreground,short background)初始化顏色索引 //attron(COLOR_PAIR(索引號(hào))|屬性) setlocale(LC_ALL,""); initscr();//初始化 box(stdscr,ACS_VLINE,ACS_HLINE);//畫邊框 if (!has_colors()||start_color()==ERR){ endwin(); printf("終端不支持顏色\n"); return 0; } init_pair(1,COLOR_GREEN,COLOR_BLACK); init_pair(2,COLOR_RED,COLOR_BLACK); init_pair(3,COLOR_WHITE,COLOR_BLUE); int i=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();//結(jié)束
執(zhí)行
4、對(duì)中文的支持
dp@dp:~/cursestest % cat 1.c #include <ncurses.h> #include <locale.h> #include <stdio.h> int main(void){ //init_pair(short index,short foreground,short background)初始化顏色索引 //attron(COLOR_PAIR(索引號(hào))|屬性) setlocale(LC_ALL,""); initscr();//初始化 box(stdscr,ACS_VLINE,ACS_HLINE);//畫邊框 if (!has_colors()||start_color()==ERR){ endwin(); printf("終端不支持顏色\n"); return 0; } init_pair(1,COLOR_GREEN,COLOR_BLACK); init_pair(2,COLOR_RED,COLOR_BLACK); init_pair(3,COLOR_WHITE,COLOR_BLUE); int i=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();//結(jié)束 return 0; }
編譯時(shí)注意要使用ncursesw庫,不使用ncurses庫
dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest dp@dp:~/cursestest % ./mytest
5、窗口與子窗口
dp@dp:~/cursestest % cat 1.c
#include <ncurses.h> #include <locale.h> int main(){ //init_pair(short index,short foreground,short background)初始化顏色索引 //attron(COLOR_PAIR(索引號(hào))|屬性) //newwin建立窗口,derwin建立窗口的子窗口(相對(duì)于父窗口相對(duì)位置),subwin建立窗口的子窗口(相對(duì)于根窗口絕對(duì)位置) 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,"您好,很高興認(rèn)識(shí)您"); 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,"您好,很高興認(rèn)識(shí)您"); subwin=derwin(win2,3,20,3,5); //子窗口 box(subwin,ACS_VLINE,ACS_HLINE); mvwprintw(subwin,1,5,"按任意鍵退出");//(窗口,y,x,字符串) refresh();//刷新整個(gè)大窗口stdscr wrefresh(win1); wrefresh(win2); touchwin(win1);//轉(zhuǎn)換當(dāng)前窗口為win1 wrefresh(win1); getch();//win1顯示完,等待按鍵顯示win2 touchwin(win2);//轉(zhuǎn)換當(dāng)前窗口為win2 //使用doupdate,可以事先定義要刷新的部分,然后刷新 wnoutrefresh(win2); wnoutrefresh(subwin); doupdate(); getch();//等待按鍵 delwin(win1); delwin(subwin); delwin(win2); endwin();//結(jié)束 return 0; }
dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest
dp@dp:~/cursestest % ./mytest
6、自動(dòng)滾屏
dp@dp:~/cursestest % cat 2.c
#include <ncurses.h> #include <locale.h> int main(void){ int y,x,i,j,h,w; setlocale(LC_ALL,""); WINDOW *pad; initscr();//初始化 getmaxyx(stdscr,h,w);//獲得屏幕尺寸 //畫背景 for(i=0;i<h;i++){ for(j=0;j<w;j++){ mvaddch(i,j,ACS_CKBOARD); } } refresh(); //建立窗口 pad=newpad(80,90); for (i=0;i<80;i++){ char line[90]; sprintf(line,"line %d\n",i); mvwprintw(pad,i,1,line); } refresh(); prefresh(pad,0,1,5,10,20,25);//刷新pad。0,1 為基墊需要顯示區(qū)域的左上角置(行列對(duì),以下同此)。5,10,20,45為屏幕顯示區(qū)域的左上角和右下角位置 for(i=0;i<65;i++){ prefresh(pad,i+1,1,5,10,20,25);//刷新pad,實(shí)現(xiàn)流屏; usleep(30000); } getch();//等待按鍵 delwin(pad); endwin();//結(jié)束 return 0; }
dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest
dp@dp:~/cursestest % ./mytest
7、在窗口中移動(dòng)光標(biāo)
dp@dp:~/cursestest % cat 2.c
#include <ncurses.h> #include <locale.h> int main(void){ //init_pair(short index,short foreground,short background)初始化顏色索引 //attron(COLOR_PAIR(索引號(hào))|屬性) //newwin建立窗口,derwin建立窗口的子窗口(相對(duì)于父窗口相對(duì)位置),subwin建立窗的子窗口(相對(duì)于根窗口絕對(duì)位置) int x,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);//移動(dòng)某窗口的光標(biāo) printw("WIN2"); wmove(win2,2,1);//移動(dòng)某窗口的光標(biāo)。(窗口,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();//刷新整個(gè)大窗口stdscr wrefresh(win1); wrefresh(win2); move(5,60);//在stdscr移動(dòng)光標(biāo) printw("hello........."); touchwin(win1);//轉(zhuǎn)換當(dāng)前窗口為win1 wrefresh(win1); getch();//win1顯示完,等待按鍵顯示win2 touchwin(win2);//轉(zhuǎn)換當(dāng)前窗口為win2 //使用doupdate,可以事先定義要刷新的部分,然后刷新 wnoutrefresh(win2); wnoutrefresh(subwin); doupdate(); getyx(subwin,y,x);//獲得當(dāng)前邏輯光標(biāo)位置 mvwprintw(subwin,y+1,x,"................");//在“按任意鍵退出"下一行輸出"..............." getch();//等待按鍵 delwin(win1); delwin(subwin); delwin(win2); endwin();//結(jié)束 return 0; }
編譯后運(yùn)行
dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest
dp@dp:~/cursestest % ./mytest
8、菜單
dp@dp:~/cursestest % cat 2.c
#include <locale.h> #include <menu.h> #include <stdio.h> #include <ctype.h> //定義菜單項(xiàng) static const char *menus[]={ "1-1","1-2","1-3","2-1","2-2","2-3" }; #define CITEM sizeof(menus)/sizeof(menus[0])//菜單項(xiàng)數(shù) ITEM *items[CITEM]; int main(int argc,char *argv[]){ int i; int ch; int mrows,mcols; WINDOW *win,*subwin; MENU *mymenu; //初始化屏幕 initscr(); //不用等待回車鍵 cbreak(); //不回顯 noecho(); //可以處理功能鍵 keypad(stdscr,TRUE); //建立菜單項(xiàng) for(i=0;i<CITEM;i++){ items[i]=new_item(menus[i],menus[i]);//第二個(gè)參數(shù)為菜單項(xiàng)的描述 } //建立菜單 mymenu=new_menu(items); set_menu_format(mymenu,CITEM,1); //設(shè)置CITEM行1列的菜單 set_menu_mark(mymenu,">");//菜單選中的MARK //獲得菜單的行列數(shù) 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); //設(shè)置菜單的窗口 set_menu_sub(mymenu,subwin); //在子窗口上放置菜單 post_menu(mymenu); refresh(); wrefresh(win); //獲得輸入,并移動(dòng)選擇到相應(yīng)的菜單項(xiàng) while(toupper(ch=wgetch(win))!='\n'){ if(ch==KEY_DOWN) menu_driver(mymenu,REQ_DOWN_ITEM);//移動(dòng)菜單選擇 else if(ch==KEY_RIGHT) menu_driver(mymenu,REQ_RIGHT_ITEM); else if (ch==KEY_UP) menu_driver(mymenu,REQ_UP_ITEM); else if (ch==KEY_LEFT) menu_driver(mymenu,REQ_LEFT_ITEM); } //輸出當(dāng)前項(xiàng) mvprintw(LINES-2,0,"you select the item :%s\n",item_name(current_item(mymenu))); refresh(); unpost_menu(mymenu); getch(); //釋放內(nèi)存 free_menu(mymenu); for(i=0;i<CITEM;i++) free_item(items[i]); endwin(); return 1; }
編譯并運(yùn)行
dp@dp:~/cursestest % gcc -lncursesw -lmenu 2.c -o mytest
dp@dp:~/cursestest % ./mytest
您可能感興趣的文章
- 01-10深入理解數(shù)組指針與指針數(shù)組的區(qū)別
- 01-10基于C++輸出指針自增(++)運(yùn)算的示例分析
- 01-10解析sizeof, strlen, 指針以及數(shù)組作為函數(shù)參數(shù)的應(yīng)用
- 01-10探討C++中數(shù)組名與指針的用法比較分析
- 01-10深入理解雙指針的兩種用法
- 01-10libxml教程(圖文詳解)
- 01-10C語言數(shù)組指針的小例子
- 01-10基于SVN源碼服務(wù)器搭建(詳細(xì)教程分析)
- 01-10解析如何用指針實(shí)現(xiàn)整型數(shù)據(jù)的加法
- 01-10深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子