论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

全屏幕编辑软件的编写(C语言)02

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:24

coord()                                    /* 显示标尺行 */
{
  int i,j,k,g;
  g=m*BP;                                  /* 本屏行首列号 */
  y=yy-g;                                  /* 计算 y */
  k=(enq-g>ZS+1)?ZS+1:enq-g;               /* 排版宽度处列坐标 */
  for(i=1;i<=ZS+1;i++)  {                  /* 自左至右显示标尺 */
    j=(i<=k)?0x04:0x01;                    /* 排版行宽度内用红色,否则用蓝色 */
    ((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
                                           /* 逢 5 显示“|”,其余显示“-” */
  }
  g=(y<k) ? 0x50 : 0x30;                   /* 确定标尺光标色彩 */
  ((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
                                           /* 显示标尺光标 */
}

xh()                                   /* 在信息行显示当前行序、列、行数值 */
{
  char sl[8],sh[8],sz[8];
  itoa(yy+1,sl,10);                        /* 变列号数值为字符串 */
  ltoa(xx+1,sh,10);                        /* 变行号数值为字符串 */
  ltoa(ser+1,sz,10);                       /* 变字序号数值为字符串 */
  write_string(H1,8,"序:         行:        列:    ",0x05);
  write_string(H1,12,sz,0x07);             /* 显示字序号 */
  write_string(H1,24,sh,0x07);             /* 显示行号 */
  write_string(H1,35,sl,0x07);             /* 显示列号 */
}

int string_lingth()                        /* 计算除回车换行符外的当前行长 */
{
  int g;
  g=strlen(ss[ss_x]);                      /* 测当前行字符串总长 */
  if(ss[ss_x][g-1]==0x0A) g-=2;            /* 去除回车换行符的长度 */
  return g;                                /* 返回计算值 */
}

Enter()                                    /* 输入回车 */
{
  int g,k;
  chg=1;                                   /* 文件已修改标志置为真 */
  if(!ins) {                               /* 如为非插入状态 */
    g=string_lingth();                     /* 计算当前行长(不包括回车换行符) */
    strcpy(ss[ss_x]+g,da);                 /* 字符串以硬回车换行符结尾 */
    if(xx==ttl_x)   {                      /* 如是文末行,下移一行 */
      fp_rd++;                             /* fp 已读出行最大行号加 1 */
      ttl_x++;                             /* 文末行行号加 1 */
      ss_max++;                            /* 编辑数组实用最大行号加 1 */
    }
    if(m==0 && g<ZS)  write_char(x,FH,'<',CHAR_COLOR);
                                           /* 如行尾在 0 屏,显示硬回车标志 */
    ss_x++;   xx++;                        /* 数组行号和文本行号均加 1 */
    ser+=g-yy+2;                           /* 计算字序数 */
    if(ss_x>ss_max)  tj();                 /* 如下行超出编辑数组最大行号,
                                              从 fp2 或 fp 读入一部分 */
    if(x<H3)  {                            /* 如不是屏幕底行 */
      if(m)  {                             /* 如不是 0 屏 */
        m=0;
        disp_t();                          /* 显示 0 屏各行 */
      }
      x++;                                 /* 屏幕光标下移一行 */
    }
    else  {                                /* 如是屏幕最下行 */
      if(!m) {                             /* 如原在 0 屏,则滚屏 */
        roll_scr_up(0,H3);                 /* 向上滚屏 */
        disp(ss_x,x);                      /* 当前坐标补显一行 */
      }
      else  {                              /* 如原不在 0 屏 */
        m=0;                               /* 显示 0 屏 */
        disp_t();
      }
    }
  }
  else  {                                  /* 如为插入状态 */
    g=m;                                   /* 保存原屏号 */
    k=x;                                   /* 保存原屏幕行坐标 */
    intercept(yy);                         /* 从当前光标处折断字符串 */
    strcpy(ss[ss_x-1]+yy,da);              /* 折断处加硬回车换行符 */
    if(!g) {                               /* 如原在 0 屏 */
      if(k<H3)  roll_scr_down(x,H3);       /* 不在屏底行,本行起下滚 */
      else   roll_scr_up(0,H3);            /* 在屏底行,全屏上滚 */
      disp(ss_x-1,x-1);                    /* 重显原行(上一行) */
      disp(ss_x,x);                        /* 显示当前行 */
    }
    else  disp_t();                        /* 如原不在 0 屏,重显一屏 */
  }
  yy=0;                                    /* 光标至行首 */ 
}

Del()                                      /* 退格键、删字键处理 */
{
  int i,k;
  k=x;                                     /* 保存原行坐标 */
  chg=1;                                   /* 文件已修改标志置为真 */
  switch(delc()) {                         /* 删字,根据返回值判定 */
    case 0:                                /* 如返回 0 */
      disp(ss_x,x);                        /* 重显当前行 */
      break;                               /* 跳出开关语句 */
    case 1:                                /* 如返回 1 */
      disp_t();                            /* 重显一屏 */
      break;                               /* 跳出开关语句 */
    case 2:                                /* 如返回 2 */
      if(x>0)  --x;                        /* 如不在屏幕最上行,光标上移一行 */
      comput();                            /* 计算参数 */
      if(m) disp_t();                      /* 如不在 0 屏,重显一屏 */
      else  {                              /* 如在 0 屏 */
        if(k) {                            /* 如原不在屏顶行 */
          roll_scr_up(k,H3);               /* 自当前行起滚屏 */
          i=H3-x;                          /* 屏幕最下行与当前行间行数 */
          if(xx+i<=ttl_x)                  /* 如最下行还有,显示此行 */
            disp(ss_x+i,H3);
        }
        disp(ss_x,x);                      /* 显示当前行 */
      }
      break;                               /* 跳出开关语句 */
  }
}

int delc()                          /* 删字,如在行首,将本行接在上行尾 */
{
  int i,g,k=0;
  for(;;)  {                        /* 为全角字符设的循环 */
    if(y>0)  {                      /* 如不在本屏行首 */
      if(xx==ksx && yy<=ksy) ksy--; /* 如在块首行,并在块首前,计算块首列号 */
      if(xx==kwx && yy<=kwy) kwy--; /* 如在块尾行,并在块尾前,计算块尾列号 */
      dks();                        /* 如块首、块尾重合, 块标志置 1 */
      strcpy(ss[ss_x]+yy-1,ss[ss_x]+yy);
                                /* 光标处起字符串前移一格,覆盖光标前一字符 */
      y--;    yy--;                 /* 前移一字节 */
      ser--;                        /* 字序号减 1 */
      if(vs(yy-1)==0)  {            /* 如不在全角前半字 */
        if(!k) return 0;            /* 如在屏幕最左列,返回 0 */
        else return 1;              /* 否则返回 1 */
      }
    }
    else  {                         /* 如在屏幕最左列 */
      if(m)  {                      /* 如不为 0 屏 */
        m--;                        /* 退到前一屏 */
        y=yy-m*BP;                  /* 光标到屏中,并前移一字 */
        k=1;                        /* 标志置 1 */
      }
      else  {                       /* 如为 0 屏 */
        if(ss_x+(i=H3-x)>=ss_max && xx+i<ttl_x)
          tj();      /* 如屏幕最下行超出数组,但未到文末,从fp2或fp读入Q3行 */
        if(xx)  {                   /* 如不在文首行 */
          g=strlen(ss[ss_x]);       /* 测行长 */
          ss_x--;                   /* 至上一行 */
          yy=string_lingth();       /* 定光标于上行尾处 */
          if(g+yy>HC-4)  {          /* 如两行相接后超长 */
            write_prompt(3);        /* 提示超长 */
            yy=0;                   /* 恢复原行列号 */
            ss_x++;                 /* 回原行 */
            return -1;              /* 退出,返回 -1 */
          }
          if(xx<=ksx)  {            /* 如在块首行或之前 */
            if(xx==ksx) ksy+=yy;    /* 如在块首行 */
            ksx--;                  /* 块首行行号减 1 */
          }
          if(xx<=kwx) {             /* 如在块尾行或之前 */
            if(xx==kwx) kwy+=yy;    /* 如在块尾行 */
            kwx--;                  /* 块尾行行号减 1 */
          }
          dks();                    /* 如块首、块尾重合, 块标志置 1 */
          xx--;                     /* 文本当前行改为上行 */
          strcpy(ss[ss_x]+yy,ss[ss_x+1]);   /* 将下行拷至本行尾回车符前 */
          ser-=2;                   /* 字序数减少回车符的两位 */
          movbk(ss_x+1,1);          /* 数组后续各行前移,覆盖原行 */
          ttl_x--;                  /* 文末行行号减 1 */
          fp_rd--;                  /* fp 已读出行最大行号减 1 */
          ss_max--;                 /* 数组实用最大行号减 1 */
          return 2;                 /* 返回 2 */
        }
        else return 0;              /* 如在文首行,返回 0 */
      }
    }
  }
}

int vs(int a)                       /* 计算行首至 a 列全角字节数,返回奇偶值 */
{
  int i,j;
  j=0;                              /* 全角字节数,初值为 0 */
  for(i=0;i<=a;i++)
    if(ss[ss_x][i]>0xA0) j++;       /* 统计全角字 节数 */
  return(j%2);                      /* 返回奇偶值 */
}

orien()                             /* 重定光标列号 */
{
  int g;
  g=string_lingth();                /* 测当前列长(不包括回车换行符) */
  if(yy>g)  yy=g;                   /* 如光标在字符串尾后,定光标于串尾 */
  if(vs(yy-1))  yy--;               /* 如光标在后半汉字,前移一字节 */
  y=yy-m*BP;                        /* 计算屏幕 y 坐标 */
  if(y<0) comput();                 /* 如 y 为负数,重算各参数 */
}

Ctrl_N()                            /* 插入一空行 */
{
  chg=1;                            /* 文件已修改标志置为真 */
  fp_rd++;                          /* fp 已读出最大行号加 1 */
  ttl_x++;                          /* 文末行行号加 1 */
  if(xx<=ksx)  {                    /* 如插入行在块首行或之前 */
    ksx++;    kwx++;                /* 块首、块尾行号加 1 */
  }
  else {                            /* 如插入行在块首行后 */
    if(xx>ksx && xx<=kwx) kwx++;    /* 如插入行在字块中,块尾行号加 1 */
  }
  ser-=yy;                          /* 计算字序数 */
  if(ss_max>=QB-1) {                /* 如超出缓冲区数组可容行数 */
     ss_x>Q1 ? wfp1() : wfp2();     /* 数组行数在 Q1 后时,上部 Q3 行存入 fp1,
                                     行数小于 Q1 时,下部 Q3 行存入 fp2 */
  }
  ss_max++;                         /* 编辑数组实用最大行号加 1 */
  mov(ss_x,1);                      /* 当前行起各行后移 */
  strcpy(ss[ss_x],da);              /* 插入行加硬回车换行符 */
  if(m)  {                          /* 如不在 0 屏,显示 0 屏 */
    m=0;
    disp_t();
  }
  else  roll_scr_down(x,H3);        /* 如在 0 屏,当前行以下各行下滚 */
  yy=0;                             /* 光标至行首 */
}

Ctrl_E(int a)                       /* 删至行首,a=1 显示,a=0 不显示 */
{
  int g;
  chg=1;                            /* 文件已修改标志置为真 */
  g=m;                              /* 保存原屏号 */
  if(xx==ksx)  {                    /* 如在块首行 */
    if(yy<=ksy)  ksy-=yy;           /* 如在块首前, 计算块首列号 */
    else  ksy=0;                    /* 如在块首后,块首列号置 0 */
  }
  if(xx==kwx)  {                    /* 如在块尾行 */
    if(yy<=kwy)  kwy-=yy;           /* 如在块尾前,计算块尾列号 */
    else  kwy=0;                    /* 如在块尾后,块尾列号置 0 */
  }
  dks();                            /* 如块首、块尾重合, 块标志置 1 */
  strcpy(ss[ss_x],ss[ss_x]+yy);     /* 光标后字符前移至行首起 */
  ser-=yy;                          /* 计算字序数 */
  m=0;                              /* 至 0 屏 */
  yy=0;                             /* 至行首 */
  if(a) {                           /* 如为按 Ctrl+E 键时,重显屏幕 */
    if(!g) disp(ss_x,x);            /* 如原在 0 屏,重显当前行 */
    else   disp_t();                /* 否则显示 0 屏 */
  }
}

Ctrl_Y(int a)                       /* 删行,a=1 显示,a=0 不显示 */
{
  int g,i;
  chg=1;                            /* 文件已修改标志置为真 */
  g=m;                              /* 保存原屏号 */
  if((ss_x+(i=H3-x))>=ss_max && xx+i<ttl_x)   tj();
                    /* 如屏幕最下行超出数组,但在总行数内,从fp2或fp读入Q3行 */
  if(xx<ksx) ksx--;                 /* 如被删行在块首行前,块首行号减 1 */
  else  if(xx==ksx) ksy=0;          /* 如被删行为块首行,块首列号置 0 */ 
  if(xx<kwx) kwx--;                 /* 如被删行在块尾行前,块尾行号减 1 */
  else  if(xx==kwx)  kwy=0;         /* 如被删行为块尾行,块尾列号置 0 */ 
  dks();                            /* 如块首、块尾重合,块标志 blck 置 1 */
  ser-=yy;                          /* 计算字序数 */
  if(xx<ttl_x) {                    /* 当删除最后一行时 */
    fp_rd--;                        /* fp 已读出最大行行号减 1 */
    ttl_x--;                        /* 文末行行号减 1 */
    ss_max--;                       /* 编辑数组实用最大行号减 1 */
  }
  movbk(ss_x,1);                    /* ss_x 后各行前移一行 */
  m=0;                              /* 至 0 屏 */
  yy=0;                             /* 至行首 */
  if(a) {                           /* 如参数 a 为真 */
    if(!g) {                        /* 如原在 0 屏 */
      roll_scr_up(x,H3);            /* 自当前行起滚屏 */
      if(xx+i<=ttl_x) disp(ss_x+i,H3);  /* 如最下行还有,显示此行 */
    }
    else  disp_t();                 /* 如原不在 0 屏,则显示 0 屏 */
  }
}

Ctrl_T(int a)                       /* 删至行尾,a=1 显示,a=0 不显示 */
{
  int g;
  chg=1;                            /* 置文件已修改标志为真 */
  g=string_lingth();                /* 测行长 */
  if(xx==ksx && yy<=ksy) ksy=yy;    /* 如在块首行,并在块首列前,计算块首列号 */
  if(xx==kwx && yy<=kwy) kwy=yy;    /* 如在块尾行,并在块尾列前,计算块尾列号 */
  dks();                            /* 如块首、块尾重合, 块标志置 1 */
  strcpy(ss[ss_x]+yy,ss[ss_x]+g);   /* 原行尾回车换行符前移至当前光标处 */
  if(a) disp(ss_x,x);               /* 在按 Ctrl+T 时,重显本行 */
}

Ctrl_F(int a)                       /* 光标移至块首,a=1 显示,a=0 不显示 */
{
  if(blck) {                        /* 如块标志为真,移至块首 */
    if(ksx<=xx)  upto(ksx);         /* 如目标行在当前行或之前,上移至目标行 */
    else dnto(ksx);                 /* 如目标行在当前行后,下移至目标行 */
    ser-=yy-ksy;                    /* 计算字序数 */
    yy=ksy;                         /* 至块首列 */
    if(a)   comp_disp();            /* 如 a 为真,计算参数,重显当前屏幕 */
  }
  else  write_prompt(1);            /* 否则,提示:请先定义块 */
}

Ctrl_D()                           /* 删除块 */
{
  if(blck==2)  {                   /* 如已建立块 */
    chg=1;                         /* 文件已修改标志置为真 */
    txx=xx;                        /* 保存行号 */
    tyy=yy;                        /* 保存列号 */
    del_block();                   /* 删块操作 */
    Shift_F7();                    /* 清除块定义,重显当前屏幕 */
  }
  else  write_prompt(1);           /* 否则,提示: 请先定义块 */
}

dks()                              /* 如块首、块尾重合, 块标志置 1 */
{
   if(ksx==kwx && ksy==kwy)  blck=1;
}

Ctrl_K()                           /* 拷贝块 */
{
  int j,g;
  long i;
  if(blck==2)  {                   /* 如已定义块 */
    i=ser;                         /* 保存原字序号 */
    if(read_block() || over(string_lingth())) {
             /* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如失败退回 */
      ser=i;                       /* 恢复原字序号 */
      return;                      /* 返回 */
    }
    i=kwx-ksx;                     /* 保存原块标记有用参数 */
    j=kwy;
    g=kwy-ksy;
    ser+=tyy-yy;                   /* 计算字序数 */
    mvto(txx);                     /* 重返原坐标,即块拷贝目的位置 */
    kwy=(i==0)?yy+g:j;             /* 计算块坐标变化 */
    ksx=xx;
    ksy=yy;
    kwx=ksx+i;
    write_block(kwx);              /* 将 ddd 中的内容拷到目的位置 */
    chg=1;                         /* 文件已修改标志置为真 */
    comp_disp();                   /* 计算有关参数,显示当前屏幕 */
    ddd=dd;                        /* 指针返回缓冲区头 */
    free(ddd);                     /* 释放 ddd 占用的内存空间 */
  }
  else  write_prompt(1);           /* 否则,提示:请先定义块 */
}

Ctrl_V()                           /* 移动块 */
{
  int k,g;
  long j;
  if(blck==2)  {                   /* 如已定义块 */
    j=ser;                         /* 保存原字序数 */
    if(read_block() || over(string_lingth())) {
             /* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如溢出退回 */
      ser=j;                       /* 恢复原参数 */
      return;                      /* 返回 */
    }
    j=kwx-ksx;                     /* 保存原块标记有用参数 */
    k=kwy;
    g=kwy-ksy;
    del_block();                   /* 删除原块 */
    kwy=(j==0)?yy+g:k;             /* 计算新位置块标记 */
    ksx=xx;
    ksy=yy;
    kwx=ksx+j;
    write_block(kwx);              /* ddd 中块拷至当前光 标处 */
    blck=2;                        /* 置为:已定义块 */
    chg=1;                         /* 文件已修改标志置为真 */
    comp_disp();                   /* 计算显示参数, 显示本屏 */
    ddd=dd;                        /* 指针返回缓冲区头 */
    free(ddd);                     /* 释放 ddd 占用的内存空间 */
  }
  else  write_prompt(1);           /* 否则,提示“请先定义块!” */
}

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058