⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 def.h

📁 本人上程序设计课时
💻 H
📖 第 1 页 / 共 3 页
字号:
/*定义键值*/
#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 + -