📄 def.h
字号:
/*定义键值*/
#define Key_DOWN 0x5000
#define Key_UP 0x4800
#define Key_LEFT 0x4b00
#define Key_RIGHT 0x4d00
#define Key_PAGEUP 0x4900
#define Key_PAGEDOWN 0x5100
#define Key_HOME 0x4700
#define Key_END 0x4f00
#define Key_CTRL_HOME 0x7700
#define Key_CTRL_END 0x7500
#define Key_CTRL_C 0x2e03
#define Key_CTRL_X 0x2d18
#define Key_CTRL_V 0x2f16
#define Key_CTRL_F 0x2106
#define Key_F3 0x3d00
#define Key_DEL 0x5300
#define Key_Backspace 0xe08
#define Key_INS 0x5200
#define Key_ALT_F 0x2100
#define Key_ALT_E 0x1200
#define Key_ALT_H 0x2300
#define Key_Ctrl_S 0x1f13
#define Key_ALT_X 0x2d00
#define Key_ENTER 0x1c0d
#define Key_ESC 0x011b
#define Key_Y 0x1579
#define Key_N 0x316e
#define Key_UY 0x1559
#define Key_UN 0x314e
#define Key_TAB 0xf09
struct MYMENU{
int left;
int top;
int right;
int bottom;
char strMenu[10];
char subMenu[5][20];
void *submenubuf;
void *linebuf;
}MyMenu[3];/*存放3个菜单项的内容(全局变量)*/
struct gongbiao
{
int x;
int y;
}txtGB={1,1};/*保存文本编辑窗口的光标位置(全局变量)*/
struct select /*保存所选择文本的光标位置(全局变量),isSelect==1时表有文本被选择*/
{
int isSelect;
struct FileLine *pline; /*iFrom指向选择开始文本行*/
int sCol;
int sLine;
}txtSelect;
/*当前显示位置,从iStartLine开始显示21行,从iStartCol开始显示78列(全局变量)*/
int iStartLine=0;
int iStartCol=0;
int iTotalLine=0;
char path[256];/*保存文件全路径*/
int bNeedSave=0; /*1时表示文件被修改,需要保存*/
long lFileSize;
int flag; /*0为插入,1为改写*/
int readonly=0;/*1时只读*/
struct FileLine
{
int num;
char *lineNR;
struct FileLine *pro;
struct FileLine *next;
};
struct FileLine *head,*current,*top;
char *txtCopy=0; /*存放剪贴板的内容*/
char txtSearch[61]="";
/*初始化菜单变量*/
void initmenu()
{
strcpy(MyMenu[0].strMenu,"File");
strcpy(MyMenu[0].subMenu[0],"New");
strcpy(MyMenu[0].subMenu[1],"Open");
strcpy(MyMenu[0].subMenu[2],"Save ctrl+s");
strcpy(MyMenu[0].subMenu[3],"Save As");
strcpy(MyMenu[0].subMenu[4],"Quit alt+x");
MyMenu[0].left=5;
MyMenu[0].top=2;
MyMenu[0].right=MyMenu[0].left+15;
MyMenu[0].bottom=8;
MyMenu[0].submenubuf=malloc(8*16*2);
MyMenu[1].linebuf=malloc(16*2);
strcpy(MyMenu[1].strMenu ,"Edit");
strcpy(MyMenu[1].subMenu[0],"Copy ctrl+c");
strcpy(MyMenu[1].subMenu[1],"Cut ctrl+x");
strcpy(MyMenu[1].subMenu[2],"Paste ctrl+v");
strcpy(MyMenu[1].subMenu[3],"Find...");
strcpy(MyMenu[1].subMenu[4],"Replace...");
MyMenu[1].left=MyMenu[0].left+strlen(MyMenu[0].strMenu)+5;
MyMenu[1].top=2;
MyMenu[1].right=MyMenu[1].left+16;
MyMenu[1].bottom=8;
MyMenu[1].submenubuf=malloc(8*17*2);
MyMenu[1].linebuf=malloc(17*2);
strcpy(MyMenu[2].strMenu ,"Help");
strcpy(MyMenu[2].subMenu[0],"About");
MyMenu[2].left=MyMenu[1].left+strlen(MyMenu[1].strMenu)+5;
MyMenu[2].top=2;
MyMenu[2].right=MyMenu[2].left+10;;
MyMenu[2].bottom=4;
MyMenu[2].submenubuf=malloc(4*11*2);
MyMenu[2].linebuf=malloc(11*2);
}
void DeleteMenuBuf()
{
int i;
for(i=0;i<3;i++)
{
free(MyMenu[i].submenubuf);
free(MyMenu[2].linebuf);
}
}
/*文本模式下画方框 */
void box(int startx,int starty,int width,int high) /* 画矩形框函数*/
{
int i;
gotoxy(startx,starty);
putch(0xda); /* 画┌ */
for (i=startx+1;i<startx+width-1;i++)
putch(0xc4);/* 画─(顶边) */
putch(0xbf);/* 画┐ */
for( i=starty+1;i<starty+high-1;i++)
{
gotoxy(startx,i);
putch(0xb3);/* 画│ */
gotoxy(startx+width-1,i);
putch(0xb3);/* 画│ */
}
gotoxy(startx,starty+high-1);
putch(0xc0); /* 画┖ */
for (i=startx+1;i<startx+width-1;i++)/* 画─(底) */
putch(0xc4);
putch(0xd9); /* 画┛ */
gotoxy (startx,starty);
}
/*光标焦点设置为编辑窗口*/
void setTextWindow()
{
window(2,3,79,23);
textbackground(BLUE);
textcolor(WHITE);
gotoxy(txtGB.x,txtGB.y);
}
void setStateWindow()
{
char p[81],state[100],*name,*ins,*temp;
window(1,25,80,25);
textbackground(LIGHTGRAY);
textcolor(RED);
clrscr();
if(!strlen(path))
strcpy(p,"noname.txt");
else
{ temp=name=path;
while(name=strchr(name,'\\'))
{
name++;
temp=name;
}
strcpy(p,temp);
}
if(bNeedSave)
strcat(p," *");
if(flag)
ins="Replace";
else ins="Insert";
sprintf(state,"%s Totalline:%d line:%d|col:%d %s",p,iTotalLine,txtGB.y+iStartLine,txtGB.x+iStartCol,ins);
gotoxy(2,1);
cputs(state);
setTextWindow();
}
void saveTextWindow()
{
txtGB.x=wherex();
txtGB.y=wherey();
}
/*画主菜单*/
void mainfram()
{
int i;
window(1,1,80,1);
textbackground(LIGHTGRAY);
clrscr();
for(i=0;i<3;i++)
{
textcolor(BLACK);
gotoxy(MyMenu[i].left,1);
cputs(MyMenu[i].strMenu);
gotoxy(MyMenu[i].left,1);
textcolor(RED);
putch(MyMenu[i].strMenu[0]);
}
window(1,2,80,25);
textbackground(BLUE);
textcolor(LIGHTGRAY);
clrscr();
box(1,1,80,23);
/*设置为未选择状态*/
txtSelect.isSelect=0;
txtSelect.sCol=0;
txtSelect.sLine=0;
txtSelect.pline=0;
/*设置状态窗口*/
setStateWindow();
/*设置当前窗口为文本编辑窗口*/
setTextWindow();
};
/*画子菜单 */
int TranslateKey
(int key,int shift);
void drawsubmenu(int i)
{
int j,line,key,num,flag,oldline;
int noputtext=0;
/*保存要改动菜单区域的数据*/
gettext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
window(1,1,80,1);
textbackground(BLACK);
textcolor(WHITE);
gotoxy(MyMenu[i].left,1);
cputs(MyMenu[i].strMenu);
/*画子菜单*/
window(MyMenu[i].left,MyMenu[i].top,MyMenu[i].right,MyMenu[i].bottom);
textbackground(LIGHTGRAY);
clrscr();
num=MyMenu[i].bottom-MyMenu[i].top-1;
for(j=0;j<num;j++)
{
textcolor(BLACK);
gotoxy(3,j+2);
cputs(MyMenu[i].subMenu[j]);
textcolor(RED);
if((i==0&&j==3)||(i==1&&j==1))
{
gotoxy(4,j+2);
putch(MyMenu[i].subMenu[j][1]);/*"cut u为红色"*/
}else{
gotoxy(3,j+2);
putch(MyMenu[i].subMenu[j][0]);
}
}
textcolor(BLACK);
box(1,1,MyMenu[i].right-MyMenu[i].left,MyMenu[i].bottom-MyMenu[i].top+1);
/*显示光标位置*/
line=oldline=1;
gettext(MyMenu[i].left,line+2,MyMenu[i].right,line+2,MyMenu[i].linebuf);
window(MyMenu[i].left+1,line+2,MyMenu[i].right-2,line+2);
textbackground(BLACK);
textcolor(WHITE);
clrscr();
gotoxy(2,1);
cputs(MyMenu[i].subMenu[line-1]);
while(1)
{
if(oldline!=line)
{
puttext(MyMenu[i].left,oldline+2,MyMenu[i].right,oldline+2,MyMenu[i].linebuf);
gettext(MyMenu[i].left,line+2,MyMenu[i].right,line+2,MyMenu[i].linebuf);
window(MyMenu[i].left+1,line+2,MyMenu[i].right-2,line+2);
textbackground(BLACK);
textcolor(WHITE);
clrscr();
gotoxy(2,1);
cputs(MyMenu[i].subMenu[line-1]);
oldline=line;
}
j=i;/*当前菜单项位置MyMenu[i]*/
key=bioskey(0);
switch(key)
{
case Key_ESC:
flag=1;
break;
case Key_DOWN:
line+=1;
if(line>num)
line=1;
break;
case Key_UP:
line-=1;
if(line<1)
line=num;
break;
case Key_LEFT:
j-=1;
if(j<0)
j=2;
flag=2;
break;
case Key_RIGHT:
j+=1;
if(j>2)
j=0;
flag=2;
break;
case Key_ENTER:
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
if(i==0)/*File menu*/
{
if(line==1)
{
NewFile();
noputtext=1;
}
else if(line==2)
{
OpenFile();
noputtext=1;
}
else if(line==3)
SaveFile(0);
else if(line==4)
SaveFile(1);
else if(line==5)
TranslateKey(Key_ALT_X,0);
}
else if(i==1)/*Edit menu*/
{
switch(line)
{
case 1:
TranslateKey(Key_CTRL_C,0);
break;
case 2:
TranslateKey(Key_CTRL_X,0);
break;
case 3:
TranslateKey(Key_CTRL_V,0);
break;
case 4:
TranslateKey(Key_CTRL_F,0);
break;
case 5:
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
OnReplace();
noputtext=1;
break;
}
}
else if(i==2)/*Help menu*/
{
if(line==1)
OnAbout();
}
flag=1;
break;
default:
key=key&0xff;
key=toupper(key);
flag=1;
switch(key)
{
case 'N':
if(i==0)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
NewFile();
noputtext=1;
}else continue;
break;
case 'O':
if(i==0)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
OpenFile();
noputtext=1;
}else continue;
break;
case 'S':
if(i==0)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
SaveFile(0);
}else continue;
break;
case 'Q':
if(i==0)
TranslateKey(Key_ALT_X,0);
else continue;
break;
case 'C':
if(i==1)
{TranslateKey(Key_CTRL_C,0);}
else continue;
break;
case 'X':
if(i==1)
{TranslateKey(Key_CTRL_X,0);}
else continue;
break;
case 'F': /*查找*/
if(i==1)
{TranslateKey(Key_CTRL_F,0);}
else continue;
break;
case 'R': /*查找*/
if(i==1)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
OnReplace();
noputtext=1;
}else continue;
break;
case 'P':
if(i==1)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
OnPaste();
}else continue;
break;
case 'A':
if(i==2)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
OnAbout();
}else if(i==0)
{
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
SaveFile(1);
}else continue;
break;
default:
flag=0;
}
}
if(flag==1||flag==2) break;
}
if(!noputtext)
puttext(MyMenu[i].left,MyMenu[i].top-1,MyMenu[i].right,MyMenu[i].bottom,MyMenu[i].submenubuf);
if(flag==2)
drawsubmenu( j);
/*设置当前窗口为文本编辑窗口*/
setTextWindow();
};
int TranslateKey(int key,int shift)
{
int n=0,returnvalue=1;
switch(key)
{
case Key_ALT_X:
if(bNeedSave)
{
if(MessageBox("Do you want to save the file?",1))
SaveFile(0);
}
DeleteMenuBuf();
FreeMemory();
if(txtCopy)
free(txtCopy);
exit(0);
case Key_INS:
flag=!flag;
setStateWindow();
break;
case Key_ALT_F:
drawsubmenu(0) ;
break;
case Key_ALT_E:
drawsubmenu(1) ;
break;
case Key_ALT_H:
drawsubmenu(2) ;
break;
case Key_Ctrl_S:
SaveFile(0);
break;
case Key_UP:
setSelectState(shift);
if(current->pro==0)
break;
current=current->pro;
if(txtGB.y==1)
{
ScrollWindow(4);
}else{
txtGB.y-=1;
}
if(!current->lineNR)
n=1;
else n=strlen(current->lineNR)+1-iStartCol;
if(txtGB.x>n)/*如上一行短,光标到上一行尾*/
{
txtGB.x=n;
if(txtGB.x<1)
{
iStartCol=iStartCol+txtGB.x-1;
txtGB.x=1;
DrawView();
}
}
break;
case Key_DOWN:
setSelectState(shift);
if(current->next==0)
break;
current=current->next;
if(txtGB.y==21)
{
ScrollWindow(3);
} else{
txtGB.y++;
}
if(!current->lineNR)
n=1;
else n=strlen(current->lineNR)+1-iStartCol;
if(txtGB.x>n)
{
txtGB.x=n;
if(txtGB.x<1)
{
iStartCol=iStartCol+txtGB.x-1;
txtGB.x=1;
DrawView();
}
}
break;
case Key_LEFT:
setSelectState(shift);
if(txtGB.x==1)
{
if(iStartCol>0)
ScrollWindow(2);
}else {
txtGB.x-=1;
gotoxy(txtGB.x,txtGB.y);
}
break;
case Key_RIGHT:
setSelectState(shift);
if(!current->lineNR||(txtGB.x+iStartCol)>strlen(current->lineNR))
{
break;
}
if(txtGB.x==78)
{
ScrollWindow(1);
}else
{
txtGB.x++;
gotoxy(txtGB.x,txtGB.y);
}
break;
case Key_END:
setSelectState(shift);
OnEnd();
break;
case Key_CTRL_END:
setSelectState(shift);
OnCtrlEnd();
break;
case Key_HOME:
setSelectState(shift);
OnHome();
break;
case Key_CTRL_HOME:
setSelectState(shift);
OnCtrlHome();
break;
case Key_PAGEDOWN:
setSelectState(shift);
OnPageDown();
break;
case Key_PAGEUP:
setSelectState(shift);
OnPageUp();
break;
case Key_ENTER:
AppendLine();
bNeedSave=1;
break;
case Key_DEL:
bNeedSave=1;
if(txtSelect.isSelect)
DeleteSelectText();
else
OnDeleteCh();
break;
case Key_Backspace:
OnBackspace();
break;
case Key_CTRL_C:
OnCopy();
break;
case Key_CTRL_V:
returnvalue=OnPaste();
break;
case Key_CTRL_X:
if(txtSelect.isSelect)
{
OnCopy();
DeleteSelectText();
}
break;
case Key_CTRL_F:
OnFind();
break;
case Key_F3:
if(strlen(txtSearch))
FindNext(txtSearch,1);
break;
default:
key=key&0xff;/*获取输入键的ASCII码*/
if(!key||key==0x1b) break;
if(txtSelect.isSelect)
TranslateKey(Key_DEL,0);
OnModify(key,flag);/*flag==0为插入状态*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -