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 <curses.h>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 mytestdp@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(索引号)|属性)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 <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;    }

编译时注意要使用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(索引号)|属性)
//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();//刷新整个大窗口stdscrwrefresh(win1);wrefresh(win2);touchwin(win1);//转换当前窗口为win1wrefresh(win1);getch();//win1显示完,等待按键显示win2touchwin(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 <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;

}

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

dp@dp:~/cursestest % ./mytest

7、在窗口中移动光标

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

编译并运行

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

dp@dp:~/cursestest % ./mytest

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

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

    下面使用getwin和putwin完成对窗口内容的保存,而不是对整个屏幕,同时修正程序的几个小错误: 1.下面的操作提示在多次操作后会出现混乱. 2.退出后,endwin结束窗口,并且退出curses ...

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

    9.Ncurses的初始化相关工作 (1)raw()和cbreak() 禁止行缓冲,在raw()函数模式下,处理挂起(CTRLZ).中断或退出(CTRLC)等控制字符时,将直接传送给程序去处理而不产生 ...

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

    下面将全屏编辑器修改一下,通过panel的支持,让它能同时打开3个窗口编辑不同的内容,同时对3个窗口的内容进行保存. 效果如下: #include <locale.h>#include & ...

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

    键盘管理 我们打造一个简单的单屏编辑器 首先构造一个仅带输入功能的编辑器,使用wgetch来捕捉输入. #include <locale.h>#include <stdio.h> ...

  5. Objective-C中,ARC下的 strong和weak指针原理解释

    Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...

  6. Python 文本终端 GUI 框架,太酷了

    来源:Python技术 上次发了一篇基于 Webview 的图形界面的程序 制作后,有读者询问:有没有基于文本中终端的 GUI 开发框架? 今天笔者就带大家,梳理几个常见的基于文本终端的 UI 框架, ...

  7. iOS arc weak指针原理

    iOS arc weak指针原理 ARC 都帮我们做了什么? weak是什么? weak是怎么实现的? 1. weak原理简介 2. weak简单测试 3. weak原理分析 3.1 weak指针帮我 ...

  8. 推荐3个Python 文本终端 GUI 框架,太酷了

    最近看到几个有意思的基于文本终端的 UI 框架,还可以制作命令行网易云音乐. 喜欢本文记得收藏.点赞.关注. Curses 首先出场的是 Curses[1]. Curse Curses 是一个能提供基 ...

  9. linux虚拟机状态转换图,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题

    1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 ...

最新文章

  1. python培训班一般多少钱-报一个python培训班多少钱?
  2. VBscript.Encode 解码器
  3. Unix下的crontab简介
  4. 嵌套页面h5怎么调起手机文件_让微信公众号文章排版像网页h5一样高大上
  5. Oracle occi 抓包,instantclient 32下载-instantclient-basic(轻量级数据库)32位 11.2.0.4.0 官方版 - 河东下载站...
  6. Waymo无人卡车高调重返凤凰城,重点路测高速和主干道,但货运先机已失
  7. 远程调试运行在Resin上面的Web应用程序
  8. rocketmq mysql_聊聊rocketmq-mysql的BinlogPositionManager
  9. 我以为内卷是外包的反义词!
  10. Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸 2 1.1. 总图 2 1.2. ui原型图与html 2 1.3. 业务逻辑 伪代码 各种uml图 2 1.4. 总体
  11. 区块链技术指南之分布式系统核心问题
  12. 记小程序uniapp 语音播放
  13. 用计算机计算勾股定理,勾股定理电脑计算器
  14. 澳门大学计算机qs排名,澳门大学世界QS排名
  15. java与英语词汇_Java英语词汇表
  16. python做表格教程_表格函数教程
  17. 人工智能的软件研发管理系统
  18. python 之 第一次亲密接触
  19. Ubuntu 18.04 安装网卡驱动(有线连接)
  20. 点云孔洞定位_基于TSDF模型的点云孔洞修复方法

热门文章

  1. NOIP2001-普及组复赛-第一题-数的计算
  2. ASP.NET(C#)常用数据加密和解密方法汇总
  3. ASCII与汉字编码方法
  4. 非刚性人脸跟踪 —— 实用工具
  5. C#装箱和拆箱(值类型和引用类型之间的转换)
  6. Android 开机自动启动服务
  7. 【转载】C ++ 基础 指针 引用
  8. ps怎么缩放图层大小_【无机纳米材料科研制图——Photoshop 0404】PS排列扫描透射电子显微镜图TEM/STEM...
  9. 收藏!细胞增殖实验要点详解
  10. Image Lab 6 for MacOS WIN 图像分析软件下载