Graphics programming in Windows is based on the GDI, the Windows graphical device interface. The GDI is an API designed to enable us to draw graphics on screen and on the printer. In Delphi, you can use GDI objects and functions directly or you can use the VCL classes that encapsulate GDI functions and objects. In this chapter, we'll mostly work with VCL classes that encapsulate GDI functionality.
In Windows, colors are defined by three values: red, green, and blue. Each value specifies the intensity of the color component. If all the values are set to the minimum value 0, the resulting color is black. If all values are set to the maximum value 255, the resulting color is white. To create a color from these separate color components, you have to use the RGB function.
The RGB function accepts three byte parameters — one parameter for each color component — and returns a COLORREF value. The COLORREF value is a 32-bit unsigned integer value used to specify a color.
function RGB(r, g, b: Byte): COLORREF;
Listing 22-1 uses the RGB function to enable the user to select custom colors, as shown in Figure 22-1.
Figure 22-1: Creating custom colors with the RGB function
The application uses a TPanel component as a preview frame and three TScrollBar components that enable the user to modify the red, green, and blue color components. The Max property of all three TScrollBar components is set to the maximum value for each component: 255. All three TScrollBar components share a single, extremely simple OnChange event handler.
Listing 22-1: Using the RGB function
procedure TForm1.ScrollChange(Sender: TObject); begin Panel1.Color := RGB(RedBar.Position, GreenBar.Position, BlueBar.Position); end;
In Delphi, colors are automatically represented by 32-bit TColor values. The TColor type is declared in the Graphics unit, along with several useful color constants. These color constants cover:
Standard colors like clWhite, clRed, clGreen, clBlue, clBlack, clMaroon
System colors like clBtnFace, clScrollBar, clActiveBorder, clMenu, clWindow
Named web colors like clWebBlueViolet, clWebGainsboro, clWebThistle
You can also specify colors as hexadecimal numbers. When doing so, remember to specify the components "backwards," that is, first specify the blue value, then green, and finally red:
Color := $000000; { black } Color := $FF0000; { blue } Color := $00FF00; { green } Color := $0000FF; { red } Color := $FFFFFF; { white }