Author: Embarcadero USA
Technical Information Database TI676C.txt Getting Input In Graphics Mode Category :General Platform :All Product :Borland C++ 3.0 Description: This program demonstrates how to get input from the user in graphics mode, echoed in the current colors and font size and font style. Functions: newLine() advances the (graphic) text position to the next line. getGrString(): echoes graphically the user input and stores it in a buffer. doCursor(): a helper function for getGrString, to handle the cursor. main(): the use of getGrString is demonstrated for string and numeric input. NOTE: Although it is believed that this software is fully functional as described in the comments, no guarantees are made, express or implied. /* ....................................................... */ #define ON 1 #define OFF 0 #include #include #include #include void doCursor(int); void newLine(); void getGrString(char *); int main(void) { char nameString[80],ageString[80]; int age; /* request auto detection */ int gdriver = DETECT, gmode, errorcode; /* initialize graphics and local variables */ initgraph(&gdriver, &gmode, ""); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); return(1); /* terminate with an error code */ } /* use some colors to show that getGrString() handles foreground and background colors successfully. */ setbkcolor(BLUE); setcolor(YELLOW); /* left-to-right gothic font, user-sizeable */ /* change this as you like, except getGrString assumes left-to-right text direction! */ settextstyle(GOTHIC_FONT,HORIZ_DIR,0); /* get a reasonable screen position */ moveto(0,0); outtext("Your name please? "); getGrString(nameString); newLine(); /* just to demonstrate that you can get numeric input from a string! */ outtext("Your age please? "); getGrString(ageString); /* note: if atoi() returns 0, the string may not have been a valid number! A real program should check for this. */ age=atoi(ageString); newLine(); outtext("Name: "); outtext(nameString); /* increment age to work with it as a number */ ++age; /* make it a string again */ sprintf(ageString,"%d",age); newLine(); outtext("Next year, you will be "); outtext(ageString); newLine(); outtext("Press key to exit! "); getch(); closegraph(); return 0; } /* newLine: primitive yet serviceable routine for a new text line in graphics mode */ void newLine() { moveto(0,gety()+textheight("A")); } /* getGrString: takes a parameter of an input buffer, echoes characters typed, and fills input buffer. Function returns upon or . Function responds appropriately to backspace. No provision is made to guard against overflow of the buffer or going over the right screen border. */ void getGrString(char *inputString) { /* stringIndex is the current place in the string, so that we may build it as we go along getting input characters */ int stringIndex=0; /* xVal will store the screen position for each char as we go along, so that we can erase and move the cursor successfully during backspacing */ int xVal[255]; /* inputChar: the character typed; outString: the string version of that character */ char inputChar, outString[2]; /* oldColor saves the previous color value, to restore after erasing */ int oldColor; /* outString is just one char + a null-terminator */ outString[1]=0; /* screen starting position for input char string */ xVal[0]=getx(); do { /* turn on the cursor */ doCursor(ON); /* get a single character, in no-echo mode */ inputChar=getch(); /* turn off the cursor before we write a new character */ doCursor(OFF); /* avoid dealing with all special keys */ if (inputChar==0) getch(); else { if (inputChar==8) { /* backspace */ /* save old character color */ oldColor=getcolor(); /* back up in the string */ --stringIndex; /* no backing up past beginning of string! */ if (stringIndex
Article originally contributed by Borland Staff