C指针原理(29)-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 <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-文本终端的图形相关推荐
- C指针原理(34)-Ncurses-文本终端的图形
下面使用getwin和putwin完成对窗口内容的保存,而不是对整个屏幕,同时修正程序的几个小错误: 1.下面的操作提示在多次操作后会出现混乱. 2.退出后,endwin结束窗口,并且退出curses ...
- C指针原理(31)-Ncurses-文本终端的图形
9.Ncurses的初始化相关工作 (1)raw()和cbreak() 禁止行缓冲,在raw()函数模式下,处理挂起(CTRLZ).中断或退出(CTRLC)等控制字符时,将直接传送给程序去处理而不产生 ...
- C指针原理(35)-Ncurses-文本终端的图形
下面将全屏编辑器修改一下,通过panel的支持,让它能同时打开3个窗口编辑不同的内容,同时对3个窗口的内容进行保存. 效果如下: #include <locale.h>#include & ...
- C指针原理(33)-Ncurses-文本终端的图形
键盘管理 我们打造一个简单的单屏编辑器 首先构造一个仅带输入功能的编辑器,使用wgetch来捕捉输入. #include <locale.h>#include <stdio.h> ...
- Objective-C中,ARC下的 strong和weak指针原理解释
Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...
- Python 文本终端 GUI 框架,太酷了
来源:Python技术 上次发了一篇基于 Webview 的图形界面的程序 制作后,有读者询问:有没有基于文本中终端的 GUI 开发框架? 今天笔者就带大家,梳理几个常见的基于文本终端的 UI 框架, ...
- iOS arc weak指针原理
iOS arc weak指针原理 ARC 都帮我们做了什么? weak是什么? weak是怎么实现的? 1. weak原理简介 2. weak简单测试 3. weak原理分析 3.1 weak指针帮我 ...
- 推荐3个Python 文本终端 GUI 框架,太酷了
最近看到几个有意思的基于文本终端的 UI 框架,还可以制作命令行网易云音乐. 喜欢本文记得收藏.点赞.关注. Curses 首先出场的是 Curses[1]. Curse Curses 是一个能提供基 ...
- linux虚拟机状态转换图,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 ...
最新文章
- python培训班一般多少钱-报一个python培训班多少钱?
- VBscript.Encode 解码器
- Unix下的crontab简介
- 嵌套页面h5怎么调起手机文件_让微信公众号文章排版像网页h5一样高大上
- Oracle occi 抓包,instantclient 32下载-instantclient-basic(轻量级数据库)32位 11.2.0.4.0 官方版 - 河东下载站...
- Waymo无人卡车高调重返凤凰城,重点路测高速和主干道,但货运先机已失
- 远程调试运行在Resin上面的Web应用程序
- rocketmq mysql_聊聊rocketmq-mysql的BinlogPositionManager
- 我以为内卷是外包的反义词!
- Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸	2 1.1. 总图	2 1.2. ui原型图与html	2 1.3. 业务逻辑 伪代码 各种uml图	2 1.4. 总体
- 区块链技术指南之分布式系统核心问题
- 记小程序uniapp 语音播放
- 用计算机计算勾股定理,勾股定理电脑计算器
- 澳门大学计算机qs排名,澳门大学世界QS排名
- java与英语词汇_Java英语词汇表
- python做表格教程_表格函数教程
- 人工智能的软件研发管理系统
- python 之 第一次亲密接触
- Ubuntu 18.04 安装网卡驱动(有线连接)
- 点云孔洞定位_基于TSDF模型的点云孔洞修复方法
热门文章
- NOIP2001-普及组复赛-第一题-数的计算
- ASP.NET(C#)常用数据加密和解密方法汇总
- ASCII与汉字编码方法
- 非刚性人脸跟踪 —— 实用工具
- C#装箱和拆箱(值类型和引用类型之间的转换)
- Android 开机自动启动服务
- 【转载】C ++ 基础 指针 引用
- ps怎么缩放图层大小_【无机纳米材料科研制图——Photoshop 0404】PS排列扫描透射电子显微镜图TEM/STEM...
- 收藏!细胞增殖实验要点详解
- Image Lab 6 for MacOS WIN 图像分析软件下载