源码安装 ncurses6

本文详细介绍了如何在Linux环境下安装和配置ncurses库,包括下载源码、配置编译选项以及提供了一系列C语言应用示例,涉及窗口管理、颜色控制和菜单操作。
摘要由CSDN通过智能技术生成

1, 安装 ncurses

1.1 下载源码

源码网址:

http://ftp.gnu.org/gnu/ncurses/

下载:

wget  http://ftp.gnu.org/gnu/ncurses/ncurses-6.4.tar.gz

解压

tar zxf  ncurses-6.4.tar.gz

1.2 安装ncurses

配置

cd ncurses6.4/
./configure

如果计划安装在 非系统默认目录,可以自己配置

加入计划安装在  /home/hanmeimei/ncur/local

./configure --prefix=/home/hanmeimei/ncur/local

编译

make -j

make install

2,应用示例

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
   
int main()  {
    initscr();
    move( 5, 15 );
    printw( "%s", "Hello world" );
    refresh();
    sleep(2);
    endwin();
    exit(EXIT_SUCCESS);
}


//


#include <curses.h>

int main(void){

  initscr();//初始化

  box(stdscr,ACS_VLINE,ACS_HLINE);//画边框

  mvaddstr(15,2,"hello,world");//在15,2显示字符串

  refresh();//刷新屏幕

  getch();//等待按键

  endwin();//结束

  return 0;  

}

//

#include <string.h>
#include <ncurses.h>

int main(int argc,char* argv[]){
    initscr();//初始化curses窗口
    raw();//这个函数会阻止字符缓冲,令程序即时处理键盘输入,一些终端命令(中断[Ctrl-c],挂起[Ctrl-z])也会被交给程序处理
    noecho();//屏蔽输入字符显示,键盘输入的字符将不被显示
    curs_set(0);//调用会屏蔽掉物理指针

    char* c = "My First Window";

    mvprintw(LINES/2,(COLS-strlen(c))/2,c);//输出字符串,三个参数分别为x位置,y位置和字符指针
    refresh();//刷新屏幕

    getch();//c语言函数
    endwin();//关闭窗口

    return 0;
}


//

#include <ncurses.h>
#include <locale.h>
#include <stdio.h>

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();//结束
}


//

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(索引号)|属性)

  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;  

}

//


#include <ncurses.h>
#include <locale.h>
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;  
}

//

#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 为基垫需要显示区域的左上角置(行列对,以下同此)。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;  

}


//

#include <ncurses.h>

#include <locale.h>

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;  

}


//


#include <locale.h>

#include <menu.h>

#include <stdio.h>

#include <ctype.h>

//定义菜单项

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<CITEM;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<CITEM;i++) free_item(items[i]);

  endwin();

  return 1;

}


//

#include <locale.h>

#include <menu.h>

#include <stdio.h>

#include <ctype.h>

//定义菜单项

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<CITEM;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<CITEM;i++) free_item(items[i]);

  endwin();

  return 1;

}


//

EXE := hello_ncurses

all: $(EXE)

%: %.c
    g++ test.c -lncurses -lmenu && test.out

.PHONY: clean
clean:
    ${RM} $(EXE)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值