日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C指针原理(29)-Ncurses-文本终端的图形

發(fā)布時(shí)間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C指针原理(29)-Ncurses-文本终端的图形 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、安裝Ncurses

Ncurses是一個(gè)能提供功能鍵定義(快捷鍵),屏幕繪制以及基于文本終端的圖形互動(dòng)功能的動(dòng)態(tài)庫(kù)。

Ncurses是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫(kù). Ncurses可以:

· 只要您喜歡,您可以使用整個(gè)屏幕

· 創(chuàng)建和管理一個(gè)窗口

· 使用8種不同的彩色

· 為您的程序提供鼠標(biāo)支持

· 使用鍵盤(pán)上的功能鍵

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);//畫(huà)邊框mvaddstr(15,2,"hello,world");//在15,2顯示字符串refresh();//刷新屏幕getch();//等待按鍵endwin();//結(jié)束return 0; } 編譯及運(yùn)行dp@dp:~/cursestest % gcc -lncurses 1.c -o mytestdp@dp:~/cursestest % ./mytest

3、色彩

然后編寫(xiě)下面代碼:

#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);//畫(huà)邊框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);//畫(huà)邊框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庫(kù),不使用ncurses庫(kù)

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è)大窗口stdscrwrefresh(win1);wrefresh(win2);touchwin(win1);//轉(zhuǎn)換當(dāng)前窗口為win1wrefresh(win1);getch();//win1顯示完,等待按鍵顯示win2touchwin(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);//獲得屏幕尺寸 //畫(huà)背景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();//不用等待回車(chē)鍵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

總結(jié)

以上是生活随笔為你收集整理的C指针原理(29)-Ncurses-文本终端的图形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。