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

📄 menusubs.c

📁 实现较多功能的界面代码
💻 C
字号:
#include "menudrv.h"
#include "menudrv.def"
#include <alloc.h>
#include <conio.h>
#include <ctype.h>
#include <dos.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*========================================================================*/
/* EDIT subroutines                                                       */
/*========================================================================*/
/* declarations */

int insertx=60,inserty=1;
int trimblanks=FALSE;
int colx=0,coly=0;

/*-----------------------------------------------------------------------*/

void pad(char st[],int len)
/* pad the length of string st to len chars */
{
   char *cp;
   int i;

   /* find end of string */
   for (cp=st,i=0; (*cp != 0) && (i<len); cp++,i++);
   /* if not long enough, pad it */
   while (i<len) {
     *(cp++)=' ';
     i++;
   }
   /* and reterminate it */
   *cp=0;
}

/*-----------------------------------------------------------------------*/

void trim(char st[])
/* trim trailing blanks off of string st */
{
    int i;

    if ( st[0] != 0 ) {
       i = strlen(st)-1;
       while ( (i >= 0) && (st[i] == ' ') ) i--;
       if (st[i] == ' ') st[i]=0;
       else st[i+1]=0;
    }
}

/*-----------------------------------------------------------------------*/

void lcase(char st[])
/* trim and convert string st to lower case */
{
   trim(st);
   while (*st != NULL) tolower(*(st++));
}

/*-----------------------------------------------------------------------*/

int getstring(int x,int y,int *c,char st[],int len)
/* x,y are the position where the field begins; c is the cursor column
   within the field (0 for 1st position); c is updated by getstring() */
