home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 02 / titel / box.c next >
C/C++ Source or Header  |  1990-12-12  |  6KB  |  235 lines

  1. /* -< Listing 3 >---------------------------------------- */
  2. /*                         BOX.C                          */
  3. /*               Message und Antwort-Boxen                */
  4. /*  Ausgaberoutinen schreiben direkt in den Bildschirm-   */
  5. /*  Speicher. Das Programm wurde mit TurboC++ compiliert. */
  6. /*  Bis auf wenige Routinen (Grafikk. Erkennung, Sound)   */
  7. /*  handelt es sich  allerdings  um  reinstes Standard-C. */
  8. /*  Die Kernroutinen  können  ohne  Probleme  mit  jedem  */
  9. /*  ANSI-C Compiler (QuickC, TopSpeedC) übersetzt werden. */
  10. /*         (c) 1990 by Ulrich Schmitz & toolbox           */
  11. /* ------------------------------------------------------ */
  12. #include <graphics.h>
  13. #include <conio.h>
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <conio.h>
  18. #include <dos.h>
  19.  
  20. /*----------------------- Typendeklarationen  ----------- */
  21. typedef unsigned char byte;
  22.  
  23.  
  24. /*----------------------- Funktionsprototypen ----------- */
  25. void video_init(void);
  26. void WriteCharXY( int x, int y, char z, int a);
  27. void ClrScr( int x1, int y1, int x2, int y2);
  28. void WriteTextXY( int col, int row, char* s);
  29. void Frame(int x1, int y1, int x2, int y2);
  30. void Shadow( int x1, int y1, int x2, int y2);
  31. void Message( char* head, int col, int row, char* s);
  32. void Answer( int col, int row, char* s,
  33.              char* corr, char* z);
  34. void Ausblick(void);
  35. int  getsign(void);
  36.  
  37. /*----------------------- Strukturen          ----------- */
  38. struct crtchar
  39. {
  40.  char ch;
  41.  byte at;
  42. };
  43.  
  44. struct crtchar crtpage[25][80];
  45.  
  46. /* Variable vom Typ SCREEN definieren, um anschließend
  47.    Bildschirm-Adresse auf diese Variablen zu legen.       */
  48. typedef struct crtchar SCREEN[25][80];
  49.  
  50. /*----------------------- Globale Variablen  ------------ */
  51. SCREEN far *screen;
  52. byte TextAttr;
  53. char* corr;
  54.  
  55.  
  56. /************************ Hauptprogramm *******************/
  57. void main()
  58. {
  59. char ans[1];
  60. char* yesno = "JN\0";
  61.  
  62.  clrscr();
  63.  
  64.  video_init();  /* - ermittelt richtige Bildschirmadresse */
  65.  TextAttr = 7;
  66.  ClrScr( 1, 1, 80, 25);
  67.  Message(" Ok-Box ", 30, 15, "Alles paletti!");
  68.  Ausblick();
  69.  Message('', 15, 20, "Eine Message-Box ohne Header...");
  70.  Answer(10, 3, "Drücken Sie [J/N] ...", yesno, ans);
  71. }
  72.  
  73.  
  74. /*----------------------- Funktionen und Prozeduren ----- */
  75. void video_init(void)
  76. {
  77.  int gd, gm;
  78.  detectgraph(&gd, &gm);
  79.  
  80.  /* Beginn   des  Bildschirmspeichers   bei    MDA-Karten */
  81.  if (gd == HERCMONO)
  82.       screen = MK_FP(0xB000, 0);
  83.  else screen = MK_FP(0xB800, 0);         /* andere Karten */
  84. }
  85.  
  86. /*------------------------------------------------------- */
  87.  
  88. void WriteCharXY ( int col, int row, char ch, int num )
  89. {
  90.  int i;
  91.  for (i = 0; i < num; i++)
  92.       {
  93.        (*screen)[row][col + i].ch = ch;
  94.        (*screen)[row][col + i].at = TextAttr;
  95.       }
  96. }
  97.  
  98. /*------------------------------------------------------- */
  99.  
  100. void ClrScr(int x1, int y1, int x2, int y2)
  101. {
  102. int row, col;
  103.  for( row = y1; y1 <= y2; y1++)
  104.       WriteCharXY( x1, row, ' ' , x2-x1 );
  105. }
  106.  
  107. /*------------------------------------------------------- */
  108.  
  109. void WriteTextXY( int col, int row, char* s)
  110. {
  111.  int i;
  112.  for ( i=0 ; i < strlen(s); i++)
  113.        WriteCharXY( col+i, row, s[i], 1);
  114. }
  115.  
  116. /*------------------------------------------------------- */
  117.  
  118. void Frame(int x1, int y1, int x2, int y2)
  119. {
  120.  int i;
  121.  ClrScr( x1, y1, x2, y2);
  122.  WriteCharXY( x1,   y1,  '╔', 1);
  123.  WriteCharXY( x1+1, y1,  '═', x2-x1-2);
  124.  WriteCharXY( x2-1, y1,  '╗', 1);
  125.  
  126.  for( i=y1+1; i <= y2; i++)
  127.      {
  128.       WriteCharXY( x1,   i, '║', 1);
  129.       WriteCharXY( x2-1, i, '║', 1);
  130.      }
  131.  
  132.  WriteCharXY( x1,   y2, '╚', 1);
  133.  WriteCharXY( x1+1, y2, '═', x2-x1-2);
  134.  WriteCharXY( x2-1, y2, '╝', 1);
  135. }
  136.  
  137. /*------------------------------------------------------- */
  138.  
  139. void Shadow( int x1, int y1, int x2, int y2)
  140. {
  141. int i;
  142.  for( i=y1+1; i<=y2+1; i++)
  143.       WriteCharXY( x2, i, '▒', 1);
  144.  
  145.  WriteCharXY( x1+1, y2+1, '▒', x2-x1);
  146. }
  147.  
  148. /*------------------------------------------------------- */
  149.  
  150. void Message( char* head, int col, int row, char* s)
  151. {
  152. int i, len, hlen;
  153. char* head_ptr;
  154.  
  155.  len = strlen(s) + 4;
  156.  
  157. /*--  Für den Rahmen und je ein Blank vorne und hinten ---*/
  158.  Frame( col, row, col+len, row+2);
  159.  
  160.  if ( head )
  161.      {
  162.       hlen = (len-strlen(head)) / 2;
  163.       WriteTextXY ( col + hlen, row, head);
  164.      }
  165.  
  166.  WriteTextXY(col+2, row+1, s);
  167.  
  168. /* optional mit Schatten ---------------------------------*/
  169.  Shadow ( col, row, col+len, row+2);
  170. }
  171.  
  172. /*------------------------------------------------------- */
  173.  
  174. void Answer(int col, int row, char* s,
  175.             char* corr, char* z)
  176. /* corr: enthält alle zulässigen Zeichen
  177.    z   : enthält das eingegebene Antwortzeichen
  178.          bei Fehleingabe wird ein Warnsignal ausgegeben   */
  179.  
  180. {
  181. int i, ii = 0;
  182. char *ptr, *zptr;
  183.  
  184.  Message( " Answer " , col, row, s);
  185.  
  186.  z[0] = (char) getsign();
  187.  
  188.  zptr = strupr(z);
  189.  
  190.  ptr = strupr(corr);
  191.  
  192.  while ( ii <= strlen(corr) )
  193.       {
  194.       ii++;
  195.       if ( *ptr == *zptr )
  196.            ii = strlen(corr) + 2;
  197.       ptr++;
  198.       }
  199.  
  200.  if ( !(ii == (strlen(corr) + 2)) )
  201.      {
  202.        for ( i = 50; i <= 200; i++ )
  203.             {                   /* fehlerhafte Eingabe,   */
  204.               sound(i);         /* mit besten Grüßen an   */
  205.               delay(5);         /* den Daddel-King!       */
  206.               nosound();
  207.               ii = strlen(corr) + 1;     /* Ende setzen   */
  208.             }
  209.       }
  210. }
  211.  
  212. /*------------------------------------------------------- */
  213.  
  214. void Ausblick(void)
  215. {
  216.  ClrScr( 55, 5, 75, 20);
  217.  Frame ( 55, 5, 75, 20);
  218.  Shadow( 55, 5, 75, 20);
  219.  
  220.  WriteTextXY(55+4, 5+5, "demnächst in");
  221.  WriteTextXY(55+4, 5+7, "diesem");
  222.  WriteTextXY(55+4, 5+9, "Theater...");
  223. }
  224.  
  225. /*------------------------------------------------------- */
  226.  
  227. int getsign(void)
  228. {
  229.  union REGS regs;
  230.  regs.h.ah = 0;
  231.  int86(0x16, ®s, ®s);
  232. return(regs.h.al);
  233. }
  234. /* -------------- Ende BOX.C ---------------------------- */
  235.