COLOR - QB64 Wiki


From QB64 Wiki

Jump to: navigation, search

The COLOR statement is used to change the color of text and background in some SCREEN modes.



COLOR [foreground%][, background%]

  • Background colors are available in all QB64 color SCREEN modes.
  • SCREEN mode 10 has only 3 white foreground attributes including flashing.
  • SCREEN modes 12 and 13 can use the foreground parameter only in QB 4.5! Background color 0 can be changed using OUT.
  • SCREEN modes 2 and 11 cannot use the COLOR keyword as they are monochrome with white foreground!
  • An illegal function error will occur if a background color is used in screen modes other than 0, 1, 7, 8 and 9 in QB only!
  • To change the background color only, use a comma and the color. EX: COLOR ,background%
  • In GW-Basic a third border color parameter could be used while in SCREEN 0. The third argument can still be passed in SCREEN 0. Using the third argument in other screen modes will give "Illegal Function Call" Error or will crash without error in 32-bit screens.

Screen Mode Attributes

  • SCREEN 0 background colors 0 to 7 can be changed each text character without affecting other text. Use CLS after a background color statement to create a fullscreen background color. 64 DAC hues with 16 high intensity blinking foreground (16 to 31) color attributes. QBasic windows will not flash in a window in NT, XP, VISTA or 7 (will flash in QB64). See example 7 below for more SCREEN 0 background colors.
  • SCREEN 1 has 4 background color attributes: 0 = black, 1 = blue, 2 = green, 3 = grey. White foreground color only.
  • SCREEN 2 is monochrome with white forecolor and black background. Cannot use the COLOR statement!
  • SCREEN 7 can use 16 (DAC) colors with background colors. RGB settings can be changed in colors 0 to 7 using OUT.
  • SCREEN 8 has 16 color attributes with 16 background colors.
  • SCREEN 9 can use up to 64 DAC color hues in 16 color attributes with background colors assigned to attribute 0 with a PALETTE swap. RGB settings can be changed in colors 0 to 5 and 7 using OUT.
  • SCREEN 10 has only 4 color attributes with black background. COLOR 0 = black, 1 = grey, 2 = flash white and 3 = bright white.
  • SCREEN 11 is monochrome with white forecolor and a black background, Cannot use the COLOR statement!
  • SCREEN 12 can use 16 color attributes with a black background. 256K possible RGB color hues. Background colors can be used with QB64.
  • SCREEN 13 can use 256 color attributes with a black background. 256K possible RGB hues.
  • DAC screens 0, 7 and 9 color changes are limited in Qbasic ONLY!
  • PALETTE swaps can be made in SCREEN 7 and 9 only. Those screens were DAC screen modes in Qbasic.
  • _DEST can be used to set the destination page or image to color using QB64.
  • _DEFAULTCOLOR returns the current color being used on an image or screen page handle.

24/32 Bit Colors using QB64
  • Pixel color intensities for Red, Green, Blue and Alpha range from 0 to 255 when used with _RGB, _RGBA, _RGB32 and RGBA32.
  • Combined RGB function values returned are LONG values! Blue intensity values may be cut off using SINGLE values!
  • _ALPHA transparency values can range from 0 as transparent up to 255 which is fully opaque.
  • _CLEARCOLOR can also be used to set a color as transparent.
  • Colors can be mixed by using _BLEND(default) in 32 bit screen modes ONLY. _DONTBLEND disables blending.
  • NOTE: Default 32 bit backgrounds are clear black or _RGBA(0, 0, 0, 0)! Use CLS to make the black opaque!

(Return to Table of Contents)

RGB Palette Intensities

RGB intensity values can be converted to Hexadecimal values to create the LONG _PALETTECOLOR value in non-32 bit screens:

SCREEN 12 alpha$ = "FF" 'solid alpha colors only OUT &H3C8, 0: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 20 'set black background to dark blue PRINT "Attribute = Hex value Red Green Blue " PRINT COLOR 7 FOR attribute = 0 TO 15 OUT &H3C7, attribute 'set color attribute to read red$ = HEX$(INP(&H3C9) * 4) 'convert port setting to 32 bit values grn$ = HEX$(INP(&H3C9) * 4) blu$ = HEX$(INP(&H3C9) * 4) IF LEN(red$) = 1 THEN red$ = "0" + red$ '2 hex digits required IF LEN(grn$) = 1 THEN grn$ = "0" + grn$ 'for low or zero hex values IF LEN(blu$) = 1 THEN blu$ = "0" + blu$ hex32$ = "&H" + alpha$ + red$ + grn$ + blu$ _PALETTECOLOR attribute, VAL(hex32$) 'VAL converts hex string to a LONG 32 bit value IF attribute THEN COLOR attribute 'exclude black color print PRINT "COLOR" + STR$(attribute) + " = " + hex32$, red$, grn$, blu$ 'returns closest attribute NEXT

