curses编程初步--超简单的文本编辑器

来源:互联网 发布:装修客户资源软件 编辑:程序博客网 时间:2024/06/10 09:47

程序实现了一个超简单的文本编辑器,没做保存,以后扩充,主要体验一下curses编程。

自设环境变量EDITLNS、EDITCLS表示编辑器的尺寸,可以在运行前设置。

此程序只有基本的输入显示功能。

参考资料:http://unix-cd.com/unixcd12/article_6194.html

 

 

 


 

#include <curses.h> /* 引进 curses.h , 并自动引进 stdio.h */ #include <stdlib.h>#define StartX 1 /* 决定游标初始位置 */ #define StartY 1 void initial();void SetSize();void limitXY(int *x,int *y);main() {  int x=StartX; /* 定义 x,y 并设定其初值 */   int y=StartY;   int ch; /* 定义 ch 为整数,配合 getch() 使用 */  int old_x,old_y;  char testBuf[50];  int n_testBufUsed=0;  memset(testBuf,'/0',n_testBufUsed);    initial(); /* 调用 initial(), 启动 curses 模式, */   /* 并完成其它设定 */   box(stdscr,'|','-'); /* 画方框 */   attron(A_REVERSE); /* 开启反白模式 */   mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 处输出反白字元 */   attroff(A_REVERSE); /* 关闭反白模式 */   move(x,y); /* 将游标移至初始位置 */   do { /* 以无限回圈不断等待输入 */    old_x = x;    old_y = y;    ch=getch(); /* 等待自键盘输入字元 */    switch(ch) { /* 判断输入字元为何 */       case KEY_UP: --y; /* 判断是否"↑"键被按下 */ break;       case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 */ break;       case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 */ break;       case KEY_LEFT: --x; /* 判断是否"←"键被按下 */ break;       case '/r': /* 判断是否 ENTER 键被按下 */ ++y; x=0; break;       case '/t': /* 判断是否 TAB 键被按下 */ x+=7; break;       case 127: /* 判断是否 BACKSPACE 键被按下 */ mvaddch(y,--x,' ');/* delete 一个字元 */ break;       case 27: endwin(); /* 判断是否[ESC]键被按下 */ exit(1); /* 结束 curses 模式 */ /* 结束此程式 */       default: addch(ch); /* 如果不是特殊字元, 将此字元印 出 */ x++; break;     }    limitXY(&x,&y);    mvprintw(0,40,testBuf);    //move(y,x); /* 移动游标至现在位置 */    sprintf(testBuf,"coordinates:(%d,%d)",x,y);    n_testBufUsed = strlen(testBuf);    attron(A_REVERSE);    mvprintw(0,40,testBuf);    attroff(A_REVERSE);    memset(testBuf,' ',n_testBufUsed);    testBuf[n_testBufUsed]='/0';    move(y,x);  } while (1); } void initial() /* 自定开启 curses 函式 */ {  initscr();   cbreak();   nonl();   noecho();   intrflush(stdscr,FALSE);   keypad(stdscr,TRUE);   refresh(); } void limitXY(int *x,int *y){  int tx,ty;  int b_wd; /* border width */  b_wd = 1;  tx=StartX;  ty=StartY;    if(*x<tx)  {    *x=tx;  }  if(*y<ty)  {    *y=ty;  }  SetSize(&tx,&ty);  tx-=1;  ty-=1;  if(*x>tx-b_wd)  {    *x=tx-b_wd;  }  if(*y>ty-b_wd)  {    *y=ty-b_wd;  }}#define EDITCLS "EDITCLS"#define EDITLNS "EDITLNS"void SetSize(int *pWd,int *pHt){  char *pLines,*pCOLs;  char tBuf[20];  if(!pWd || !pHt)  {    return;  }  pCOLs  = getenv(EDITCLS);  pLines = getenv(EDITLNS);  if(pLines)  {    sscanf(pLines,"%d",pHt);  }  else  {    *pHt = LINES;    sprintf(tBuf,"%d",*pHt);    setenv(EDITLNS,tBuf,1);    beep();  }  if(pCOLs)  {    sscanf(pCOLs,"%d",pWd);  }  else  {    *pWd = COLS;    sprintf(tBuf,"%d",*pWd);    setenv(EDITCLS,tBuf,1);  }}

原创粉丝点击