home *** CD-ROM | disk | FTP | other *** search
- /* -< Listing 3 >---------------------------------------- */
- /* BOX.C */
- /* Message und Antwort-Boxen */
- /* Ausgaberoutinen schreiben direkt in den Bildschirm- */
- /* Speicher. Das Programm wurde mit TurboC++ compiliert. */
- /* Bis auf wenige Routinen (Grafikk. Erkennung, Sound) */
- /* handelt es sich allerdings um reinstes Standard-C. */
- /* Die Kernroutinen können ohne Probleme mit jedem */
- /* ANSI-C Compiler (QuickC, TopSpeedC) übersetzt werden. */
- /* (c) 1990 by Ulrich Schmitz & toolbox */
- /* ------------------------------------------------------ */
- #include <graphics.h>
- #include <conio.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <dos.h>
-
- /*----------------------- Typendeklarationen ----------- */
- typedef unsigned char byte;
-
-
- /*----------------------- Funktionsprototypen ----------- */
- void video_init(void);
- void WriteCharXY( int x, int y, char z, int a);
- void ClrScr( int x1, int y1, int x2, int y2);
- void WriteTextXY( int col, int row, char* s);
- void Frame(int x1, int y1, int x2, int y2);
- void Shadow( int x1, int y1, int x2, int y2);
- void Message( char* head, int col, int row, char* s);
- void Answer( int col, int row, char* s,
- char* corr, char* z);
- void Ausblick(void);
- int getsign(void);
-
- /*----------------------- Strukturen ----------- */
- struct crtchar
- {
- char ch;
- byte at;
- };
-
- struct crtchar crtpage[25][80];
-
- /* Variable vom Typ SCREEN definieren, um anschließend
- Bildschirm-Adresse auf diese Variablen zu legen. */
- typedef struct crtchar SCREEN[25][80];
-
- /*----------------------- Globale Variablen ------------ */
- SCREEN far *screen;
- byte TextAttr;
- char* corr;
-
-
- /************************ Hauptprogramm *******************/
- void main()
- {
- char ans[1];
- char* yesno = "JN\0";
-
- clrscr();
-
- video_init(); /* - ermittelt richtige Bildschirmadresse */
- TextAttr = 7;
- ClrScr( 1, 1, 80, 25);
- Message(" Ok-Box ", 30, 15, "Alles paletti!");
- Ausblick();
- Message('', 15, 20, "Eine Message-Box ohne Header...");
- Answer(10, 3, "Drücken Sie [J/N] ...", yesno, ans);
- }
-
-
- /*----------------------- Funktionen und Prozeduren ----- */
- void video_init(void)
- {
- int gd, gm;
- detectgraph(&gd, &gm);
-
- /* Beginn des Bildschirmspeichers bei MDA-Karten */
- if (gd == HERCMONO)
- screen = MK_FP(0xB000, 0);
- else screen = MK_FP(0xB800, 0); /* andere Karten */
- }
-
- /*------------------------------------------------------- */
-
- void WriteCharXY ( int col, int row, char ch, int num )
- {
- int i;
- for (i = 0; i < num; i++)
- {
- (*screen)[row][col + i].ch = ch;
- (*screen)[row][col + i].at = TextAttr;
- }
- }
-
- /*------------------------------------------------------- */
-
- void ClrScr(int x1, int y1, int x2, int y2)
- {
- int row, col;
- for( row = y1; y1 <= y2; y1++)
- WriteCharXY( x1, row, ' ' , x2-x1 );
- }
-
- /*------------------------------------------------------- */
-
- void WriteTextXY( int col, int row, char* s)
- {
- int i;
- for ( i=0 ; i < strlen(s); i++)
- WriteCharXY( col+i, row, s[i], 1);
- }
-
- /*------------------------------------------------------- */
-
- void Frame(int x1, int y1, int x2, int y2)
- {
- int i;
- ClrScr( x1, y1, x2, y2);
- WriteCharXY( x1, y1, '╔', 1);
- WriteCharXY( x1+1, y1, '═', x2-x1-2);
- WriteCharXY( x2-1, y1, '╗', 1);
-
- for( i=y1+1; i <= y2; i++)
- {
- WriteCharXY( x1, i, '║', 1);
- WriteCharXY( x2-1, i, '║', 1);
- }
-
- WriteCharXY( x1, y2, '╚', 1);
- WriteCharXY( x1+1, y2, '═', x2-x1-2);
- WriteCharXY( x2-1, y2, '╝', 1);
- }
-
- /*------------------------------------------------------- */
-
- void Shadow( int x1, int y1, int x2, int y2)
- {
- int i;
- for( i=y1+1; i<=y2+1; i++)
- WriteCharXY( x2, i, '▒', 1);
-
- WriteCharXY( x1+1, y2+1, '▒', x2-x1);
- }
-
- /*------------------------------------------------------- */
-
- void Message( char* head, int col, int row, char* s)
- {
- int i, len, hlen;
- char* head_ptr;
-
- len = strlen(s) + 4;
-
- /*-- Für den Rahmen und je ein Blank vorne und hinten ---*/
- Frame( col, row, col+len, row+2);
-
- if ( head )
- {
- hlen = (len-strlen(head)) / 2;
- WriteTextXY ( col + hlen, row, head);
- }
-
- WriteTextXY(col+2, row+1, s);
-
- /* optional mit Schatten ---------------------------------*/
- Shadow ( col, row, col+len, row+2);
- }
-
- /*------------------------------------------------------- */
-
- void Answer(int col, int row, char* s,
- char* corr, char* z)
- /* corr: enthält alle zulässigen Zeichen
- z : enthält das eingegebene Antwortzeichen
- bei Fehleingabe wird ein Warnsignal ausgegeben */
-
- {
- int i, ii = 0;
- char *ptr, *zptr;
-
- Message( " Answer " , col, row, s);
-
- z[0] = (char) getsign();
-
- zptr = strupr(z);
-
- ptr = strupr(corr);
-
- while ( ii <= strlen(corr) )
- {
- ii++;
- if ( *ptr == *zptr )
- ii = strlen(corr) + 2;
- ptr++;
- }
-
- if ( !(ii == (strlen(corr) + 2)) )
- {
- for ( i = 50; i <= 200; i++ )
- { /* fehlerhafte Eingabe, */
- sound(i); /* mit besten Grüßen an */
- delay(5); /* den Daddel-King! */
- nosound();
- ii = strlen(corr) + 1; /* Ende setzen */
- }
- }
- }
-
- /*------------------------------------------------------- */
-
- void Ausblick(void)
- {
- ClrScr( 55, 5, 75, 20);
- Frame ( 55, 5, 75, 20);
- Shadow( 55, 5, 75, 20);
-
- WriteTextXY(55+4, 5+5, "demnächst in");
- WriteTextXY(55+4, 5+7, "diesem");
- WriteTextXY(55+4, 5+9, "Theater...");
- }
-
- /*------------------------------------------------------- */
-
- int getsign(void)
- {
- union REGS regs;
- regs.h.ah = 0;
- int86(0x16, ®s, ®s);
- return(regs.h.al);
- }
- /* -------------- Ende BOX.C ---------------------------- */
-