home *** CD-ROM | disk | FTP | other *** search
- /* CHRTSUPT.C - Unterstützungsmodul für das Diagrammgrafik-Beispielprogramm */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <string.h>
- #include <conio.h>
- #include <graph.h>
- #include <pgchart.h>
- #include <stdarg.h>
- #include "diagdemo.h"
-
- /* Variablen zur Menüverwaltung. */
- int cMenueEbene = 0; /* Gegenwärtige Menüebene */
- char *szMenueTitel[10]; /* Stapel von Menütiteln */
-
- char *pszBlankMenue[4];
-
- /* Die Variablen zum Verfolgen von Steuerung und Bildschirmposition. */
- struct SCREENINFO si;
-
- /* */
- struct tagFarbe co;
-
- /* BlankMenü - Holt Antworten zu zwei bestimmten Wahlmöglichkeiten.
- *
- * Parameter: pchTitel - Titelzeichenfolge für Menü
- * pchWahl1 - Zeichenfolge für Wahlmöglichkeit 1
- * pchWahl2 - Zeichenfolge für Wahlmöglichkeit 2
- *
- * Ergibt: Return: Anzahl der Wahlmöglichkeiten oder ESCAPE
- */
- int BlankMenue( char *pchTitel, char *pchWahl1, char *pchWahl2 )
- {
- int iWahl;
-
- /* Titel und Wahlmöglichkeiten initialisieren. */
- pszBlankMenue[0] = pchTitel;
- pszBlankMenue[1] = pchWahl1;
- pszBlankMenue[2] = pchWahl2;
- pszBlankMenue[3] = "\0";
- PushTitel( pszBlankMenue[0]);
-
- while( WAHR )
- {
- /* Nur Anfangsbuchstaben einer der Wahlmöglichkeiten akzeptieren,
- * oder ESC.
- */
- iWahl = Menue( pszBlankMenue );
- switch( iWahl )
- {
- case 1:
- case 2:
- case ESCAPE:
- return iWahl;
- }
- }
- }
-
- /* LschForm - Löscht den Innenbereich der Bildschirmanzeige
- *
- * Parameter: Keine
- */
- void LschForm()
- {
-
- /* Bildschirm-Teilausschnitt einrichten und löschen, dann ganzen
- * Bildschirm rücksetzen.
- */
- _settextwindow( si.top, 1, si.bot, 80 );
- _clearscreen( _GWINDOW );
- _settextwindow( 1, 1, 25, 80 );
-
- }
-
- /* LschHilfe - Clears the current help Zeile.
- *
- * Parameter: None
- */
- void LschHilfe()
- {
- /* Hilfezeilenzähler um 1 verringern und die Zeile löschen. */
- _settextwindow( --si.help, 1, si.help, 80 );
- _clearscreen( _GWINDOW );
- _settextwindow( 1, 1, 25, 80 );
- }
-
- /* FehlerMldg - Bringt eine Fehlermeldung.
- *
- * Parameter: pchMdg - Zeichenfolge der Fehlermeldung
- */
- void FehlerMldg( char *pchMdg )
- {
-
- /* Warnsignal, Fehlerfarbe festlegen, dann Fehlermeldung und
- * 'Weiter'-Frage ausgeben.
- */
- putch( SIGNAL );
- Hilfe( pchMdg, co.FehlerFarbe );
- Hilfe( "Weiter durch Drücken beliebiger Taste.", co.FehlerFarbe );
-
- /* Auf Tastendruck warten und Hilfezeilen löschen. */
- getch();
- LschHilfe();
- LschHilfe();
-
- }
-
- /* Hilfe - Zeigt eine Hilfezeile auf dem Bildschirm.
- *
- * Parameter: pchMdg - Zeichenfolge der Fehlermeldung
- * sFarbe - Farbe für Meldung
- */
- void Hilfe( char *pchMdg, short sFarbe )
- {
-
- struct rccoord rcCursor;
-
- /* Gegenwärtige Cursorposition speichern. */
- rcCursor = _gettextposition();
-
- /* Hilfezeile ausgeben und Hilfezeilen-Positionsvariable um 1 erhöhen. */
- AusgabePos( si.help++, 5, pchMdg, sFarbe );
-
- /* Cursorposition wiederherstellen. */
- _settextposition( rcCursor.row, rcCursor.col );
-
- }
-
- /* EingabeChar - Fragt nach und ergibt Eingabezeichen.
- *
- * Parameter: pchFrage - Zeichenfolge für Anfrage
- * pchAkzept - Zeichenfolge akzeptabler Zeichen (Groß- und
- * Kleinschreibung werden unterschieden)
- *
- * Ergibt: Eingegebenes Zeichen
- */
- char EingabeChar( char *pchFrage, char *pchAkzept )
- {
- char chAntwort;
-
- /* Anfrage ausgeben. */
- AusgabePos( si.mid, 10, pchFrage, co.EingabeFarbe );
-
- /* Schleife weiterführen bis Antwort gültig ist. */
- while( WAHR )
- {
- chAntwort = toupper( getch() );
-
- /* Zeichen anzeigen und ergeben, wenn gültig, sonst Warnsignal. */
- if( *strchr( pchAkzept, chAntwort) )
- {
- _settextcolor( co.InfoFarbe );
- putch( chAntwort );
- return chAntwort;
- }
- else
- putch( SIGNAL );
- }
- }
-
- /* EingabeInt - Fragt nach und ergibt Ganzzahlwert innerhalb eines
- * bestimmten Bereiches.
- *
- * Parameter: pchFrage - Zeichenfolge für Anfrage
- * iAlt - Voriger Wert
- * iMin - Mindestwert des Bereichs
- * iMax - Höchstwert des Bereichs
- *
- * Ergibt: Vom Benutzer eingegebene Ganzzahl
- */
- int EingabeInt( char *pchFrage, int iAlt, int iMin, int iMax )
- {
- int i;
- char szTmp[70];
-
- /* Zur Eingabe einer Zeichenfolge auffordern, diese dann zu Ganzzahl
- * umwandeln bis sich ein Wert innerhalb des bestimmten Bereichs ergibt.
- * Diesen Wert schließlich ergeben.
- */
- do
- {
- EingabeString( pchFrage, itoa( iAlt, szTmp, 10) );
- i = atoi( szTmp );
- } while( !InBereich( i, iMin, iMax) );
- return i;
- }
-
- /* EingabeFloat - Fordert zur Eingabe eines Gleitkommawerts auf und
- * ergibt diesen.
- *
- * Parameter: pchFrage - Zeichenfolge für Aufforderung
- * fAlt - Voriger Wert
- *
- * Ergibt: Vom Benutzer eingegebene Gleitkommazahl
- */
- float EingabeFloat( char *pchFrage, float fAlt )
- {
- char szTmp[70];
-
- /* Zur Eingabe einer Zeichenfolge auffordern, zu Gleitkomma umwandeln */
- sprintf( szTmp, "%f", fAlt );
- EingabeString( pchFrage, szTmp );
- return atof( szTmp );
- }
-
- /* EingabeString - Aufforderung zur Eingabe einer Zeichenfolge. Bis erstes
- * Zeichen eingegeben ist, wird vorige Zeichenfolge gezeigt, dann durch
- * neue Eingabe ersetzt.
- *
- * Parameter: pchFrage - Zeichenfolge für Aufforderung
- * pchAlt - Zwischenspeicher für vorige Zeichenfolge; muß groß
- * genug für neue Zeichenfolge sein.
- *
- * Ergibt: Zeiger zu pchAlt, wo nun neue Zeichenfolge vorliegt
- */
- char *EingabeString( char *pchFrage, char *pchAlt )
- {
- char szTmp[81], ch;
- int x = 5, y = si.mid;
-
- /* Aufforderung in Ausschnittmitte ausgeben. */
- LschForm();
- AusgabePos( y, x, pchFrage, co.EingabeFarbe );
- x += strlen( pchFrage );
-
- /* Vorigen Wert zur Bezugnahme ausgeben. */
- _outtext( pchAlt );
- _settextposition( y, x );
-
- /* Auf Eingabe warten, danach alte Zeichenfolge löschen. */
- while( !(ch = kbhit()) )
- ;
- memset( szTmp, ' ', 80 );
- szTmp[80] = '\0';
- AusgabePos( y, x, szTmp, -1 );
-
- /* Neue Zeichenfolge holen und zu Ergebnis machen. Wenn Null-
- * Zeichenfolge (EINGABE-Taste gedrückt), ist alter Wert das Ergebnis.
- */
- _settextcolor( co.InfoFarbe );
- _settextposition( y, x );
- szTmp[0] = 70; /* Einlesebare Maximallänge */
- cgets( szTmp );
- if( szTmp[1] > 0 ) /* Wurden überhaupt Zeichen eingelesen? */
- {
- strcpy( pchAlt, &szTmp[2] );
- return &szTmp[2];
- }
- else
- {
- _settextposition( y, x );
- return pchAlt;
- }
- }
-
- /* InBereich - Prüft ob Ganzzahl innerhalb des bestimmten Bereichs liegt.
- *
- * Parameter: iWert - Zu prüfende Ganzzahl
- * iMin - Mindestwert des Bereichs
- * iMax - Höchstwert des Bereichs
- *
- * Ergibt: WAHR sofern innerhalb des Bereichs, sonst FALSCH
- */
- BOOL InBereich( int Value, int iMin, int iMax )
- {
- /* Bereich prüfen und WAHR ergeben wenn gültig, sonst FALSCH. Bitte zu
- * beachten, daß (iMin >= iMax) nur als Anweisung verstanden wird, auf
- * den Mindestwert zu prüfen; Höchstwert gibt es keinen.
- */
- if( Value >= iMin )
- if( (Value <= iMax) || (iMin >= iMax) )
- return WAHR;
- else
- {
- FehlerMldg( "Ungültiger Wert." );
- return FALSCH;
- }
- }
-
- /* Menü - Zeichnet Menü auf Bildschirm; ergibt Anzahl der Wahlmöglichkeiten.
- *
- * Parameter: Datenfeld der Menü-Zeichenfolgen
- *
- * Ergibt: Zahl für die aus dem Menü getroffene Wahl
- */
- int Menue( char *pszMenueListe[] )
- {
- int iItem, cItem, yItem, x = 10;
- char chAntwort;
-
- /* Menü-Wahlmöglichkeiten zählen. */
- for( cItem = 1; *pszMenueListe[cItem]; cItem++ )
- ;
- --cItem;
-
-
- /* Form löschen und Wahlmöglichkeiten des Menüs ausgeben. */
- WrtForm( 10 + cItem );
- for( iItem = 1, yItem = 8; iItem <= cItem; iItem++, yItem++ )
- {
- AusgabePos( yItem, x, pszMenueListe[iItem], co.EingabeFarbe );
- PrintChar( yItem, x, pszMenueListe[iItem][0], co.HellFarbe );
- }
- ++yItem;
-
- /* Aufforderung und Hilfe anzeigen. */
- if( strcmpi( pszMenueListe[0], "Hauptmenü" ) )/* Falls nicht Hauptmenü */
- Hilfe( "Anfangsbuchstaben Ihrer Wahl eingeben, bzw. zurück mit ESC.",
- co.EingabeFarbe );
- else
- Hilfe( "Anfangsbuchstaben Ihrer Wahl eingeben; mit \"E\" beenden.",
- co.EingabeFarbe );
-
- AusgabePos( yItem, x += 5, "Ihre Wahl? ", co.InfoFarbe );
- x += 11;
-
- /* Schleife bis zu brauchbarer Wahl; Warnsignal bei ungültiger Wahl. */
- while( WAHR )
- {
- _settextposition( yItem, x );
- chAntwort = toupper( getch() );
-
- /* Zurück - aufgrund Drücken von ESC. */
- if( chAntwort == 27 )
- {
- LschHilfe();
- return ESCAPE;
- }
-
- /* Unter Wahlmöglichkeit nach entsprechendem Anfangsbuchstaben
- * suchen. Dann betreffende Wahlmöglichkeit als Ergebnis ausgeben
- * und Hilfezeile löschen.
- */
- for( iItem = 1; iItem <= cItem; iItem++ )
- {
- if( chAntwort == toupper( pszMenueListe[iItem][0]) )
- {
- putch( chAntwort );
- LschHilfe();
- return iItem;
- }
- }
-
- /* Hierher kommt man nur, wenn keine brauchbare Wahlmöglichkeit
- * gefunden wurde; deshalb Warnsignal und Vorgang wiederholen.
- */
- putch( SIGNAL );
- }
- }
-
- /* PopTitel - Einen Menütitel aus dem Menüstapel entnehmen.
- *
- * Parameter: Keine
- */
- void PopTitel()
- {
- szMenueTitel[--cMenueEbene] = "";
- }
-
- /* AusgabePos - Druckt an den bestimmten Koordinaten (Reihe/Spalte)
- * eine Zeichenfolge in der festgelegten Farbe .
- *
- * Parameter: row - Reihe wo Ausgabe der Zeichenfolge beginnen soll
- * col - Spalte wo Ausgabe der Zeichenfolge beginnen soll
- * lpszString - Null-abgeschlossene Zeichenfolge
- * sFarbe - Farbe zur Ausgabe der Zeichenfolge (-1 wenn
- * AusgabePos die Farbe unverändert belassen soll)
- */
- void AusgabePos(int row, int column, char far * lpszString, short sFarbe)
- {
- if( sFarbe != -1L )
- _settextcolor( sFarbe );
- _settextposition( row, column );
- _outtext( lpszString );
- }
-
- /* PrintChar - Druckt an den bestimmten Koordinaten (Reihe/Spalte)
- * eine Zeichenfolge in der festgelegten Farbe .
- *
- * Parameter: row - Reihe wo Ausgabe der Zeichenfolge beginnen soll
- * col - Spalte wo Ausgabe der Zeichenfolge beginnen soll
- * cChar - Zu druckendes Zeichen
- * sFarbe - Farbe zur Ausgabe der Zeichenfolge (-1 wenn
- * AusgabePos die Farbe unverändert belassen soll)
- */
- void PrintChar(int row, int column, char cChar, short sFarbe)
- {
- char szTiny[2];
-
- szTiny[0] = cChar;
- szTiny[1] = '\0';
- AusgabePos( row, column, szTiny, sFarbe );
- }
-
- /* PushTitel - Legt einen Menütitel zuf den Menüstapel.
- *
- * Parameter: pchTitel - abzulegende Titelzeichenfolge
- */
- void PushTitel( char *pchTitel )
- {
- szMenueTitel[cMenueEbene++] = pchTitel;
- }
-
- /* SetDisplayColors - Farben auf Wert einrichten, die dem vorhandenen
- * Videoadapter entsprechen.
- *
- * Parameter: Keine
- */
- void SetDisplayColors()
- {
- if( ismono( si.mode ) )
- {
- co.EingabeFarbe = M_INPUTCOLOR;
- co.HellFarbe = M_HILITECOLOR;
- co.FormFarbe = M_FORMCOLOR;
- co.TitelFarbe = M_TITLECOLOR;
- co.FehlerFarbe = M_ERRORCOLOR;
- co.InfoFarbe = M_INFOCOLOR;
- }
- else
- {
- co.EingabeFarbe = C_INPUTCOLOR;
- co.HellFarbe = C_HILITECOLOR;
- co.FormFarbe = C_FORMCOLOR;
- co.TitelFarbe = C_TITLECOLOR;
- co.FehlerFarbe = C_ERRORCOLOR;
- co.InfoFarbe = C_INFOCOLOR;
- }
- }
-
- /* SAusgabePos - Zeichenfolge über sprintf() formatieren und mit
- * AusgabePos zum Bildschirm ausgeben.
- *
- * Parameter: iReihe - Reihe, wo Anzeige anfangen soll
- * iSplt - Spalte, and der Anzeige anfangen soll
- * szFmt - Formatierfolge (für richtige Schreibweise von
- * Formatierfolgen siehe Begleitliteratur der
- * Laufzeitbibliothek).
- * ... - Auszugebende Variablen
- */
- void SAusgabePos( int iReihe, int iSplt, char * szFmt, ... )
- {
- char szTmp[81];
- va_list Marke;
- va_list saveMarke;
-
- va_start( Marke, szFmt );
- saveMarke = Marke;
- vsprintf( szTmp, szFmt, Marke );
- va_end( Marke );
-
- AusgabePos( iReihe, iSplt, szTmp, -1 );
- }
-
- /* WrtForm - Zeigt Bildschirmformat.
- *
- * Parameter: yBot - Reihennummer der untersten Reihe
- */
- void WrtForm( int yBot )
- {
- int i;
- char szTmp[81];
-
- /* Rechts oben die Copyright-Meldung ausgeben. */
- _clearscreen( _GCLEARSCREEN );
- AusgabePos( 1, 55, "Diagrammgrafik - Demo", co.TitelFarbe );
-
- /* Die obere Trennzeile löschen. */
- memset( szTmp, ' ', 79 );
- szTmp[79] = 0;
- AusgabePos( 2, 55, "(C) 1990, Microsoft", co.TitelFarbe );
-
- /* Alle ebenen des Menütitels anzeigen. */
- _settextposition( 5, 5 );
- for( i = 0; i < cMenueEbene; i++ )
- {
- if( i )
- _outtext( " - " );
- _outtext( szMenueTitel[i] );
- }
-
- /* Obere Trennzeile anzeigen. */
- memset( szTmp, 196, 80 );
- szTmp[80] = 0;
- AusgabePos( 6, 1, szTmp, co.FormFarbe );
-
- /* Untere Trennzeile anzeigen. */
- AusgabePos( yBot, 1, szTmp, co.FormFarbe );
-
- /* Globale Bildschirm-Variablen einrichten. */
-
- si.help = yBot + 1;
- si.top = 7;
- si.bot = yBot - 1;
- si.mid = (si.top + si.bot) / 2;
- }
-