ncurses下c语言定位光标,C指针原理教程之Ncurses介绍
1、安裝Ncurses
Ncurses是一個能提供功能鍵定義(快捷鍵),屏幕繪制以及基于文本終端的圖形互動功能的動態庫。
Ncurses是一個能提供基于文本終端窗口功能的動態庫. Ncurses可以:
· 只要您喜歡,您可以使用整個屏幕
· 創建和管理一個窗口
· 使用8種不同的彩色
· 為您的程序提供鼠標支持
· 使用鍵盤上的功能鍵
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
int main(void){
initscr();//初始化
box(stdscr,ACS_VLINE,ACS_HLINE);//畫邊框
mvaddstr(15,2,"hello,world");//在15,2顯示字符串
refresh();//刷新屏幕
getch();//等待按鍵
endwin();//結束
return 0;
}
編譯及運行
dp@dp:~/cursestest % gcc -lncurses 1.c -o mytest
dp@dp:~/cursestest % ./mytest
3、色彩
然后編寫下面代碼:
#include
#include
#include
int main(void){
//init_pair(short index,short foreground,short background)初始化顏色索引
//attron(COLOR_PAIR(索引號)|屬性)
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();//結束
執行
4、對中文的支持
dp@dp:~/cursestest % cat 1.c
#include
#include
#include
int main(void){
//init_pair(short index,short foreground,short background)初始化顏色索引
//attron(COLOR_PAIR(索引號)|屬性)
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();//結束
return 0;
}
編譯時注意要使用ncursesw庫,不使用ncurses庫
dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest
dp@dp:~/cursestest % ./mytest
5、窗口與子窗口
#include
#include
int main(){
//init_pair(short index,short foreground,short background)初始化顏色索引
//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();//結束
return 0;
}
dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest
dp@dp:~/cursestest % ./mytest
6、自動滾屏
#include
#include
int main(void){
int y,x,i,j,h,w;
setlocale(LC_ALL,"");
WINDOW *pad;
initscr();//初始化
getmaxyx(stdscr,h,w);//獲得屏幕尺寸
//畫背景
for(i=0;i
for(j=0;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 為基墊需要顯示區域的左上角置(行列對,以下同此)。5,10,20,45為屏幕顯示區域的左上角和右下角位置
for(i=0;i<65;i++){
prefresh(pad,i+1,1,5,10,20,25);//刷新pad,實現流屏;
usleep(30000);
}
getch();//等待按鍵
delwin(pad);
endwin();//結束
return 0;
}
dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest
7、在窗口中移動光標
#include
#include
int main(void){
//init_pair(short index,short foreground,short background)初始化顏色索引
//attron(COLOR_PAIR(索引號)|屬性)
//newwin建立窗口,derwin建立窗口的子窗口(相對于父窗口相對位置),subwin建立窗的子窗口(相對于根窗口絕對位置)
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);//移動某窗口的光標
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();//結束
return 0;
}
編譯后運行
dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest
8、菜單
#include
#include
#include
#include
//定義菜單項
static const char *menus[]={
"1-1","1-2","1-3","2-1","2-2","2-3"
};
#define CITEM sizeof(menus)/sizeof(menus[0])//菜單項數
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);
//建立菜單項
for(i=0;i
items[i]=new_item(menus[i],menus[i]);//第二個參數為菜單項的描述
}
//建立菜單
mymenu=new_menu(items);
set_menu_format(mymenu,CITEM,1); //設置CITEM行1列的菜單
set_menu_mark(mymenu,">");//菜單選中的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);//移動菜單選擇
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);
}
//輸出當前項
mvprintw(LINES-2,0,"you select the item :%s\n",item_name(current_item(mymenu)));
refresh();
unpost_menu(mymenu);
getch();
//釋放內存
free_menu(mymenu);
for(i=0;i
endwin();
return 1;
}
編譯并運行
dp@dp:~/cursestest % gcc -lncursesw -lmenu 2.c -o mytest
總結
以上是生活随笔為你收集整理的ncurses下c语言定位光标,C指针原理教程之Ncurses介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python selenium 下载文件
- 下一篇: eclipse java的jvm匹配_e