ID Number: Q50411
5.10 6.00 6.00a 6.00ax 7.00
MS-DOS
Summary:
It is not possible to display more than one background color on the
screen when working in graphics mode. However, you can present the
illusion of creating different background colors for various windows
overlaid on top of the current background color. Use _rectangle() and
_floodfill() to create the windows, and either _outtext() or
_outgtext() to output the text.
More Information:
A common application is the creation of a screen similar to the
following:
|-----------------------------------------------------------------|
| |
| Light Blue Background |
| |
| |------------------------| |
| | | |
| | Dark Blue | |
| | Background | |
| | | |
| |------------------------| |
| |
| |
|-----------------------------------------------------------------|
This is not difficult. The primary problem is getting around the fact
that, when using _outtext(), the text always outputs on blocks of the
current background color. The result of this is that inside of your
dark blue window, you will have text surrounded by borders of light
blue (not very attractive!).
To work around this, you can rely on the fact that _floodfill() uses
the foreground color as its boundary, and not the background color.
Therefore, you can set the background and foreground color equal to
the color of the inner window (Dark Blue above), and draw a rectangle
with _GFILLINTERIOR to the size of the window you desire. Then, change
the foreground color with _setcolor(). Next, you can use _floodfill()
from point (0,0) with the boundary color set to the same color index
as the rectangle. After this, you can use _settextcolor() and
_outtext() to put text in the inner window without problem. A sample
program, WINDOW.C, is listed below.
An easier alternative is to use fonts. _outgtext() does not reset the
character background to the current background color. Instead, it
draws the character over any existing images already on the screen.
Therefore, all that is necessary is to create a filled rectangle of
the desired size, register and set the desired font, and output text
to that area of the screen by using _outgtext(). A sample program,
FONTS.C, can be found below.
Sample Code
-----------
/* WINDOW.C: A sample program that illustrates changing the */
/* color for a window using _outtext, _floodfill, and _rectangle. */
#include <graph.h> /* for the graphics functions */
#include <conio.h> /* for getch() */
void main(void)
{
_setvideomode(_ERESCOLOR); /* set to graphics mode */
_setbkcolor(_BLUE); /* change background color */
_setcolor(1); /* set drawing color */
_settextcolor(3); /* set text color */
_rectangle(_GFILLINTERIOR,100,100,540,250); /* draw a window */
_setcolor(9); /* change color for fill */
_floodfill(0, 0, 1); /* fill in the background */
_settextposition(14, 35); /* coordinates inside square */
_outtext("scribble"); /* output text inside square */
getch(); /* wait for a key hit */
_setvideomode(_DEFAULTMODE); /* reset the video mode */
}
=======================================================================
/* FONTS.C : a slight modification to the "fonts.c" program from the */
/* QuickC 2.0 online Help system, which outputs the fonted text onto */
/* a "window" of a different color, easily producing the effect of */
/* a secondary, window-area-only background color. */
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graph.h>
#define NFONTS 6
unsigned char *face[NFONTS] =
{
"Courier", "Helvetica", "Times Roman", "Modern", "Script", "Roman"
};
unsigned char *options[NFONTS] =
{
"courier", "helv", "tms rmn", "modern", "script", "roman"
};
main ()
{
unsigned char list[20];
/* modify the following path as necessary!!!!! */
char fondir[_MAX_PATH]="d:\\qc2\\samples\\*.fon";
struct videoconfig vc;
struct _fontinfo fi;
short fontnum, x, y, mode = _VRES16COLOR;
/* Read header info from all .FON files in given directory. */
if( _registerfonts( fondir ) <= 0 )
{
_outtext( "Error: can't register fonts" );
exit( 1 );
}
/* Set highest available graphics mode and get configuration. */
while( !_setvideomode( mode ) )
mode--;
if( mode == _TEXTMONO)
exit( 1 );
_getvideoconfig( &vc );
/* Display each font name centered on screen. */
for( fontnum = 0; fontnum < NFONTS; fontnum++ )
{
/* Build options string. */
strcat( strcat( strcpy( list, "t'" ), options[fontnum] ), "'");
strcat( list, "h30w24b" );
_clearscreen( _GCLEARSCREEN );
if( _setfont( list ) >= 0 )
{
/* Use length of text and height of font to center text. */
x = (vc.numxpixels / 2) - (_getgtextextent( face[fontnum] ) / 2);
if( _getfontinfo( &fi ) )
{
_outtext( "Error: Can't get font information" );
break;
}
y = (vc.numypixels / 2) - (fi.ascent / 2);
_moveto( x, y );
if( vc.numcolors > 2 )
/* set up the background window & fill before text output */
_setcolor( fontnum + 2); /* set window color */
_rectangle(_GFILLINTERIOR,100, 100, 540, 250);
_setcolor(fontnum+1); /* set color for text */
_outgtext( face[fontnum] ); /* output fonted text */
getch();
}
else
_outtext( "Error: Can't set font" );
}
_unregisterfonts(); /* free up memory used by fonts*/
exit( !_setvideomode( _DEFAULTMODE ) );
}
Additional reference words: 5.1 5.10 6.0 6.00 6.0a 6.00a 6.0ax 6.00ax
7.00