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