·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
您现在的位置:天新网 > 软件开发 > 开发语言 > C/C++
编辑器:光标的处理控制
http://dev.21tx.com 2005年03月13日

我已完成光标的处理控制,让光标只在编辑内容的范围内移动..

源代码 edit.c:

#include<unistd.h>
#include<stdio.h>
#include<curses.h>

#define STARTX 1
#define STARTY 1

/* 初始化 curses */
void initial()
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}

/* 内容存储数组结构 name */
struct {
char name[200000];
} edit;

int main(int argc,char *argv[])
{
int x=STARTX;
int y=STARTY;
int max[2000],ch,i,a,net[2000],sizefile=0;
char line[100];
FILE *fp;

if(argc==1 || argc>2) {
printf("please input:./edit file\\nexit edit:Esc\\n");
}
if(argc==2) {
fp=fopen(argv[1],"w");
initial();

//box(stdscr,ACS_VLINE,ACS_HLINE);
move(0,30);
printw("edit- %s",argv[1]);
refresh();

move(x,y);
do{
ch=getch();
switch(ch){

/* 上键的移动控制 */
case KEY_UP:
if(y>1) --y;
if(y==1 && x>net[1]) x=net[1]+1;
if(y>1 && x>net[y]) x=net[y];
move(y,x);
break;

/* 下键的移动控制 */
case KEY_DOWN:
if(net[y]>0) ++y;
if(net[y]<x) x=net[y];
if(net[y]<1) x=1;
move(y,x);
break;

/* 右键的移动控制 */
case KEY_RIGHT:
if(y==1 && x<=(net[1]+1)) {
++x;
if(x==(net[1]+2)){
++y;
x=1;
move(y,x);
}
}
if(y>1 && x<=net[y]) {
++x;
if(x==(net[y]+1)){
++y;
x=1;
move(y,x);
}
}
break;

/* 左键的移动控制 */
case KEY_LEFT:
if(y==1 && x>1) --x;
if(y>1 && x>=1) --x;
if(x==0){
if(y>1) --y;
x=net[y];
move(y,x);
}
break;

/* 回车键的控制 */
case '\\r':
if (y==1) {
for (a=0,i=(x-1);i<=net[1];i++,a++) {
line[a]=edit.name[i];
}
line[a+1]='\\0';
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for (a=0,i=x;i<=net[y];i++,a++) {
line[a]=edit.name[sizefile+i];
}
line[a+1]='\\0';
}
sizefile=0;

if (x<=net[y]) {
for (i=net[y];i>=x;i--) {
delch();
}
}

if (y==1) {
for (i=strlen(edit.name);i>=(x-1);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+2]='\\0';
edit.name[x-1]='\\n';
net[1]=x-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for (i=strlen(edit.name);i>=(sizefile+x);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+2]='\\0';
edit.name[sizefile+x]='\\n';
net[y]=x;
sizefile=0;
}
++y;
x=1;
move(y,x);
insertln();
printw("%s",line);
for(i=2000;i>=y;i--) {
net[i]=net[i-1];
}
net[y]=strlen(line);
memset(line,'\\0',sizeof(line));
break;

/* 'tab' 键控制 */
case '\\t':
x+=4;
break;

/* 前删除控制 */
case KEY_BACKSPACE:
if (y==1) {
for (i=(x-2);i<strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[1]=net[1]-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for(i=(sizefile+x-1);i<strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[y]=net[y]-1;
sizefile=0;
}
if(x>1) --x;
move(y,x);
if (x>1) {
delch();
} else {
addch(' ');
}
break;

case KEY_DC:
if (y==1) {
for (i=(x-1);i<=strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[1]=net[1]-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for(i=(sizefile+x);i<strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[y]=net[y]-1;
sizefile=0;
}
delch();
break;

/* 'Esc' 键退出存档控制 */
case 27:
fwrite(&edit.name,sizeof(edit.name),1,fp);
endwin();
printf("name:%s\\n",edit.name);
exit(0);

/* 字符输入控制 */
default:
insch(ch);
if (y==1) {
if(x<=net[1]) {
for (i=strlen(edit.name);i>=(x-1);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+1]='\\0';
edit.name[x-1]=ch;
max[1]=net[1]+1;
} else {
edit.name[x-1]=ch;
}
} else {
for(i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
if (x<=net[y]) {
for (i=strlen(edit.name);i>=(sizefile+x);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+1]='\\0';
edit.name[sizefile+x]=ch;
max[y]=net[y]+1;
} else {
edit.name[sizefile+x]=ch;
}
sizefile=0;
}
if (max[y]<=x) {
max[y]=x;
}
net[y]=max[y];
x++;
break;
}
move(y,x);
}while(1);
}
}

同时还为该程序编写了个简单的 Makefile 文档:

Myapp: edit.o
gcc -o edit edit.o -lncurses

edit.o: edit.c
gcc -I/usr/include/ncurses edit.c -c
clean:
rm *.o

稍后,我会将这个逐渐完善的原始编辑器打包然后在下载区提供下载,以便有兴趣的网友继续完善改进它.

上一篇: 高级套接字函数
下一篇: 第七篇:从程序员到系统分析员之二

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
© 晨新科技 版权所有 Created by TXSite.net