|
|
Line 172: |
Line 172: |
| {{text|W|#5454fc}}{{text|O|#54fcfc}}{{text|R|#fc5454}}{{text|L|#fc54fc}}{{text|D|#fcfc54}} | | {{text|W|#5454fc}}{{text|O|#54fcfc}}{{text|R|#fc5454}}{{text|L|#fc54fc}}{{text|D|#fcfc54}} |
| {{OutputEnd}} | | {{OutputEnd}} |
|
| |
|
| |
| ''Example 6:'' Doing the same as Example 5 but in only a few lines:
| |
| {{CodeStart}} '' ''
| |
| {{Cl|SCREEN (statement)|SCREEN}} 0
| |
| text$ = "HelloWorld"
| |
| {{Cl|FOR...NEXT|FOR}} textpos = 1 {{Cl|TO}} {{Cl|LEN}}(text$)
| |
| {{Cl|COLOR}} textpos
| |
| {{Cl|IF...THEN|IF}} textpos <> 5 {{Cl|THEN}} {{Cl|PRINT}} {{Cl|MID$}}(text$, textpos, 1);
| |
| {{Cl|IF...THEN|IF}} textpos = 5 {{Cl|THEN}} {{Cl|PRINT}} {{Cl|MID$}}(text$, textpos, 1) 'start print on next row
| |
| {{Cl|NEXT}}
| |
|
| |
| {{CodeEnd}}
| |
| {{OutputStart}}
| |
| {{text|H|darkblue}}{{text|e|darkgreen}}{{text|l|darkcyan}}{{text|l|darkred}}{{text|o|darkmagenta}}
| |
| {{text|W|goldenrod}}{{text|o|lightgrey}}{{text|r|dimgray}}{{text|l|blue}}{{text|d|lime}} '' ''
| |
| {{OutputEnd}}
| |
| : ''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 [[_PALETTECOLOR]] to change color intensities of color 0.
| |
| {{CodeStart}} '' ''
| |
| {{Cl|_PALETTECOLOR}} 0, _RGB32(255, 255, 255) 'change color 0 intensity
| |
| {{Cl|_PALETTECOLOR}} 8, _RGB32(0, 0, 0) 'change color 8 intensity
| |
|
| |
| {{Cl|COLOR}} 8: {{Cl|PRINT}} "Black on bright white!" '' ''
| |
| {{CodeEnd}}
| |
| {{WhiteStart}}'''{{text|Black on bright white!|#000000}}'''
| |
| {{WhiteEnd}}
| |
| ----
| |
| : ''Explanation:'' Since QB64 does not have [[DAC]] [[SCREEN]] 0 limitations, changing color intensities for custom background colors is possible.
| |
|
| |
|
| |
| ''Example 8:'' Changing light gray text in [[SCREEN]] 0 to a 32 bit custom color using a [[LONG]] HTML hexadecimal value:
| |
| {{CodeStart}} '' ''
| |
| {{Cl|COLOR}} 7
| |
| {{Cl|PRINT}} "Color 7 is gray"
| |
| K$ = {{Cl|INPUT$}}(1)
| |
| {{Cl|_PALETTECOLOR}} 7, {{Cl|&H}}FFDAA520 ' FF alpha makes the color translucent
| |
| {{Cl|PRINT}} "Color 7 is now Goldenrod in {{Cl|SCREEN}} 0! '' ''
| |
| {{CodeEnd}}
| |
| {{OutputStart}}
| |
| {{text|Color 7 is gray|#A8A8A8}}
| |
| {{text|Color 7 is now Goldenrod in SCREEN 0!|#DAA520}}
| |
| {{OutputEnd}}
| |
| : ''Explanation:'' [[_RGB32]] could be used to make custom 32 bit colors or HTML values could be used after &HFF for solid colors.
| |
| <p style="text-align: center">([[#toc|Return to Table of Contents]])</p>
| |
|
| |
|
|
| |
|
The COLOR statement is used to change the foreground and background colors for printing text.
Syntax
- COLOR [foreground&][, background&]
Description
- background& colors are available in all QB64 color SCREEN modes.
- SCREEN mode 10 has only 3 white foreground attributes including flashing.
- To change the background& color only, use a comma and the desired color. Ex: COLOR , background&
- Graphic drawing statements like PSET, PRESET, LINE, etc, also use the colors set by the COLOR statement if no color is passed when they are called.
- The $COLOR metacommand adds named color constants for both text and 32-bit modes.
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. See _BLINK.
- 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.
- SCREEN 7 can use 16 (DAC) colors with background colors. RGB settings can be changed in colors 0 to 7 using _PALETTECOLOR.
- 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 _PALETTECOLOR swap. RGB settings can be changed in colors 0 to 5 and 7 using _PALETTECOLOR.
- 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.
- 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.
- 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 variables.
- _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. _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
PRINT "Attribute = Hex value Red Green Blue "
PRINT
COLOR 7
FOR attribute = 1 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 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.
Reading and setting color port intensities using INP and OUT
- Legacy code may use INP and OUT to read or set color port intensities. QB64 emulates VGA memory to maintain compatibility.
- The same can be achieved using _PALETTECOLOR (recommended practice).
- 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) in QBasic's legacy 4 and 8 bit screen modes.
(Return to Table of Contents)
Examples
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%
|
Example 2: Changing the color settings of attribute 0 (the background) to blue in SCREENs 12 or 13.
Example 3: Printing in fullscreen SCREEN 0 mode with a color background under the text only.
Example 4: Using CLS after setting the background color in SCREEN 0 to make the color cover the entire screen.
Example 5: Using a different foreground color for each letter:
See also
- $COLOR (metacommand)
- _RGB, _RGBA, _RGB32, RGBA32.
- _RED, _GREEN, _BLUE
- _RED32, _GREEN32, _BLUE32
- _ALPHA, _ALPHA32, _CLEARCOLOR
- PRINT, LOCATE, SCREEN
- POINT, SCREEN (function)
- OUT, INP, PALETTE
- _BLINK
- _DEFAULTCOLOR
- _BACKGROUNDCOLOR
- _PALETTECOLOR
- Color Dialog Box
- Hexadecimal Color Values
Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link