Sign in Join
Wiki copytemporary

Colors/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Colors/ru

OldNewLine
1+## Обзор
2+
3+В [[LCL]] TColor - это стандартный тип цвета. Он совместим с TColor [[Delphi]]. TColor может представляться *как* в виде значения RGB (3x8bit), *так* и в виде **системного** цвета наподобие **clDefault**. LCL также может работать с системой fpImage, которая использует тип TFPColor (RGBA (4x16bit), а не RGB (3x8bit), как TColor).
4+
5+### Преобразование значений между TColor и RGB
6+
7+[[Unit|Модуль]] **Graphics** предосталяет следующие [[Function|функции]]:
8+
9+``` pascal
10+function Blue(rgb: TColor): BYTE; // не работает с системным цветом
11+function Green(rgb: TColor): BYTE; // не работает с системным цветом
12+function Red(rgb: TColor): BYTE; // не работает с системным цветом
13+function RGBToColor(R, G, B: Byte): TColor;
14+procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // не работает с системным цветом
15+function FPColorToTColor(const FPColor: TFPColor): TColor;
16+function TColorToFPColor(const c: TColor): TFPColor; // не работает с системным цветом
17+function IsSysColor(AColor: TColorRef): Boolean;
18+```
19+
20+### Преобразование типа TColor в/из строки
21+
22+Функции для преобразования строк вроде "25500" или "[[Dollar sign|$AA]]0088" или "clNavy" в TColor:
23+
24+- StringToColor
25+- StringToColorDef
26+
27+Чтобы преобразовать TColor в красивую строку, такую как "clNavy" или "\$AA0002":
28+
29+- ColorToString
30+
31+### Преобразование типа TColor в/из HTML-строки \#rrggbb
32+
33+Смотрите код в [[Convert color to/from HTML|Преобразовать цвет в/из HTML]].
34+
35+## Таблица стандартных цветов
36+
37+Предусмотрено около 20 предопределенных цветовых [[Constant|Констант]], которые совместимы с Delphi:
38+
39+| Цветовая константа | Описание цвета | [[Hexadecimal/ru|Шестнадцатеричное]] представление для использования с TColor | Пример |
40+|----|----|----|----|
41+| clBlack | Черный | TColor(\$000000); | |
42+| clMaroon | Темно-бордовый | TColor(\$000080); | |
43+| clGreen | Зеленый | TColor(\$008000); | |
44+| clOlive | Оливково-зеленый | TColor(\$008080); | |
45+| clNavy | Темно-синий | TColor(\$800000); | |
46+| clPurple | Темно-фиолетовый | TColor(\$800080); | |
47+| clTeal | Сине-зеленый | TColor(\$808000); | |
48+| clGray | Серый | TColor(\$808080); | |
49+| clSilver | Серебристый | TColor(\$C0C0C0); | |
50+| clRed | Красный | TColor(\$0000FF); | |
51+| clLime | Салатовый | TColor(\$00FF00); | |
52+| clYellow | Желтый | TColor(\$00FFFF); | |
53+| clBlue | Синий | TColor(\$FF0000); | |
54+| clFuchsia | Фуксия | TColor(\$FF00FF); | |
55+| clAqua | Голубой | TColor(\$FFFF00); | |
56+| clLtGray | Светло-серый | TColor(\$C0C0C0); | псевдоним для clSilver |
57+| clDkGray | Темно-серый | TColor(\$808080); | псевдоним для clGray |
58+| clWhite | Белый | TColor(\$FFFFFF); | |
59+| clCream | Кремовый | TColor(\$F0FBFF); | Lazarus 1.2 и новее |
60+| clMedGray | Средне-серый | TColor(\$A4A0A0); | Lazarus 1.2 и новее |
61+| clMoneyGreen | Денежная зелень | TColor(\$C0DCC0); | Lazarus 1.2 и новее |
62+| clSkyBlue | Небесно-голубой | TColor(\$F0CAA6); | Lazarus 1.2 и новее |
63+
64+## Системные цвета
65+
66+### Пример: clInfoBk, clInfoText
67+
68+Системные цвета - это цветовые константы с особым значением. Их реальное значение зависит от контекста и темы. Они не являются просто цветом. Например, **clInfoBk**:
69+
70+``` pascal
71+Form1.Canvas.Brush.Color:=clInfoBk; // используем цвет кисти по умолчанию для фона в окнах подсказок
72+Form1.Canvas.FillRect(10,10,50,50);
73+```
74+
75+Окно подсказок в MS Windows может иметь белый фон, поэтому вышеприведенный цвет будет отображаться белым. В Linux/gtk2 это может быть металлическая текстура, поэтому вышеприведенный будет рисовать текстуру. Если вы хотите поместить какой-либо текст в это окно, вам понадобится соответствующий контрастный цвет, например, **clInfoText**, иначе ваш текст может быть нечитаемым для пользователя. Например:
76+
77+``` pascal
78+Form1.Canvas.Brush.Color:=clInfoBk; // используем цвет кисти по умолчанию для фона в окнах подсказок
79+Form1.Canvas.FillRect(10,10,50,50);
80+Form1.Canvas.Font.Color:=clInfoText; // используем цвет текста по умолчанию в окнах подсказок
81+Form1.Canvas.TextOut(10,10,'Hint');
82+```
83+
84+Системный цвет **clInfoBk** не может использоваться для Pen.Color и Font.Color. Если вы сделаете это, результат не определен и зависит от набора виджетов и пользовательской темы. То же самое для **clInfoText**: он может использоваться только как Font.Color. Использование его в качестве Brush.Color может не работать. На данный момент все виджеты позволяют использовать его как Pen.Color.
85+
86+### Изменения темы
87+
88+Когда пользователь переключает тему, системные цвета меняются. **ClInfoBk** может измениться с белого на синий или с цвета на текстуру. Это изменение произойдет, когда вы назначите новый дескриптор кисти. Имейте в виду, что простое присвоение `Brush.Color:=clInfoBk` не назначает дескриптор кисти. Дескриптор кисти назначается в процессе использования. Например:
89+
90+``` pascal
91+Form1.Canvas.Brush.Color:=clInfoBk; // это не создаст новый дескриптор кисти
92+Form1.Canvas.FillRect(10,10,50,50); // а это создаст дескриптор кисти с текущей активной кистью темы для окон подсказок
93+...
94+// если тема меняется в этот момент, Brush.Handle все еще заполнен старыми значениями
95+...
96+Form1.Canvas.FillRect(10,10,50,50); // это все еще будет рисоваться кистью старой темы
97+Form1.Canvas.Brush.Color:=clInfoBk; // присвоение старого значения не создаст новый дескриптор кисти
98+Form1.Canvas.FillRect(10,10,50,50); // это все еще будет рисоваться кистью старой темы
99+Form1.Canvas.Brush.Color:=clRed; // присвоение нового цвета, старый Handle недействителен
100+Form1.Canvas.Brush.Color:=clInfoBk; // присвоение нового цвета, старый Handle недействителен
101+Form1.Canvas.FillRect(10,10,50,50); // это создаст новый дескриптор и нарисует новую тему
102+```
103+
104+### Таблица системных цветов
105+
106+В следующей таблице перечислены системные цвета и их значение. Использование их вне описанной области неоднозначно, и результат зависит от набора виджетов и темы. Например, **clDefault** - обычная кисть фона используемого контекста устройства. Если вы хотите рисовать элементы кнопок на своих собственных элементах управления, используйте функции рисования модуля **Themes**.
107+
108+<table>
109+<thead>
110+<tr>
111+<th><p>Константа</p></th>
112+<th><p>Определение LCL</p></th>
113+<th><p>Delphi notes</p></th>
114+<th><p>Поддерживаемые наборы виджетов</p></th>
115+</tr>
116+</thead>
117+<tbody>
118+<tr>
119+<td><p>clNone</p></td>
120+<td><p>Обозначает «не раскрашивать». Использование его в качестве цвета элемента управления не определено. Элемент управления не станет прозрачным.</p></td>
121+<td><p>-</p></td>
122+<td><p>все</p></td>
123+</tr>
124+<tr>
125+<td><p>clDefault</p></td>
126+<td><p>Означает, что применительно к кисти будет использоваться обычный фон целевого DC (контекст устройства).</p>
127+<ul>
128+<li>На холсте формы <em>FillRect</em> закрашивает прямоугольную область, заполненную обычным фоном стандартного окна. Это то, что определяет набор виджетов и тема. Это может быть серый цвет, или градиент, или изображение.</li>
129+<li>Использование clDefault на холсте TListBox будет рисовать с нормальным фоном, который обычно белый в Windows. Таким образом, в TListBox clDefault совпадает с clWindow.</li>
130+<li>При использовании его в качестве цвета пера будет задействован цвет линии по умолчанию для контекста устройства.</li>
131+<li>При использование его в качестве цвета шрифта будет задействован обычный цвет текста контекста устройства.</li>
132+</ul></td>
133+<td><p>| -</p></td>
134+<td><p>все</p></td>
135+</tr>
136+<tr>
137+<td><p>clScrollBar</p></td>
138+<td><p>Тело полосы прокрутки</p></td>
139+<td><p>-</p></td>
140+<td><p>все</p></td>
141+</tr>
142+<tr>
143+<td><p>clBackground</p></td>
144+<td><p>Цвет фона рабочего стола</p></td>
145+<td><p>-</p></td>
146+<td><p>все</p></td>
147+</tr>
148+<tr>
149+<td><p>clActiveCaption</p></td>
150+<td><p>Строка заголовка активного окна</p></td>
151+<td><p>-</p></td>
152+<td><p>никакой</p></td>
153+</tr>
154+<tr>
155+<td><p>clInactiveCaption</p></td>
156+<td><p>Строка заголовка неактивного окна</p></td>
157+<td><p>-</p></td>
158+<td><p>никакой</p></td>
159+</tr>
160+<tr>
161+<td><p>clMenu</p></td>
162+<td><p>Обычный цвет пункта меню</p></td>
163+<td><p>-</p></td>
164+<td><p>никакой</p></td>
165+</tr>
166+<tr>
167+<td><p>clWindow</p></td>
168+<td><p>Обычная фоновая кисть невыделенного текста. Определено для элементов управления, таких как TEdit, TComboBox, TMemo, TListBox, TTreeView.</p></td>
169+<td><p>-</p></td>
170+<td><p>никакой</p></td>
171+</tr>
172+<tr>
173+<td><p>clWindowFrame</p></td>
174+<td><p>Цвет рамки вокруг окна</p></td>
175+<td><p>-</p></td>
176+<td><p>никакой</p></td>
177+</tr>
178+<tr>
179+<td><p>clMenuText</p></td>
180+<td><p>Цвет шрифта для использования вместе с clMenu</p></td>
181+<td><p>-</p></td>
182+<td><p>никакой</p></td>
183+</tr>
184+<tr>
185+<td><p>clWindowText</p></td>
186+<td><p>Цвет шрифта для использования вместе с clWindow</p></td>
187+<td><p>-</p></td>
188+<td><p>никакой</p></td>
189+</tr>
190+<tr>
191+<td><p>clCaptionText</p></td>
192+<td><p>Цвет строки заголовка активного окна</p></td>
193+<td><p>-</p></td>
194+<td><p>никакой</p></td>
195+</tr>
196+<tr>
197+<td><p>clActiveBorder</p></td>
198+<td><p>?</p></td>
199+<td><p>-</p></td>
200+<td><p>никакой</p></td>
201+</tr>
202+<tr>
203+<td><p>clInactiveBorder</p></td>
204+<td><p>?</p></td>
205+<td><p>-</p></td>
206+<td><p>никакой</p></td>
207+</tr>
208+<tr>
209+<td><p>clAppWorkspace</p></td>
210+<td><p>Фон формы MDIMain</p></td>
211+<td><p>-</p></td>
212+<td><p>никакой</p></td>
213+</tr>
214+<tr>
215+<td><p>clHighlight</p></td>
216+<td><p>Цвет кисти выбранного элемента</p></td>
217+<td><p>-</p></td>
218+<td><p>никакой</p></td>
219+</tr>
220+<tr>
221+<td><p>clHighlightText</p></td>
222+<td><p>Цвет шрифта выделенного текста (использовать вместе с clHighligh).</p></td>
223+<td><p>-</p></td>
224+<td><p>никакой</p></td>
225+</tr>
226+<tr>
227+<td><p>clBtnFace</p></td>
228+<td><p>Фон кнопки</p></td>
229+<td><p>-</p></td>
230+<td><p>никакой</p></td>
231+</tr>
232+<tr>
233+<td><p>clBtnShadow</p></td>
234+<td><p>Цвет тени кнопки (внизу справа), используемый для достижения эффекта 3D</p></td>
235+<td><p>-</p></td>
236+<td><p>никакой</p></td>
237+</tr>
238+<tr>
239+<td><p>clGrayText</p></td>
240+<td><p>Цвет шрифта отключенного элемента</p></td>
241+<td><p>-</p></td>
242+<td><p>никакой</p></td>
243+</tr>
244+<tr>
245+<td><p>clBtnText</p></td>
246+<td><p>Цвет шрифта кнопки для использования вместе с clBtnFace</p></td>
247+<td><p>-</p></td>
248+<td><p>никакой</p></td>
249+</tr>
250+<tr>
251+<td><p>clInactiveCaptionText</p></td>
252+<td><p>Цвет текста заголовка неактивного окна</p></td>
253+<td><p>-</p></td>
254+<td><p>никакой</p></td>
255+</tr>
256+<tr>
257+<td><p>clBtnHighlight</p></td>
258+<td><p>Цвет подсветки кнопки (вверху слева), используемый для достижения эффекта 3D</p></td>
259+<td><p>-</p></td>
260+<td><p>никакой</p></td>
261+</tr>
262+<tr>
263+<td><p>cl3DDkShadow</p></td>
264+<td><p>?</p></td>
265+<td><p>-</p></td>
266+<td><p>никакой</p></td>
267+</tr>
268+<tr>
269+<td><p>cl3DLight</p></td>
270+<td><p>?</p></td>
271+<td><p>-</p></td>
272+<td><p>никакой</p></td>
273+</tr>
274+<tr>
275+<td><p>clInfoText</p></td>
276+<td><p>Цвет шрифта для окон с подсказками. Используется вместе с clInfoBk</p></td>
277+<td><p>-</p></td>
278+<td><p>все</p></td>
279+</tr>
280+<tr>
281+<td><p>clInfoBk</p></td>
282+<td><p>Цвет кисти для окон с подсказками. Используется вместе с clInfoText</p></td>
283+<td><p>-</p></td>
284+<td><p>все</p></td>
285+</tr>
286+<tr>
287+<td><p>clHotLight</p></td>
288+<td><p>?</p></td>
289+<td><p>-</p></td>
290+<td><p>никакой</p></td>
291+</tr>
292+<tr>
293+<td><p>clGradientActiveCaption</p></td>
294+<td><p>Второй цвет, используемый для создания градиента строки заголовка активного окна</p></td>
295+<td><p>-</p></td>
296+<td><p>никакой</p></td>
297+</tr>
298+<tr>
299+<td><p>clGradientInactiveCaption</p></td>
300+<td><p>Второй цвет, используемый для создания градиента строки заголовка неактивного окна</p></td>
301+<td><p>-</p></td>
302+<td><p>никакой</p></td>
303+</tr>
304+<tr>
305+<td><p>clMenuHighlight</p></td>
306+<td><p>Цвет фона выбранного пункта меню</p></td>
307+<td><p>-</p></td>
308+<td><p>никакой</p></td>
309+</tr>
310+<tr>
311+<td><p>clMenuBar</p></td>
312+<td><p>Цвет фона строки меню</p></td>
313+<td><p>-</p></td>
314+<td><p>никакой</p></td>
315+</tr>
316+<tr>
317+<td><p>clForm</p></td>
318+<td><p>?</p></td>
319+<td><p>-</p></td>
320+<td><p>никакой</p></td>
321+</tr>
322+<tr>
323+<td><p>clColorDesktop</p></td>
324+<td><p>?</p></td>
325+<td><p>-</p></td>
326+<td><p>никакой</p></td>
327+</tr>
328+<tr>
329+<td><p>cl3DFace</p></td>
330+<td><p>?</p></td>
331+<td><p>-</p></td>
332+<td><p>никакой</p></td>
333+</tr>
334+<tr>
335+<td><p>cl3DShadow</p></td>
336+<td><p>?</p></td>
337+<td><p>-</p></td>
338+<td><p>никакой</p></td>
339+</tr>
340+<tr>
341+<td><p>cl3DHiLight</p></td>
342+<td><p>?</p></td>
343+<td><p>-</p></td>
344+<td><p>никакой</p></td>
345+</tr>
346+<tr>
347+<td><p>clBtnHiLight</p></td>
348+<td><p>Такой же как у clBtnHighlight</p></td>
349+<td><p>-</p></td>
350+<td><p>никакой</p></td>
351+</tr>
352+</tbody>
353+</table>
354+
355+### Нахождение значений RGB системного цвета
356+
357+Используйте функцию `ColorToRGB` (в модуле `Graphics`), чтобы определить компоненты rgb системного цвета. Эта функция определяет, является ли цвет системным цветом, и, если это так, находится ли системный цвет в цветовой гамме текущей темы. Возвращаемое значение типа [[Longint]] можно понимать как обычный цвет:
358+
359+``` pascal
360+// в этом примере имеется TColorBox на форме и используется обработчик OnChange для TColorbox:
361+procedure TForm1.ColorBox1Change(Sender: TObject);
362+var
363+ c: TColor;
364+begin
365+ c := ColorToRGB(ColorBox1.Selected);
366+ Caption := Format('R%d G%d B%d', [Red(c), Green(c), Blue(c)]);
367+end;
368+```
369+
370+## Рисование элементов соответственно теме на ваших пользовательских элементах управления
371+
372+Модуль **Themes** предоставляет функции для рисования отдельных элементов стандартных элементов управления. Например, чтобы нарисовать знак раскрытия узла, например, [[TTreeView]], используйте следующий код:
373+
374+``` pascal
375+uses Themes;
376+
377+...
378+
379+procedure TYourCustomControl.Paint;
380+const
381+ PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =
382+ (
383+ (ttGlyphClosed, ttGlyphOpened),
384+ (ttHotGlyphClosed, ttHotGlyphOpened)
385+ );
386+var
387+ Details: TThemedElementDetails;
388+ R: TRect;
389+ Collapse: boolean;
390+begin
391+ ...
392+ //рисуем знак раскрытия узла дерева соответственно теме
393+ Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);
394+ R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);
395+ ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
396+ ...
397+end;
398+```
399+
400+## См. также
401+
402+- [Цвета в Delphi](http://diversenok.ho.ua/articles/TColor)
403+- [Таблица названий цветов в английском языке](http://www.falsefriends.ru/english-colors.htm)
404+
405+---
406+*From the Free Pascal wiki, page "Colors/ru", as it stood on 2020-06-03 after a change by Zoltanleo, 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](/wiki-contact).*

Back to history