热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C指针原理教程之Ncurses介绍

Ncurses提供字符终端处理库,包括面板和菜单。为了能够使用ncurses库,您必须在您的源程序中将curses.h包括(include)进来,而且在编译的需要与它连接起来.在gcc中您可以使用参数-lcurses进行编译.

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、窗口与子窗口

dp@dp:~/cursestest % cat 1.c

#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、自动滚屏

dp@dp:~/cursestest % cat 2.c

#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

dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest

dp@dp:~/cursestest % ./mytest

7、在窗口中移动光标

dp@dp:~/cursestest % cat 2.c

#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

dp@dp:~/cursestest % ./mytest

8、菜单

dp@dp:~/cursestest % cat 2.c

#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");//菜单选中的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

编译并运行

dp@dp:~/cursestest % gcc -lncursesw -lmenu 2.c -o mytest

dp@dp:~/cursestest % ./mytest


推荐阅读
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 本文讨论了在Linux系统中,使用chown命令将django项目目录下的static目录的拥有者从root改为eureka的问题。作者尝试了多种命令,包括chown和sudo chown等,但都没有成功修改拥有者。文章提供了相关目录的权限信息,并补充了项目所在磁盘和操作系统的信息。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 在ubuntu服务器上安装vscode,但是目前使用的方法都无法成功。第一次安装经历:安装完anaconda后有自动安装vscode的选项,输入yes后,没有出现错误,但是在终端输 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
赵庭洪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有