下面将全屏编辑器修改一下,通过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

编写含有表单的程序,一般步骤如下:

  1. 初始化并进入curses

  2. 用new_field()函数创建表单域。你可以指定域的高度,宽度以及它在表单中的位

置。

  1. 指定已创建的表单域所作用的表单,并用new_form()函数创建表单。

  2. 用post_form()函数来递送表单,并刷新屏幕。

  3. 用一个循环来处理用户请求,通过form_driver()函数对表单做相应的更新。

  4. 用unpost_form()函数取消表单的递送。

  5. 用free_form()函数释放已分配给表单的内存。

  6. 用free_field()函数释放已分配给菜单项的内存。

  7. 退出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-文本终端的图形相关推荐

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

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

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

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

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

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

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

    1.安装Ncurses Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库. Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以: ...

  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. DOM对象和内置对象(上)
  2. [Spring boot] Spring boot + JPA 基本架构,完成CRUD
  3. 自定义 ocelot 中间件输出自定义错误信息
  4. java 垃圾回收手动回收_Java垃圾回收(4)
  5. pycharm配置python环境变量_求教大家 pycharm 中,环境变量 path 的问题!
  6. 【计算机网络】分组交换网中的时延,丢包和吞吐量
  7. 这次是小米!5.31亿元深圳买地:将与腾讯、阿里做邻居
  8. 内存的管理方式有哪些
  9. Win10双系统安装教程(适用所有计算机)
  10. 国家电网车辆智能车载终端4G全网通T-BOX 、车联网OBD终端、4G TBOX终端
  11. 线性调频信号MATLAB仿真
  12. 与奥运会有关的常用英语术语及句子
  13. linux pppd源码下载_linux pppd脚本配置(转载)
  14. 2021年中国跨境电商行业发展现状及5G技术在中国跨境电商的应用分析:交易规模达142000亿元,同比增长13.6%[图]
  15. 精彩回顾 | 客户体验官俱乐部(CEOC)首届主题论坛在深圳圆满落幕
  16. android 跳转到系统Settings界面的所有Intent
  17. Java 和 || 优先级
  18. iphone功率测试软件,iPhone充电功率检测方法
  19. Yii2.0-发邮件找回密码
  20. 为何学Python(转)

热门文章

  1. MySQL注射绕过技巧(三)
  2. varchar 保存英文中文区别。
  3. fenby C语言 P20
  4. 批处理文件将多台连接的手机安装同一个APP
  5. 移动端web自适应适配布局解决方案
  6. 使用springcloud gateway搭建网关(分流,限流,熔断)
  7. python中join的用法
  8. 博客美化20150418
  9. 用setTimeout实现setInterval的功能
  10. 红杉资源出售麦考林29%股份套现1亿美元