From QB64 Wiki
Jump to navigation Jump to search

The PAINT statement is used to fill a delimited area in a graphic screen mode with color.


PAINT [STEP] (column%, row%), fillColor[, borderColor%]


  • Can use the STEP keyword for relative coordinate placements. See example 1 below.
  • fillColor is an INTEGER or LONG 32-bit value to paint the inside of an object. Colors are limited to the SCREEN mode used.
  • Optional INTEGER or LONG 32-bit borderColor% is the color of the border of the shape to be filled when this is different from the fill color.


  • fillColor could be a string made up of a sequence of CHR$ values, each representing a tiling pattern to fill the shape.
  • While this is not implemented in QB64, a string value is still accepted, though it won't produce any results.


  • Graphic column% and row% INTEGER pixel coordinates should be inside of a fully closed "shape", whether it's a rectangle, circle or custom-drawn shape using DRAW.
  • If the coordinates passed to the PAINT statement are on a pixel that matches the border colors, no filling will occur.
  • If the shape's border isn't continuous, the "paint" will "leak".
  • If the shape is not totally closed, every color except the border color may be painted over.
  • DRAW shapes can be filled using the string "P fillColor, borderColor". Use a "B" blind move to offset from the shape's border.


Example 1: Painting a CIRCLE immediately after it is drawn using STEP(0, 0) to paint from the circle's center point.

SCREEN 12 x = 200: y = 200 CIRCLE (x, y), 100, 10 PAINT STEP(0, 0), 2, 10

Results: A circle located at x and y with a bright green border filled in dark green. The last coordinate used was the circle's center point and PAINT used it also with the STEP relative coordinates being zero.

Example 2: Routine to check a DRAW string to make sure that the drawn shape is fully closed so that a PAINT does not "leak".

SCREEN 12 drw$ = "C15S20R9D4R6U3R3D3R7U5H3U2R9D3G2D6F1D3F5L10D1G1L4H2L7G2L3H2L3U8L2U5R1BF4" FOR i = 1 TO LEN(drw$) tmp$ = UCASE$(MID$(drw$, i, 1)) check = 1 SELECT CASE tmp$ CASE "U": ver = -1: hor = 0 CASE "D": ver = 1: hor = 0 CASE "E": ver = -1: hor = 1 CASE "F": ver = 1: hor = 1 CASE "G": ver = 1: hor = -1 CASE "H": ver = -1: hor = -1 CASE "L": ver = 0: hor = -1 CASE "R": ver = 0: hor = 1 CASE ELSE: check = 0 END SELECT IF check THEN snum$ = "" FOR j = i + 1 TO i + 4 'set for up to 4 digits and spaces IF j > LEN(drw$) THEN EXIT FOR n$ = MID$(drw$, j, 1) num = ASC(n$) IF (num > 47 AND num < 58) OR num = 32 THEN snum$ = snum$ + n$ ELSE: EXIT FOR END IF NEXT vertical = vertical + (ver * VAL(snum$)) horizont = horizont + (hor * VAL(snum$)) END IF PRINT tmp$, horizont, vertical 'SLEEP NEXT PSET (300, 300): DRAW drw$

Explanation: If the DRAW string is fully closed, the end values should each be 0. In the example, the proper result should be 4, 4 as there is a BF4 offset for PAINT which cannot be on a border. The result is 4, 5 because the shape is not completely closed.