Attribute Hex value Red Green Blue COLOR 0 = &HFF000050 00 00 50 COLOR 1 = &HFF0000A8 00 00 A8 COLOR 2 = &HFF00A800 00 A8 00 COLOR 3 = &HFF00A8A8 00 A8 A8 COLOR 4 = &HFFA80000 A8 00 00 COLOR 5 = &HFFA800A8 A8 00 A8 COLOR 6 = &HFFA85400 A8 54 00 COLOR 7 = &HFFA8A8A8 A8 A8 A8 COLOR 8 = &HFF545454 54 54 54 COLOR 9 = &HFF5454FC 54 54 FC COLOR 10 = &HFF54FC54 54 FC 54 COLOR 11 = &HFF5454FC 54 FC FC COLOR 12 = &HFFFC5454 FC 54 54 COLOR 13 = &HFFFC54FC FC 54 FC COLOR 14 = &HFFFCFC54 FC FC 54 COLOR 15 = &HFFFCFCFC FC FC FC

Explanation: The RGB intensity values are multiplied by 4 to get the _RGB intensity values as Hexadecimal values. The individual 2 digit HEX$ intensity values can be added to "&HFF" to make up the 32 bit hexadecimal string value necessary for VAL to return to _PALETTECOLOR. The statement is only included in the example to show how that can be done with any 32 bit color value.
Note: Black has a blue hex value of 50 due to the OUT background color setting which makes it dark blue.

Reading and setting Color Port intensities using INP and OUT
OUT &H3C7, attribute 'Set port to read RGB settings with:
color_intensity = INP(&H3C9) 'reads present intensity setting
OUT &H3C8, attribute 'Set port to write RGB settings with:
OUT &H3C9, color_intensity 'writes new intensity setting
  • After every 3 reads or writes, changes to next higher color attribute. Loops can be used to set more than one attribute's intensities.
  • Color port setting of Red, Green and Blue intensities can be done in ascending order.
  • Color port attribute intensity values range from 0 to 63(1/4 of the 32 bit values) only in Qbasic 4 and 8 bit screen modes.

Hexadecimal 32 bit colors can be set in 16 or 256 color screen modes with _PALETTECOLOR

Example: Changing light gray text in SCREEN 0 to a 32 bit custom color using a LONG HTML hexadecimal value:

COLOR 7 PRINT "Color 7 is gray" K$ = INPUT$(1) _PALETTECOLOR 7, &HFFDAA520 ' FF alpha makes the color translucent PRINT "Color 7 is now Goldenrod in SCREEN 0!

Color 7 is gray Color 7 is now Goldenrod in SCREEN 0!

Explanation: _RGB32 could be used to make custom 32 bit colors or HTML values could be used after &HFF for solid colors.

See also: HEX$ 32 Bit Values to learn more about hexadecimal color values.

(Return to Table of Contents)


Example 1: Reading the default RGB color settings of color attribute 15.

OUT &H3C7, 15 red% = INP(&H3C9) green% = INP(&H3C9) blue% = INP(&H3C9) PRINT red%, green%, blue%

63 63 63

Example 2: Changing the color settings of attribute 0 (the background) to dark blue in SCREENs 12 or 13.

SCREEN 12 OUT &H3C8, 0 'set color port attribute to write OUT &H3C9, 0 'red intensity OUT &H3C9, 0 'green intensity OUT &H3C9, 30 'blue intensity OUT &H3C7, 0 PRINT INP(&H3C9); INP(&H3C9); INP(&H3C9) END

0 0 30

Example 3: Printing in fullscreen SCREEN 0 mode with a color background under the text only.

SCREEN 0: _FULLSCREEN ' used for fullscreen instead of window COLOR 30, 6: LOCATE 12, 4: PRINT "Hello!"

Result: Hello! is printed in flashing high intensity yellow with brown background behind text only when in Qbasic fullscreen.

Example 4: Using CLS after setting the background color in SCREEN 0 to make the color cover the entire screen.



Result: The blue word Hello is printed to a totally grey background in fullscreen.

Example 5: Using a different foreground color for each letter:



Example 6: Doing the same as Example 5 but in only a few lines:

SCREEN 0 text$ = "HelloWorld" FOR textpos = 1 TO LEN(text$) COLOR textpos IF textpos <> 5 THEN PRINT MID$(text$, textpos, 1); IF textpos = 5 THEN PRINT MID$(text$, textpos, 1) 'start print on next row NEXT

Hello World

Explanation:Semicolon(;) means that the next PRINT happens on the same line, we don't want that when it comes to position 5 so when it is at position 5 the next PRINT will move to the next line (when it isn't at position 5 we want it to continue printing the letter side-by-side on the same line though).

Example 7: Since SCREEN 0 only uses background colors 0 to 7 by default, use OUT to change color intensities of color 0 in QB64 only.

OUT &H3C8, 0 'change color 0 intensities OUT &H3C9, 63 OUT &H3C9, 63 OUT &H3C9, 63 OUT &H3C8, 8 'change color 8 intensities OUT &H3C9, 0 OUT &H3C9, 0 OUT &H3C9, 0 COLOR 8: PRINT "Black on bright white!"

Black on bright white!

Explanation: Since QB64 does not use DAC SCREEN 0 limitations, changing color intensities for custom background colors is possible.

(Return to Table of Contents)


See also:

Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page
Personal tools