/* return codes (based on exit keystroke):
    0:    CR, original entry changed
    1:    CR, original entry unchanged
    2:    Esc
    3:    up arrow, ctrl-e
    4:    left arrow, ctrl-s
    5:    right arrow, ctrl-d
    6:    down arrow, ctrl-x
    7:    ctrl-w
    8:    End
    9:    PgUp, ctrl-r
   10:    PgDn, ctrl-c
   11-20: F1..F10
   21:    ctrl-y
   22:    ctrl-z
   23:    ctrl-n
   24:    Home
*/
{
   int _fret, i, n, nn;
   char ch, c2, ch2, *cp;
   string80 blankfield,model;

/* activate next section if colons (:) are desired around input fields */
/* gotoxy(x - 1,y);
   cprintf("%c", ':');
   gotoxy(x + len,y);
   cprintf("%c", ':');  */

   gotoxy(insertx,inserty);
   if ( insert )
        cputs(" INSERT    ");
   else
        cputs(" OVERWRITE ");

   strcpy(model,st);  /* make reference copy */
   gotoxy(x,y);
   strcpy(blankfield,blank);
   blankfield[len]=0;  /* truncate length */

   pad(st,len);

   cputs(st);

   n = *c;
   do {
      gotoxy(x + n,y);
      ch = getch();

      /*handle special characters*/
      if ( ch == 0 ) {  /* IBM PC special char sequence */
         c2 = getch();  /* get second char */
         /* return predefined exit codes for F1..F10  (11..20) */
         if ((c2 >= 59) && (c2 <= 68)) {
            _fret = c2 - 48;
            goto L99;
         }
         switch ( c2 ) {
            case 72 :        /* up arrow */
               ch = 5;       /* convert to ctrl-e */
               break;
            case 80 :        /* down arrow */
               ch = 24;      /* convert to ctrl-x */
               break;
            case 75 :        /* left arrow */
               ch = 19;      /* convert to ctrl-s */
               break;
            case 77 :        /* right arrow */
               ch = 4;       /* convert to ctrl-d */
               break;
            case 73 :        /* PgUp */
               ch = 18;      /* convert to ctrl-r */
               break;
            case 81 :        /* PgDn */
               ch = 3;       /* convert to ctrl-c */
               break;
            case 82 :        /* Ins */
               ch = 22;      /* convert to ctrl-v */
               break;
            case 83 :        /* Del */
               ch = 7;       /* convert to ctrl-g */
               break;
            case 79 :        /* End */
               _fret = 8;
               goto L99;
            case 71 :        /* Home */
               _fret =  24;  /* return code 24 */
               goto L99;
            default:
               ch = 0;
               break;
         }  /* switch */
      }    /* if special */

      switch ( ch ) {        /* Esc */
         case 27 :
               _fret = 2;
               goto L99;
         case 13 :           /* CR */
               if (strcmp(st,model)==0) _fret = 1;
               else _fret = 0;
               if (y<25) (y)++;
               goto L99;
         case 5 :            /* ctrl-e */
               _fret = 3;
               goto L99;
         case 19 :           /* ctrl-s */
                if ( n == 1 ) {
                  _fret = 4;
                  goto L99;
                }
                else n--;
                break;
         case 4 :            /* ctrl-d */
                if ( n == len ) {
                  _fret = 5;
                  goto L99;
                }
                else n++;
                break;
         case 24 :           /* ctrl-x */
               _fret = 6;
               goto L99;
         case 23 :           /* ctrl-w */
               _fret = 7;
               goto L99;
         case 18 :           /* ctrl-r */
               _fret = 9;
               goto L99;
         case 3 :            /* ctrl-c */
               _fret = 10;
               goto L99;
         case 25 :           /* ctrl-y */
               strcpy(st,blankfield);
               n = 0;
               gotoxy(x,y);
               cputs(blankfield);
              _fret = 21;
              goto L99;
         case 26 :           /* ctrl-z */
              _fret = 22;
              goto L99;
         case 14 :           /* ctrl-n */
              _fret = 23;
              goto L99;
         case 22 :           /* ctrl-v */
               insert = !(insert);
               gotoxy(insertx,inserty);
               if ( insert )
                  cputs(" INSERT    ");
               else
                  cputs(" OVERWRITE ");
               break;
         case 7 :            /* ctrl-g */
               for ( i = n; i < len - 1; i++ )
                  st[i] = st[i + 1];
               st[len - 1] = ' ';
               gotoxy(x,y);
               cputs(st);
               break;
         case 20 :           /* ctrl-t */
               p = n;
               if (st[n] == ' ' )
                  while ( (p < len) && (st[p] == ' ') ) p++;
               else
                  while ( (p < len) && (st[p] != ' ') ) p++;
               strdel(st,n,p);
               for ( i = 0; i <= p - n; i++ )
                  strcat(st," ");
               gotoxy(x,y);
               cputs(st);
               break;
        case 9 :              /* ctrl-i or TAB */
               n++;
               while ((n<len) && (5 * (n / 5) != n)) n++;
               gotoxy(x + n,y);
               break;
        case 17:             /* ctrl-q */
                ch2=getch();
                ch2=toupper(ch2);
                if ((ch2 =='D') || (ch2==4)) {  /* end of line */
                    n=len;
                    while ((st[n-1]==' ') && (n>0)) n--;
                    if (n<len) n++;
                }
                else if ((ch2 == 'S') || (ch==13)) { /* beg of line */
                    n=1;
                    while ((st[n-1]==' ') && (n<len)) n++;
                }
                else if ((ch2=='R') || (ch2==12)) {
                  _fret=9;
                  goto L99;
                }
                else if ((ch2=='C') || (ch2== 3)) {
                  _fret=10;
                  goto L99;
                }
                else putch(7);
                break;
         case 1 :            /* ctrl-a */
               while ( (n > 0) && (st[n] != ' ')) n--;
               while ( (n > 0) && (st[n] == ' ')) n--;
               while ( (n > 0) && (st[n] != ' ' )) n--;
               if ( st[n] == ' ') n++;
               gotoxy(x + n,y);
               break;
         case 6 :            /* ctrl-f */
               /* find end of current word */
               while ( (n < len - 1) && (st[n] != ' ') ) n++;
               nn = n;
               /* find beginning of nextg word */
               while ( (n < len) && (st[n] == ' ') ) n++;
               if ( n == len ) {    /* no next word: back up */
                 n = nn;
                 if (n<len) n++;
               }
               gotoxy(x + n,y);
               break;
         default:
           {
           if ((insert) && !((ch >= 8) && (ch <= 13))){
                  for ( i = len - 1; i > n ; i-- )
                     st[i] = st[i - 1];
                  st[n] = ch;
                  gotoxy(x,y);
                  cputs(st);
               }
               else {
                  if (!((ch >= 8) && (ch <= 13)) ) {
                     st[n] = ch;
                     putch(ch);
                  }
               }
               if ( (ch == '\x08') && (n > 0) )   /*backing up*/
                  n--;
               else if (ch != '\x08')
                  n++;
            }
            break;
      } /*switch/case*/

      if (colx != 0) {
        gotoxy(colx,coly);
        printf("%3d",n+1);
      }

   } while ( ! ((ch == '\x0D') || (n > len)) );
   if ( n >= len )  putch(7);
   _fret = 0;

L99:

   if (trimblanks) {
     if ( st[0] != 0 ) {
       i = len-1;
       while ( (i >= 0) && (st[i] == ' ') ) i--;
       if (st[i] == ' ') st[i]=0;
       else st[i+1]=0;
     }
   }

   (*c) = n;  /* update cursor position */
   return(_fret);

} /*getstring*/

/*-----------------------------------------------------------------------*/
#ifdef editable
/*-----------------------------------------------------------------------*/

int getint(int x,int y,int *i,int w)
{
   int retcd,ret,col;
   string80 temp;
   col=0;

   do {
     sprintf(temp,"%wd",*i);
     retcd = getstring(x,y,&col,temp,w);
     trim(temp);
     ret = sscanf(temp, "%d", i);
     if (ret==0) putch(7);
   }
   while (ret == 0);
   gotoxy(x,y);
   cprintf("%wd", (*i));
   return(retcd);
}  /*getint*/

/*-----------------------------------------------------------------------*/

int getachar(int x,int y,char *ch)
{
  int retval,col;
  col=0;
  retval = getstring(x,y,&col,ch,1);
  return(retval);
}

/*-----------------------------------------------------------------------*/

void editscreen (void)
{
    bclear(2);
    bfore=(color(fore5));
    bback=(color(back5));
    bwrite(2,1,1,"赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突");
    bwrite(2,1,2,"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -