vbdpss.hlp (Table of Contents; Topic list)
Article Q45424
                                                 Contents  Index  Back
─────────────────────────────────────────────────────────────────────────────
                           Knowledge Base Contents  Knowledge Base Index
 
 
 SCREEN 9; 16 Foreground and Background Colors Simultaneously - Q45424
 
 Microsoft Visual Basic version 1.0 for MS-DOS can support up to SCREEN
 13, depending on the video card installed in your machine. Using the
 COLOR statement, in all color modes you can simultaneously display all
 foreground colors available in that particular mode.
 
 However, simultaneously displaying multiple background colors is
 supported only in SCREEN mode 0 (zero) (character mode). SCREEN 0 is
 the only SCREEN mode that supports displaying all 16 foreground colors
 and all eight background colors simultaneously. When you invoke the
 COLOR statement with a background color argument in any SCREEN mode
 other than 0, you get only one background color, and the entire screen
 background is affected.
 
 The VBDOS program listed below contains routines that, if used in
 place of PRINT and COLOR when in SCREEN 9, provide the ability to
 display 16 foreground colors and 16 "background" colors
 simultaneously. This program uses foreground colors with bit masking
 to draw inverse-video characters with multiple background colors
 simultaneously on the screen in graphics mode. The routines could
 easily be modified to support SCREEN 12.
 
 More Information:
 
 The module below contains two SUBprograms that can be CALLed in the
 same way as the PRINT or COLOR statements when the following INCLUDE
 file is included, or can be used with the CALL statement. The INCLUDE
 file contains the DECLARE statements for the S9COLOR and S9PRINT and
 CONST declarations for all 16 colors so the colors can be referenced
 by name. The two routines are as follows:
 
  - S9COLOR: Takes two parameters: foreground color and background
    color, respectively. Unlike the COLOR statement, the parameters are
    not optional. If you want to change only the foreground color, both
    parameters must be provided. The COLOR statement can still be used,
    but it will not affect strings printed using S9PRINT. The following
    is an example:
 
       S9COLOR Green, BrRed
       CALL S9COLOR (BrBlue, Cyan)
 
  - S9PRINT: Takes only one parameter, the STRING to be printed. The
    parameter can be a simple STRING literal or a STRING expression. No
    special formatting characters are supported, but they could easily
    be added. Placing a pipe character (|) at the end of the STRING
    causes a carriage return-linefeed to be executed after the STRING
    is printed. The following is an example:
 
       S9PRINT "This is the text to be printed"
       S9PRINT A$+B$
       S9PRINT STRING$(50,"X")
       S9PRINT "The PIPE causes a CRLF|"  'the PIPE is not printed
       CALL S9PRINT "CALL statement used"
 
 Code ($INCLUDE File S9LIB.BI)
 -----------------------------
 
 DECLARE SUB S9COLOR (fcolor%, bcolor%)
 DECLARE SUB S9PRINT (text$)
 CONST Black = 0, Blue = 1, Green = 2, Cyan = 3, Red = 4, Magenta = 5
 CONST Brown = 6, White = 7, Gray = 8, BrBlue = 9, BrGreen = 10
 CONST BrCyan = 11, BrRed = 12, Pink = 13, Yellow = 14, BrWhite = 15
 
 See the example program which demonstrates the use of the S9COLOR and
 S9PRINT routines. It simultaneously displays all the possible
 combinations of foreground and background colors.
 
 Code (Example of Main Program)
 ------------------------------
 
 S9DEMO.BAS
 ----------
 
 Example
 -------
 
 ' To try this example in VBDOS.EXE:
 ' 1. From the File menu, choose New Project.
 ' 2. Copy the code example to the Code window.
 ' 3. Press F5 to run the program.
 
 '* S9DEMO.BAS     Demo for S9LIB.BAS  *
 '$INCLUDE: 'S9LIB.BI'
 
 '* Shared Variables between SUBprograms
 DIM SHARED bgblock%(2242)
 DIM SHARED fcolor%, bcolor%
 
 DIM colornames$(15)
 FOR I% = 0 TO 14
   READ colornames$(I%)
 NEXT I%
 SCREEN 9
 CLS
 FOR bc% = 0 TO 15
   LOCATE , 2
   FOR fc% = 0 TO 14
     S9COLOR fc% + 1, bc%
     S9PRINT colornames$(fc%)
   NEXT
   PRINT
 NEXT
 S9COLOR black, brred
 a$ = "PRESS ANY KEY|"
 LOCATE 23, 40 - (LEN(a$) \2)
 S9PRINT a$
 SLEEP
 END
 DATA Blue,Green,Cyan,Red,Magenta,Brown,White,Gray
 DATA BrBlue,BrGreen,BrCyan,BrRed,Pink,Yellow,BrWhite
 
 '********************************************************************
 'S9COLOR:  Simply stores the color values passed to the routine
 '          in bcolor% and fcolor%, which are used in S9PRINT.
 '********************************************************************
 SUB S9COLOR (nfcolor%, nbcolor%)
   bcolor% = nbcolor%
   fcolor% = nfcolor%
 END SUB
 
 '*********************************************************************
 'S9PRINT:  This routine will not wrap around if the string exceeds
 'column 80. It truncates whatever text is being printed at column 80.
 'The string length in pixels is first calculated. A LINE statement with
 'the BF option (Box Fill) using the desired background color is
 'executed. The resulting block of color is saved with a GET statement.
 'The string is then printed in the background color. The saved block of
 'background color is then PUT over the string. The resulting block of
 'text, which is a black foreground with the desired background color,
 'is then saved using another GET statement. The string is then
 'reprinted in the desired foreground color, and the block save with the
 'last GET statement is PUT over the text, resulting in the text printed
 'with the desired foreground and background colors, without affecting
 'the rest of the screen. The PUT statements are all executed using the
 'XOR action verb.
 '*********************************************************************
 SUB s9print (text$)
   tx% = POS(0)
   ty% = CSRLIN
   col% = (tx% - 1) * 8
   row% = (ty% - 1) * 14
   maxpix% = 639 - col%
   maxlength% = 81 - tx%
   IF RIGHT$(text$, 1) = "|" THEN
     CR% = 1
     tlength% = (LEN(text$) - 1)
     text$ = LEFT$(text$, tlength%)
     tlength% = tlength% * 8 - 1
   ELSE
     CR% = 0
     tlength% = LEN(text$) * 8 - 1
   END IF
   IF tlength% > maxpix% THEN
     text$ = LEFT$(text$, maxlength%)
     tlength% = maxpix%
   END IF
   LINE (col%, row%)-STEP(tlength%, 13), bcolor%, BF
   GET (col%, row%)-STEP(tlength%, 13), bgblock%(0)
   COLOR bcolor%
   PRINT text$;
   LOCATE ty%, tx%
   PUT (col%, row%), bgblock%(0), XOR
   GET (col%, row%)-STEP(tlength%, 13), bgblock%(0)
   COLOR fcolor%
   PRINT text$;
   PUT (col%, row%), bgblock%(0), XOR
   IF CR% = 1 THEN PRINT
 END SUB