home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / qc_prog / chap13 / menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-04-07  |  3.4 KB  |  114 lines

  1. /*  menu.c -- uses ansi.sys for cursor control and   */
  2. /*            for video reverse in a sample menu     */
  3. /*  Note: Requires that ANSI.SYS be installed.       */
  4.  
  5. #include <conio.h>
  6. #define ITEMS 5           /* number of menu items */
  7. #define UP 72             /* scan code for up arrow */
  8. #define DOWN 80           /* scan code for down arrow */
  9. #define VIDREV "\033[7m"  /* reverse video attribute */
  10. #define ATTOFF "\033[0m"  /* turn attributes off   */
  11. #define ED()   printf("\033[2J")  /* erase display */
  12. #define HOME() printf("\033[H")  /* home the cursor */
  13. #define CUU(Y) printf("\033[%dA",Y);  /* cursor up */
  14. #define CUD(Y) printf("\033[%dB",Y);  /* cursor down */
  15.  
  16. char *Menu[ITEMS] = {"Add a number to the list",
  17.                      "Delete a number from the list",
  18.                      "Clear the list",
  19.                      "Sum the list",
  20.                      "Quit"};
  21. char *Heading =
  22. "Use arrow keys to highlight choice. "
  23. "Use Enter key to select choice.";
  24.  
  25. void showmenu(int);
  26. int getmesg(int);
  27. main()
  28. {
  29.     int messno = 0; /* message to be highlighted */
  30.     ED();
  31.     showmenu(messno);
  32.     while (messno != ITEMS - 1)
  33.         {
  34.         messno = getmesg(messno);
  35.         ED();
  36.         switch (messno)
  37.            {
  38.            case 0 :
  39.            case 1 :
  40.            case 2 :
  41.            case 3 : printf("...pretending to work ...");
  42.                     printf("Hit any key to continue\n");
  43.                     getch();
  44.                     ED();
  45.                     showmenu(messno);
  46.                     break;
  47.            case 4 : printf("Quitting!\n");
  48.                     break;
  49.            default: printf("Programming error!\n");
  50.                     break;
  51.            }
  52.         }
  53. }
  54.  
  55. /* showmenu() displays the menu  */
  56. void showmenu(highlite)
  57. int highlite;   /* message number to be highlighted */
  58. {
  59.     int n;
  60.     char *start;
  61.  
  62.     HOME();
  63.     printf("%s", Heading);
  64.     for (n = 0; n < ITEMS; n++)
  65.     {
  66.         if (n == highlite)
  67.             start = VIDREV; /* turn on reverse video */
  68.         else
  69.             start = ATTOFF;
  70.         printf("\n\n%s%s%s", start, Menu[n], ATTOFF);
  71.     }
  72.     HOME();
  73.     CUD(2 + 2 * highlite);
  74. }
  75.  
  76. /*  getmesg() selects a menu item */
  77. int getmesg(mnum)
  78. int mnum; /* current message number */
  79. {
  80.     char ch;
  81.  
  82.     while ((ch = getch()) != '\r')
  83.         if (ch == 0)
  84.             {
  85.             ch = getch();
  86.             switch (ch)
  87.                 {
  88.                 case UP   : if (mnum > 0)
  89.                                 {
  90.                                 CUU(2);
  91.                                 showmenu (--mnum);
  92.                                 }
  93.                             else
  94.                                 {
  95.                                 CUD(2 * ITEMS - 2);
  96.                                 showmenu(mnum=ITEMS-1);
  97.                                 }
  98.                             break;
  99.                 case DOWN : if (mnum < ITEMS - 1)
  100.                                 {
  101.                                 CUD(2);
  102.                                 showmenu(++mnum);
  103.                                 }
  104.                             else
  105.                                 {
  106.                                 CUU(2 * ITEMS - 2);
  107.                                 showmenu(mnum = 0);
  108.                                 }
  109.                             break;
  110.                 }
  111.             }
  112.         return mnum;
  113. }
  114.