C指针原理(35)-Ncurses-文本终端的图形
下面将全屏编辑器修改一下,通过panel的支持,让它能同时打开3个窗口编辑不同的内容,同时对3个窗口的内容进行保存。
效果如下:
#include <locale.h>#include <stdio.h>#include <panel.h>#include <ncurses.h>int isExist(char *filename){return (access(filename, 0) == 0);}int main(int argc, char *argv[]){MEVENT event;setlocale(LC_ALL,"");initscr();clear();noecho();cbreak();if(has_colors() == FALSE){endwin();printf("你的终端不支持色彩!\n");return (1);}start_color(); /启动color 机制/mvprintw(3,COLS/2-10,"简单编辑器-仅限于单个屏幕的编辑");mvprintw(4,COLS/2-20,"【F9读保存内容,F10存盘,F11退出,F12删除整行,TAB换窗口】");refresh();init_pair(1, COLOR_GREEN, COLOR_BLACK);init_pair(2, COLOR_BLUE, COLOR_BLACK);init_pair(3, COLOR_RED,COLOR_BLACK); WINDOW *mywins[3];PANEL *top;PANEL *mypanels[3];char filename[10];int width=COLS-18;int height=LINES-18;int x,y;int begin_y=5;int begin_x=5;int i;for(i = 0; i < 3; +++i){mywins[i]=newwin(height,width,begin_y,begin_x);//新窗口(行,列,begin_y,begin_x)keypad(mywins[i],TRUE);wattron(mywins[i],COLOR_PAIR(i+1));mypanels[i] = new_panel(mywins[i]);box(mywins[i],ACS_VLINE,ACS_HLINE);wattroff(mywins[i],COLOR_PAIR(i+1));begin_y+=4;begin_x+=4;}set_panel_userptr(mypanels[0],mypanels[1]);set_panel_userptr(mypanels[1],mypanels[2]);set_panel_userptr(mypanels[2],mypanels[0]);top = mypanels[2];update_panels();doupdate();int nowwinid=2;sprintf(filename,"myed%d.dat",nowwinid);getyx(mywins[nowwinid],y,x);++y;++x;mmask_t oldmousemask;int ans=0;FILE *fp2=NULL;FILE *fp1=NULL;mousemask(ALL_MOUSE_EVENTS, &oldmousemask);while(1){int c=mvwgetch(mywins[nowwinid],y,x);switch(c){ case KEY_MOUSE:if(getmouse(&event) == OK){ / When the user clicks left mouse button /if(event.bstate & BUTTON1_PRESSED){y=event.y-7;x=event.x-7;wmove(mywins[nowwinid],y,x);}}break;case KEY_BACKSPACE:--x;if (x<1){--y;x=width-2;}if (y<1){y=height-2;}mvwprintw(mywins[nowwinid],y,x," ");break;case KEY_RIGHT:++x;if (x>=width-1) {++y;x=1;}break;case KEY_LEFT: --x;if (x<1){--y;x=width-2;}break;case KEY_UP:--y;if (y<1){y=height-2;}break;case KEY_DOWN:++y;if (y>=height-1){y=1;}break;case 10:++y;if (y>=height-1){y=1;}break;case KEY_F(11)://退出mvprintw(LINES-3,2," ");mvprintw(LINES-3,2,"退出编辑器吗? ");mvprintw(LINES-2,2," ");mvprintw(LINES-1,2," \n");refresh();ans=getch();if (ans=='Y' ||ans=='y'){mvprintw(LINES-2,2,"是\n");refresh();wattroff(mywins[nowwinid],COLOR_PAIR(1));mousemask(oldmousemask,NULL);endwin();return 0;}elsemvprintw(LINES-2,2,"否\n");refresh();break;case 9:top = (PANEL *)panel_userptr(top);top_panel(top);update_panels();doupdate();nowwinid=(++nowwinid)%3;sprintf(filename,"myed%d.dat",nowwinid);break;case KEY_F(10)://存盘mvprintw(LINES-3,2," ");mvprintw(LINES-3,2,"保存当前内容吗? ");mvprintw(LINES-2,2," ");mvprintw(LINES-1,2," \n");refresh();ans=getch();if (ans=='Y' ||ans=='y'){mvprintw(LINES-3,2," ");fp1 = fopen(filename,"wb");if (fp1!=NULL){int jg= putwin(mywins[nowwinid],fp1);fclose(fp1);if (jg==OK) mvprintw(LINES-1,2,"保存成功!\n");}mvprintw(LINES-3,2,"保存当前内容吗? ");mvprintw(LINES-2,2,"是\n");refresh();}elsemvprintw(LINES-2,2,"否\n");refresh();break;case KEY_F(9)://读取存盘mvprintw(LINES-3,2," ");mvprintw(LINES-3,2,"读取保存内容吗? ");mvprintw(LINES-2,2," ");mvprintw(LINES-1,2," \n");refresh();ans=getch();if (ans=='Y' ||ans=='y'){if (isExist(filename)) {fp2 = fopen(filename,"rb");if (fp2!=NULL){WINDOW *newwin=getwin(fp2);if (newwin!=NULL) {WINDOW *temp=mywins[nowwinid];mywins[nowwinid]=newwin;delwin(temp);PANEL *temppan=mypanels[nowwinid];mypanels[nowwinid] = new_panel(mywins[nowwinid]);del_panel(temppan);set_panel_userptr(mypanels[0],mypanels[1]);set_panel_userptr(mypanels[1],mypanels[2]);set_panel_userptr(mypanels[2],mypanels[0]);top = mypanels[nowwinid];top_panel(top);update_panels();doupdate();mvprintw(LINES-1,2,"读取成功!\n");}fclose(fp2);}}mvprintw(LINES-3,2,"读取保存内容吗? ");mvprintw(LINES-2,2,"是\n");refresh();}elsemvprintw(LINES-2,2,"否\n");refresh();break;case KEY_F(12)://删除某行wdeleteln(mywins[nowwinid]);winsertln(mywins[nowwinid]);box(mywins[nowwinid],ACS_VLINE,ACS_HLINE);break;case KEY_DC://删除某字符mvwprintw(mywins[nowwinid],y,x," ");break;default:mvwprintw(mywins[nowwinid],y,x,"%c",c);++x;if (x>=width-1){++y;x=1;}if (y>=height-1){y=1;}doupdate();}}return 0;}
dp@dp:~/cursestest % gcc -lncursesw -lpanel a.c -o mytest
dp@dp:~/cursestest % ./mytest
编写含有表单的程序,一般步骤如下:
初始化并进入curses
用new_field()函数创建表单域。你可以指定域的高度,宽度以及它在表单中的位
置。
指定已创建的表单域所作用的表单,并用new_form()函数创建表单。
用post_form()函数来递送表单,并刷新屏幕。
用一个循环来处理用户请求,通过form_driver()函数对表单做相应的更新。
用unpost_form()函数取消表单的递送。
用free_form()函数释放已分配给表单的内存。
用free_field()函数释放已分配给菜单项的内存。
退出curses 模式
下面演示了表单的操作基础
#include <form.h>int main(){ FIELD *field[3];FORM *my_form;int ch;/* 初始化curses */initscr();cbreak();noecho();keypad(stdscr, TRUE);/* 初始化表单域*/field[0] = new_field(1, 10, 4, 18, 0, 0);field[1] = new_field(1, 10, 6, 18, 0, 0);field[2] = NULL;/* 设置表单域*/set_field_back(field[0],A_UNDERLINE); /* 为选项打印一条下滑线*/field_opts_off(field[0],O_AUTOSKIP);/* 在域(输入框)填满后光标不会自动跳到下一个表单域*/set_field_back(field[1],A_UNDERLINE);field_opts_off(field[1],O_AUTOSKIP);/* 创建并递送表单*/my_form = new_form(field);post_form(my_form);refresh();mvprintw(4, 10, "name:");mvprintw(6, 10, "age:");refresh();move(4,15);/* 用循环获取用户请求,F12退出*/while((ch = getch()) != KEY_F(12)){ switch(ch){ case KEY_DOWN:/* 跳至下一个表单域*/form_driver(my_form,REQ_NEXT_FIELD);/* 跳到当前缓冲的末尾*//* 精确地在输入最后一个后字符跳出这个表单域*/form_driver(my_form,REQ_END_LINE);break;case KEY_UP:/* 移动到前一个表单域*/form_driver(my_form,REQ_PREV_FIELD);form_driver(my_form,REQ_END_LINE);break;default:/* 如果输入的是普通字符, 就把它打印出来*/form_driver(my_form,ch);break;}}/* 取消表单并释放内存*/unpost_form(my_form);free_form(my_form);free_field(field[0]);free_field(field[1]);endwin();return 0;}
dp@dp:~/cursestest % gcc -lncursesw -lform b.c -o mytest
dp@dp:~/cursestest % ./mytest
C指针原理(35)-Ncurses-文本终端的图形相关推荐
- C指针原理(34)-Ncurses-文本终端的图形
下面使用getwin和putwin完成对窗口内容的保存,而不是对整个屏幕,同时修正程序的几个小错误: 1.下面的操作提示在多次操作后会出现混乱. 2.退出后,endwin结束窗口,并且退出curses ...
- C指针原理(31)-Ncurses-文本终端的图形
9.Ncurses的初始化相关工作 (1)raw()和cbreak() 禁止行缓冲,在raw()函数模式下,处理挂起(CTRLZ).中断或退出(CTRLC)等控制字符时,将直接传送给程序去处理而不产生 ...
- C指针原理(33)-Ncurses-文本终端的图形
键盘管理 我们打造一个简单的单屏编辑器 首先构造一个仅带输入功能的编辑器,使用wgetch来捕捉输入. #include <locale.h>#include <stdio.h> ...
- C指针原理(29)-Ncurses-文本终端的图形
1.安装Ncurses Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库. Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以: ...
- 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就是文本模式了 ...
最新文章
- DOM对象和内置对象(上)
- [Spring boot] Spring boot + JPA 基本架构,完成CRUD
- 自定义 ocelot 中间件输出自定义错误信息
- java 垃圾回收手动回收_Java垃圾回收(4)
- pycharm配置python环境变量_求教大家 pycharm 中,环境变量 path 的问题!
- 【计算机网络】分组交换网中的时延,丢包和吞吐量
- 这次是小米!5.31亿元深圳买地:将与腾讯、阿里做邻居
- 内存的管理方式有哪些
- Win10双系统安装教程(适用所有计算机)
- 国家电网车辆智能车载终端4G全网通T-BOX 、车联网OBD终端、4G TBOX终端
- 线性调频信号MATLAB仿真
- 与奥运会有关的常用英语术语及句子
- linux pppd源码下载_linux pppd脚本配置(转载)
- 2021年中国跨境电商行业发展现状及5G技术在中国跨境电商的应用分析:交易规模达142000亿元,同比增长13.6%[图]
- 精彩回顾 | 客户体验官俱乐部(CEOC)首届主题论坛在深圳圆满落幕
- android 跳转到系统Settings界面的所有Intent
- Java 和 || 优先级
- iphone功率测试软件,iPhone充电功率检测方法
- Yii2.0-发邮件找回密码
- 为何学Python(转)