Difference between revisions of "Colors/fi"
(Created page with "{{Colors}} <br> = Värit = <br> LCL:ssä TColor on vakiovärityyppi. Se on yhteensopiva Delphin TColorin kanssa. TColor voi edustaa joko RGB (3x8bit) arvoa tai järjeste...") |
|||
Line 1: | Line 1: | ||
{{Colors}} | {{Colors}} | ||
− | |||
− | |||
− | |||
+ | ==Overview== | ||
− | [[LCL]] | + | In the [[LCL]] TColor is the standard color type. It is compatible with [[Delphi]]'s TColor. TColor can represent ''either'' an RGB (3x8bit) value, ''or'' a '''system''' color like '''clDefault'''. The LCL can also work with the fpImage system which uses the TFPColor type (which is RGBA (4x16bit), not RGB (3x8bit) like TColor). |
− | == | + | ===Conversions between TColor and RGB values=== |
− | '''Graphics''' | + | The '''Graphics''' [[Unit|unit]] provides the following [[Function|functions]]: |
− | <syntaxhighlight>function Blue(rgb: TColor): BYTE; // does not work on system color | + | <syntaxhighlight lang="pascal">function Blue(rgb: TColor): BYTE; // does not work on system color |
function Green(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 Red(rgb: TColor): BYTE; // does not work on system color | ||
Line 20: | Line 18: | ||
function IsSysColor(AColor: TColorRef): Boolean;</syntaxhighlight> | function IsSysColor(AColor: TColorRef): Boolean;</syntaxhighlight> | ||
− | + | ===Convert TColor to/from string=== | |
− | == TColor | + | Functions to convert strings like "25500" or "[[Dollar_sign|$]]AA0088" or "clNavy" to TColor: |
− | |||
− | |||
* StringToColor | * StringToColor | ||
* StringToColorDef | * StringToColorDef | ||
− | + | To convert TColor to a nice string like "clNavy" or "$AA0002": | |
− | * ColorToString | + | * ColorToString |
− | == | + | ===Convert TColor to/from HTML string #rrggbb=== |
− | + | See code in [[Convert color to/from HTML]]. | |
− | == | + | ==Table of standard colors== |
− | + | About 20 predefined color [[Constant|constants]] are provided, which are Delphi-compatible: | |
+ | <!--<syntaxhighlight lang="pascal"> // 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);</syntaxhighlight>--> | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | ! | + | ! Colour constant |
− | ! | + | ! Meaning |
− | ! [[Hexadecimal | + | ! [[Hexadecimal]] value for use with TColor |
− | ! | + | ! Example |
|- | |- | ||
| clBlack | | clBlack | ||
Line 140: | Line 155: | ||
| Cream | | Cream | ||
| TColor($F0FBFF); | | TColor($F0FBFF); | ||
− | | style="background: #FFFBF0;" | Lazarus 1.2 | + | | style="background: #FFFBF0;" | Lazarus 1.2 and newer |
|- | |- | ||
| clMedGray | | clMedGray | ||
| Medium Grey | | Medium Grey | ||
| TColor($A4A0A0); | | TColor($A4A0A0); | ||
− | | style="background: #A0A0A4;" | Lazarus 1.2 | + | | style="background: #A0A0A4;" | Lazarus 1.2 and newer |
|- | |- | ||
| clMoneyGreen | | clMoneyGreen | ||
| Mint Green | | Mint Green | ||
| TColor($C0DCC0); | | TColor($C0DCC0); | ||
− | | style="background: #C0DCC0;" | Lazarus 1.2 | + | | style="background: #C0DCC0;" | Lazarus 1.2 and newer |
|- | |- | ||
| clSkyBlue | | clSkyBlue | ||
| Sky Blue | | Sky Blue | ||
| TColor($F0CAA6); | | TColor($F0CAA6); | ||
− | | style="background: #A6CAF0;" | Lazarus 1.2 | + | | style="background: #A6CAF0;" | Lazarus 1.2 and newer |
|} | |} | ||
− | == | + | ==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''': | ||
− | <syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // | + | <syntaxhighlight lang="pascal">Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window |
Form1.Canvas.FillRect(10,10,50,50);</syntaxhighlight> | Form1.Canvas.FillRect(10,10,50,50);</syntaxhighlight> | ||
+ | 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: | ||
− | + | <syntaxhighlight lang="pascal">Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window | |
− | |||
− | <syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // | ||
Form1.Canvas.FillRect(10,10,50,50); | Form1.Canvas.FillRect(10,10,50,50); | ||
− | Form1.Canvas.Font.Color:=clInfoText; // | + | Form1.Canvas.Font.Color:=clInfoText; // use the default text color of a hint window |
Form1.Canvas.TextOut(10,10,'Hint');</syntaxhighlight> | Form1.Canvas.TextOut(10,10,'Hint');</syntaxhighlight> | ||
+ | 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: |
− | + | <syntaxhighlight lang="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 | |
− | <syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // | ||
− | Form1.Canvas.FillRect(10,10,50,50); // | ||
... | ... | ||
+ | // 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); // | + | Form1.Canvas.FillRect(10,10,50,50); // this will paint with the old theme brush |
− | Form1.Canvas.Brush.Color:=clInfoBk; // | + | Form1.Canvas.Brush.Color:=clRed; // assigning a new color, old Handle invalid |
− | Form1.Canvas.FillRect(10,10,50,50); // | + | Form1.Canvas.Brush.Color:=clInfoBk; // assigning a new color, old Handle invalid |
− | Form1.Canvas.Brush.Color:=clRed; // | + | Form1.Canvas.FillRect(10,10,50,50); // this will create a new handle and paint with the new theme</syntaxhighlight> |
− | Form1.Canvas.Brush.Color:=clInfoBk; // | ||
− | Form1.Canvas.FillRect(10,10,50,50); // | ||
− | </syntaxhighlight> | ||
− | |||
− | == | + | ===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'''. | |
− | |||
{| class="wikitable" | {| class="wikitable" | ||
− | ! | + | ! Constant !! LCL definition !! Delphi notes !! Supported Widgetsets |
|---- | |---- | ||
− | |clNone|| | + | |clNone||Indicates "do not paint". Using it as Control's color is undefined. The control will not get transparent.|| - || all |
|---- | |---- | ||
− | |clDefault|| | + | |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|| | + | |clScrollBar|| Scrollbar body || - || all |
|---- | |---- | ||
− | |clBackground|| | + | |clBackground|| Desktop background color || - || all |
|---- | |---- | ||
− | |clActiveCaption|| | + | |clActiveCaption|| Active window titlebar || - || none |
|---- | |---- | ||
− | |clInactiveCaption|| | + | |clInactiveCaption|| Inactive window titlebar || - || none |
|---- | |---- | ||
− | |clMenu|| | + | |clMenu|| Regular menu item background color || - || none |
|---- | |---- | ||
− | |clWindow|| | + | |clWindow|| The normal background brush of unselected text. Defined for controls like TEdit, TComboBox, TMemo, TListBox, TTreeView.|| - || none |
|---- | |---- | ||
− | |clWindowFrame|| | + | |clWindowFrame|| Color of frame around the window || - || none |
|---- | |---- | ||
− | |clMenuText|| | + | |clMenuText|| The font color to use together with clMenu || - || none |
|---- | |---- | ||
− | |clWindowText|| | + | |clWindowText|| Font color to use together with clWindow || - || none |
|---- | |---- | ||
− | |clCaptionText|| | + | |clCaptionText|| Active window titlebar text color || - || none |
|---- | |---- | ||
− | |clActiveBorder||?|| - || | + | |clActiveBorder||?|| - || none |
|---- | |---- | ||
− | |clInactiveBorder||?|| - || | + | |clInactiveBorder||?|| - || none |
|---- | |---- | ||
− | |clAppWorkspace|| MDIMain | + | |clAppWorkspace|| MDIMain form background || - || none |
|---- | |---- | ||
− | |clHighlight|| | + | |clHighlight|| The brush color of selected element || - || none |
|---- | |---- | ||
− | |clHighlightText|| Font color | + | |clHighlightText|| Font color of selected text (to use together with clHighligh). || - || none |
|---- | |---- | ||
− | |clBtnFace|| | + | |clBtnFace|| Button background || - || none |
|---- | |---- | ||
− | |clBtnShadow|| | + | |clBtnShadow|| Button shadow color (bottom right) used to achieve 3D effect || - || none |
|---- | |---- | ||
− | |clGrayText|| font color | + | |clGrayText|| The font color of disabled element || - || none |
|---- | |---- | ||
− | |clBtnText|| | + | |clBtnText|| Button font color to use together with clBtnFace || - || none |
|---- | |---- | ||
− | |clInactiveCaptionText|| | + | |clInactiveCaptionText|| Inactive window titlebar text color || - || none |
|---- | |---- | ||
− | |clBtnHighlight|| | + | |clBtnHighlight|| Button highlight color (top left) used to achieve 3D effect || - || none |
|---- | |---- | ||
− | |cl3DDkShadow||?|| - || | + | |cl3DDkShadow||?|| - || none |
|---- | |---- | ||
− | |cl3DLight||?|| - || | + | |cl3DLight||?|| - || none |
|---- | |---- | ||
− | |clInfoText|| | + | |clInfoText|| Font color for hints. Use together with clInfoBk || - || all |
|---- | |---- | ||
− | |clInfoBk|| Brush | + | |clInfoBk|| Brush color for hints. Use together with clInfoText || - || all |
|---- | |---- | ||
− | |clHotLight||?|| - || | + | |clHotLight||?|| - || none |
|---- | |---- | ||
− | |clGradientActiveCaption|| | + | |clGradientActiveCaption|| The second color used to make gradient of active window titlebar || - || none |
|---- | |---- | ||
− | |clGradientInactiveCaption|| | + | |clGradientInactiveCaption|| The second color used to make gradient for inactive window titlebar || - || none |
|---- | |---- | ||
− | |clMenuHighlight|| | + | |clMenuHighlight|| The background color of selected menu item || - || none |
|---- | |---- | ||
− | |clMenuBar|| | + | |clMenuBar|| The Backround color of menu bar || - || none |
|---- | |---- | ||
− | |clForm||?|| - || | + | |clForm||?|| - || none |
|---- | |---- | ||
− | |clColorDesktop||?|| - || | + | |clColorDesktop||?|| - || none |
|---- | |---- | ||
− | |cl3DFace||?|| - || | + | |cl3DFace||?|| - || none |
|---- | |---- | ||
− | |cl3DShadow||?|| - || | + | |cl3DShadow||?|| - || none |
|---- | |---- | ||
− | |cl3DHiLight||?|| - || | + | |cl3DHiLight||?|| - || none |
|---- | |---- | ||
− | |clBtnHiLight|| | + | |clBtnHiLight|| Same as clBtnHighlight || - || none |
|} | |} | ||
− | == | + | === Finding the rgb values of a system color === |
− | + | Use the function <tt>ColorToRGB</tt> (in unit <tt>Graphics</tt> 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: | |
− | + | <syntaxhighlight lang="pascal">// This example has a TColorBox on a form and uses this OnChange handler for the TColorbox: | |
− | |||
− | <syntaxhighlight>// | ||
procedure TForm1.ColorBox1Change(Sender: TObject); | procedure TForm1.ColorBox1Change(Sender: TObject); | ||
var | var | ||
Line 300: | Line 309: | ||
end; </syntaxhighlight> | end; </syntaxhighlight> | ||
− | == | + | ==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: | |
− | <syntaxhighlight>uses Themes; | + | <syntaxhighlight lang="pascal">uses Themes; |
... | ... |
Revision as of 15:55, 20 July 2019
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
日本語 (ja) │
русский (ru) │
中文(中国大陆) (zh_CN) │
Overview
In the LCL TColor is the standard color type. It is compatible with Delphi's TColor. TColor can represent either an RGB (3x8bit) value, or a system color like clDefault. The LCL can also work with the fpImage system which uses the TFPColor type (which is RGBA (4x16bit), not RGB (3x8bit) like TColor).
Conversions between TColor and RGB values
The Graphics unit provides the following functions:
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;
Convert TColor to/from string
Functions to convert strings like "25500" or "$AA0088" or "clNavy" to TColor:
- StringToColor
- StringToColorDef
To convert TColor to a nice string like "clNavy" or "$AA0002":
- ColorToString
Convert TColor to/from HTML string #rrggbb
See code in Convert color to/from HTML.
Table of standard colors
About 20 predefined color constants are provided, which are Delphi-compatible:
Colour constant | Meaning | Hexadecimal value for use with TColor | Example |
---|---|---|---|
clBlack | Black | TColor($000000); | |
clMaroon | Maroon | TColor($000080); | |
clGreen | Green | TColor($008000); | |
clOlive | Olive Green | TColor($008080); | |
clNavy | Navy Blue | TColor($800000); | |
clPurple | Purple | TColor($800080); | |
clTeal | Teal | TColor($808000); | |
clGray | Grey | TColor($808080); | |
clSilver | Silver | TColor($C0C0C0); | |
clRed | Red | TColor($0000FF); | |
clLime | Lime Green | TColor($00FF00); | |
clYellow | Yellow | TColor($00FFFF); | |
clBlue | Blue | TColor($FF0000); | |
clFuchsia | Fuchsia | TColor($FF00FF); | |
clAqua | Aqua | TColor($FFFF00); | |
clLtGray | Light Grey | TColor($C0C0C0); | clSilver alias |
clDkGray | Dark Grey | TColor($808080); | clGray alias |
clWhite | White | TColor($FFFFFF); | |
clCream | Cream | TColor($F0FBFF); | Lazarus 1.2 and newer |
clMedGray | Medium Grey | TColor($A4A0A0); | Lazarus 1.2 and newer |
clMoneyGreen | Mint Green | TColor($C0DCC0); | Lazarus 1.2 and newer |
clSkyBlue | Sky Blue | TColor($F0CAA6); | Lazarus 1.2 and newer |
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:
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:
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:
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:
// 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:
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;