Sign in Join
Wiki copytemporary

Colors/zh CN

Deutsch · English · Español · Français · Suomi · Русский · 中文(中国) · 日本語

=概述=

在LCL,TColor是标准颜色类型。它和Delphi的TColor兼容。TColor 可以表示要么一个RGB (3x8比特)值,要么一个system颜色,像clDefault。LCL也可以和fpImage系统一起工作,使用TFPColor类型(它是RGBA(4x16比特),非 RGB(3x8比特),像TColor)。

在TColor 和RGB值之间转换

Graphics单元提供提供下面的函数:

pascal
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
function IsSysColor(AColor: TColorRef): Boolean;

转换TColor到/来自字符串

函数来转换字符串像"25500"或"$AA0088"或"clNavy"到TColor:

转换TColor到一个友好的字符串像"clNavy"或"$AA0002":

转换TColor到/来自HTML字符串 #rrggbb

查看代码在转换颜色到/来自HTML。

标准颜色表

大约20种预定义颜色常量被提供,它们是与Delphi-兼容的:

颜色常量 意思 TColor使用十六进制值 示例
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别名
clDkGray 深灰色 TColor($808080); clGray别名
clWhite 白色 TColor($FFFFFF);
clCream 奶油色 TColor($F0FBFF); Lazarus 1.2和较新的
clMedGray 中灰色 TColor($A4A0A0); Lazarus 1.2和较新的
clMoneyGreen 薄荷绿 TColor($C0DCC0); Lazarus 1.2和较新的
clSkyBlue 天蓝色 TColor($F0CAA6); LLazarus 1.2和较新的

System colors

Example: clInfoBk, clInfoText

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 clInfoBk:

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

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:

pascal
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');

The system color clInfoBk can not be used for Pen.Color and not for Font.Color. If you do so the result is undefined and depends on the widgetset and user theme. The same for clInfoText: It can only be used as a Font.Color. Using it as Brush.Color may not work. At the moment all widgetsets allow to use it as Pen.Color too.

Theme changes

When the user switches the theme the system colors changes. A clInfoBk might change from white to blue or from a color to a texture. This change will happen when you allocate a new Brush handle. Keep in mind that a simple assignment Brush.Color:=clInfoBk does not allocate a Brush Handle. The Brush Handle is allocated on use. For example:

pascal
Form1.Canvas.Brush.Color:=clInfoBk; // this will not create a new brush handle
Form1.Canvas.FillRect(10,10,50,50); // this will create the brush handle with the currently active theme brush for hint windows
...
// if the theme changes in this moment the Brush.Handle is still allocated with the old values
...
Form1.Canvas.FillRect(10,10,50,50); // this will paint with the old theme brush
Form1.Canvas.Brush.Color:=clInfoBk; // assigning the old value will not create a new brush handle
Form1.Canvas.FillRect(10,10,50,50); // this will paint with the old theme brush
Form1.Canvas.Brush.Color:=clRed;    // assigning a new color, old Handle invalid
Form1.Canvas.Brush.Color:=clInfoBk; // assigning a new color, old Handle invalid
Form1.Canvas.FillRect(10,10,50,50); // this will create a new handle and paint with the new theme

Table of system colors

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

Indicates "do not paint". 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).

| -

all

clScrollBar

Scrollbar body

-

all

clBackground

Desktop background color

-

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

Finding the rgb values of a system color

Use the function ColorToRGB (in unit Graphics to determine the rgb components of a system color. This functions detects whether a color is a system color and, if this is true, looks up the system color in the themes color. The returned Longint can be understood as a normal color:

pascal
// This example has a TColorBox on a form and uses this OnChange handler for the TColorbox:
procedure TForm1.ColorBox1Change(Sender: TObject);
var
  c: TColor;
begin
  c := ColorToRGB(ColorBox1.Selected);
  Caption := Format('R%d G%d B%d', [Red(c), Green(c), Blue(c)]);
end;

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:

pascal
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;

贡献者和更改


From the Free Pascal wiki, page "Colors/zh CN", as it stood on 2020-02-11 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.