Difference between revisions of "Colors"

From Free Pascal wiki
m (System colors)
(System colors)
Line 44: Line 44:
 
=System colors=
 
=System colors=
  
System colors are color constants with a special meaning. Their real value depends on the context and theme. The following table lists the system colors and their meaning. Using them outside the scope of the definition is undefined and the result depends on the widgetset and theme. For example '''clBackground''' is the normal background brush of the used device context. If you want to paint button elements on your own custom controls use the drawing functions of the unit '''Themes'''.
+
System colors are color constants with a special meaning. Their real value depends on the context and theme. They are not simple colors.
 +
For example:
 +
 
 +
<Delphi>
 +
Form1.Canvas.Brush.Color:=clInfoBk;  // use the default background brush of a hint window
 +
Form1.Canvas.FillRect(10,10,50,50);
 +
</Delphi>
 +
 
 +
A hint window on MS Windows might have a white background so the above will draw white. On Linux/gtk2 it might be a metallic texture, so the above will draw the texture. If you want to put some text onto this you need a corresponding color like clInfoText, otherwise your text might be unreadable for the user. For example:
 +
 
 +
<Delphi>
 +
Form1.Canvas.Brush.Color:=clInfoBk;  // use the default background brush of a hint window
 +
Form1.Canvas.FillRect(10,10,50,50);
 +
Form1.Canvas.Font.Color:=clInfoText;  // use the default text color of a hint window
 +
Form1.Canvas.TextOut(10,10,'Hint');
 +
</Delphi>
 +
 
 +
 
 +
The following table lists the system colors and their meaning. Using them outside the scope of the definition is undefined and the result depends on the widgetset and theme. For example '''clDefault''' is the normal background brush of the used device context. If you want to paint button elements on your own custom controls use the drawing functions of the unit '''Themes'''.
  
 
{| BORDER="1" CELLSPACING="0"
 
{| BORDER="1" CELLSPACING="0"

Revision as of 10:52, 2 May 2010

Overview

The standard color in the LCL is TColor, which is compatible to Delphi's TColor. TColor can be an RGB, 3x8bit, value or a system color like clDefault. The LCL can work together with the fpImage system which uses the TFPColor (RGBA, 4x16bit).

Convert TColor to RGB and back

The unit Graphics provide the following functions:

<Delphi> function Blue(rgb: TColor): BYTE; // does not work on system color function Green(rgb: TColor): BYTE; // does not work on system color function Red(rgb: TColor): BYTE; // does not work on system color function RGBToColor(R, G, B: Byte): TColor; procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // does not work on system color function FPColorToTColor(const FPColor: TFPColor): TColor; function TColorToFPColor(const c: TColor): TFPColor; // does not work on system color </Delphi>


There are some predefined color constants: <Delphi>

 // standard colors
 clBlack   = TColor($000000);
 clMaroon  = TColor($000080);
 clGreen   = TColor($008000);
 clOlive   = TColor($008080);
 clNavy    = TColor($800000);
 clPurple  = TColor($800080);
 clTeal    = TColor($808000);
 clGray    = TColor($808080);
 clSilver  = TColor($C0C0C0);
 clRed     = TColor($0000FF);
 clLime    = TColor($00FF00);
 clYellow  = TColor($00FFFF);
 clBlue    = TColor($FF0000);
 clFuchsia = TColor($FF00FF);
 clAqua    = TColor($FFFF00);
 clLtGray  = TColor($C0C0C0); // clSilver alias
 clDkGray  = TColor($808080); // clGray alias
 clWhite   = TColor($FFFFFF);

</Delphi>


System colors

System colors are color constants with a special meaning. Their real value depends on the context and theme. They are not simple colors. For example:

<Delphi> Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window Form1.Canvas.FillRect(10,10,50,50); </Delphi>

A hint window on MS Windows might have a white background so the above will draw white. On Linux/gtk2 it might be a metallic texture, so the above will draw the texture. If you want to put some text onto this you need a corresponding color like clInfoText, otherwise your text might be unreadable for the user. For example:

<Delphi> Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window Form1.Canvas.FillRect(10,10,50,50); Form1.Canvas.Font.Color:=clInfoText; // use the default text color of a hint window Form1.Canvas.TextOut(10,10,'Hint'); </Delphi>


The following table lists the system colors and their meaning. Using them outside the scope of the definition is undefined and the result depends on the widgetset and theme. For example clDefault is the normal background brush of the used device context. If you want to paint button elements on your own custom controls use the drawing functions of the unit Themes.

Constant LCL definition Delphi notes Supported Widgetsets
clNone drawsnothing. Using it as Control's color is undefined. The control will not get transparent. - all
clDefault Using it for Brush will use the normal background brush of the target DC (device context).
  • On a Form's canvas a FillRect will paint a rectangular area filled with the normal background of a standard window. This is whatever the widgetset and theme defines. This might be the color gray or a gradient or a picture.
  • Using clDefault on the Canvas of a TListBox will paint with the normal background, which is normally white on Windows. So in a TListBox clDefault is the same as clWindow.
  • Using it as Pen color will use the default line color for the device context.
  • Using it as Font color will use the normal text color of the device context.
- all
clScrollBar Scrollbar body - all
clBackground ? - all
clActiveCaption Active window titlebar - none
clInactiveCaption Inactive window titlebar - none
clMenu Regular menu item background color - none
clWindow The normal background brush of unselected text. Defined for controls like TEdit, TComboBox, TMemo, TListBox, TTreeView. - none
clWindowFrame Color of frame around the window - none
clMenuText The font color to use together with clMenu - none
clWindowText Font color to use together with clWindow - none
clCaptionText Active window titlebar text color - none
clActiveBorder ? - none
clInactiveBorder ? - none
clAppWorkspace MDIMain form background - none
clHighlight The brush color of selected element - none
clHighlightText Font color of selected text (to use together with clHighligh). - none
clBtnFace Button background - none
clBtnShadow Button shadow color (bottom right) used to achieve 3D effect - none
clGrayText The font color of disabled element - none
clBtnText Button font color to use together with clBtnFace - none
clInactiveCaptionText Inactive window titlebar text color - none
clBtnHighlight Button highlight color (top left) used to achieve 3D effect - none
cl3DDkShadow ? - none
cl3DLight ? - none
clInfoText Font color for hints. Use together with clInfoBk - all
clInfoBk Brush color for hints. Use together with clInfoText - all
clHotLight ? - none
clGradientActiveCaption The second color used to make gradient of active window titlebar - none
clGradientInactiveCaption The second color used to make gradient for inactive window titlebar - none
clMenuHighlight The background color of selected menu item - none
clMenuBar The Backround color of menu bar - none
clForm ? - none
clColorDesktop ? - none
cl3DFace ? - none
cl3DShadow ? - none
cl3DHiLight ? - none
clBtnHiLight Same as clBtnHighlight - none

Drawing theme elements on your custom controls

The unit Themes provides functions to draw single elements of standard controls. For example to draw an expand sign like a TTreeView use the following code:

<Delphi> uses Themes;

...

procedure TYourCustomControl.Paint; const

 PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =
 (
   (ttGlyphClosed, ttGlyphOpened),
   (ttHotGlyphClosed, ttHotGlyphOpened)
 );

var

 Details: TThemedElementDetails;
 R: TRect;
 Collapse: boolean;

begin

 ...
 //draw a themed expand sign.
 Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);
 R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);
 ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
 ...

end; </Delphi>