Sign in Join
Wiki copytemporary

Colors/ja: what changed

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

Title: Colors/ja

OldNewLine
1+\
2+=概要=
3+
4+TColor は LCL の標準色で Delphi の TColor と互換性があります。TColor で RGB値(8 ビット×3)もしくは **clDefault** のような**システム**カラーを指定できます。また、LCL では TFPColor(RGBA、16 ビット×4)を使っている fpImage も共に使われています。
5+
6+# TColor から RGB への変換と逆変換
7+
8+ユニット **Graphics** は以下の関数を提供しています。
9+
10+``` pascal
11+function Blue(rgb: TColor): BYTE; // システムカラーでは動作しません
12+function Green(rgb: TColor): BYTE; // システムカラーでは動作しません
13+function Red(rgb: TColor): BYTE; // システムカラーでは動作しません
14+function RGBToColor(R, G, B: Byte): TColor;
15+procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // システムカラーでは動作しません
16+function FPColorToTColor(const FPColor: TFPColor): TColor;
17+function TColorToFPColor(const c: TColor): TFPColor; // システムカラーでは動作しません
18+```
19+
20+以下に示すように、あらかじめ定義されているカラー定数がいくつかあります。
21+
22+``` pascal
23+ // 標準色
24+ clBlack = TColor($000000);
25+ clMaroon = TColor($000080);
26+ clGreen = TColor($008000);
27+ clOlive = TColor($008080);
28+ clNavy = TColor($800000);
29+ clPurple = TColor($800080);
30+ clTeal = TColor($808000);
31+ clGray = TColor($808080);
32+ clSilver = TColor($C0C0C0);
33+ clRed = TColor($0000FF);
34+ clLime = TColor($00FF00);
35+ clYellow = TColor($00FFFF);
36+ clBlue = TColor($FF0000);
37+ clFuchsia = TColor($FF00FF);
38+ clAqua = TColor($FFFF00);
39+ clLtGray = TColor($C0C0C0); // clSilver の別名
40+ clDkGray = TColor($808080); // clGray の別名
41+ clWhite = TColor($FFFFFF);
42+```
43+
44+# システムカラー
45+
46+## 例:clInfoBk、clInfoText
47+
48+システムカラーは特別な意味を持ったカラー定数です。システムカラーの実際の色は状況やテーマに依存します。これらは単純な色ではありません。\
49+例えば **clInfoBk** は、
50+
51+``` pascal
52+Form1.Canvas.Brush.Color:=clInfoBk; // ヒントウィンドウのデフォルトの背景ブラシを使用
53+Form1.Canvas.FillRect(10,10,50,50);
54+```
55+
56+Windows でのヒントウィンドウは通常は白の背景なので、上記のは白で描画されます。Linux/GTK2 の場合、通常は金属風テクスチャなので、それで描画されます。これに文字も書き込むのであれば **clInfoText** などマッチする色を使う必要があるでしょう。そうしないとユーザにとって読みづらくなってしまうかもしれません。実際の記述例は以下のようなります。
57+
58+``` pascal
59+Form1.Canvas.Brush.Color:=clInfoBk; // ヒントウィンドウのデフォルトの背景ブラシを使用
60+Form1.Canvas.FillRect(10,10,50,50);
61+Form1.Canvas.Font.Color:=clInfoText; // ヒントウィンドウのデフォルトの文字色を使用
62+Form1.Canvas.TextOut(10,10,'Hint');
63+```
64+
65+システムカラー **clInfoBk** は Pen.Color と Font.Color に使用することはできません。使用しても決められた定義はされてなく、結果はウィジェットセットやユーザテーマに左右されるでしょう。\
66+**clInfoText** についても同様です。Font.Color にだけ使用でき、Brush.Color に使っても動作しないでしょう。なお現在では、Pen.Color としてならすべてのウィジェットセットで使うことができるようになっています。
67+
68+## テーマの変更
69+
70+ユーザがテーマを切り替えるとシステムカラーが変更されます。**clInfoBk** は白から青に変わるかもしれませんし、あるいは単純色からテクスチャに変更かもしれません。ブラシハンドルが新しく割り当てられたときに、この変更が反映されます。単純に Brush.Color:=clInfoBk と指定することではブラシハンドルが割り当てられないことを忘れてはなりません。実際に使うときになってからブラシハンドルは割り当てられるのです。以下に例を示します。
71+
72+``` pascal
73+Form1.Canvas.Brush.Color:=clInfoBk; // ここではブラシハンドルは作られていません
74+Form1.Canvas.FillRect(10,10,50,50); // ここで現在のアクティブテーマのヒントウィンドウ用のブラシハンドルが作成されます
75+...
76+// この間にテーマが変更されたとしても、ブラシハンドルはまだ古いままです
77+...
78+Form1.Canvas.FillRect(10,10,50,50); // これは古いテーマブラシで描画されます
79+Form1.Canvas.Brush.Color:=clInfoBk; // 古い値と同じ値を指定してもブラシハンドルは新しく作成されません
80+Form1.Canvas.FillRect(10,10,50,50); // これも古いテーマブラシで描画されます
81+Form1.Canvas.Brush.Color:=clRed; // 新たな色を指定すると古いハンドルは無効になります
82+Form1.Canvas.Brush.Color:=clInfoBk; // 改めて色を指定し直します
83+Form1.Canvas.FillRect(10,10,50,50); // ブラシハンドルが新しく作られ、新しいテーマで描画されます
84+```
85+
86+## システムカラーの一覧
87+
88+以下の表はシステムカラーとその意味をまとめたものです。定義されている範囲外のテーマの使用に関しては定められてなく、結果はウィジェットセットとテーマに左右されます。例えば、**clDefault** は使用しているデバイスコンテキストの一般背景ブラシということです。カスタムコントロールをボタン要素で塗りたいのであれば、ユニット **Themes** の描画関数を使用してください。
89+
90+<table>
91+<thead>
92+<tr>
93+<th><p>カラー定数</p></th>
94+<th><p>LCL 定義</p></th>
95+<th><p>Delphi 注記</p></th>
96+<th><p>ウィジェットセットのサポート状況</p></th>
97+</tr>
98+</thead>
99+<tbody>
100+<tr>
101+<td><p>clNone</p></td>
102+<td><p>描画なし。コントロールの未定義色として使用されます。コントロールが透過するわけでありません。</p></td>
103+<td><p>-</p></td>
104+<td><p>全部</p></td>
105+</tr>
106+<tr>
107+<td><p>clDefault</p></td>
108+<td><p>ブラシとして使用した場合、対象の DC(デバイスコンテキスト)の一般背景ブラシを使用します。</p>
109+<ul>
110+<li>フォームのキャンバスで <em>FillRect</em> を使用した場合、標準ウィンドウの一般背景で矩形領域を塗りつぶします。これはウィジェットセットとテーマで定義されていて、通常は灰色、グラデーションもしくは画像が使われます。</li>
111+<li>TListBox のキャンバスで clDefault を使用した場合、一般背景で塗りつぶされます。Windows であれば通常は白です。つまり、TListBox では clDefault は clWindow と同じことです。</li>
112+<li>ペン色として使用した場合、デバイスコンテキストのデフォルトの線色が使われます。</li>
113+<li>フォント色として使用した場合、デバイスコンテキストの一般文字色が使われます。</li>
114+</ul></td>
115+<td><p>| -</p></td>
116+<td><p>全部</p></td>
117+</tr>
118+<tr>
119+<td><p>clScrollBar</p></td>
120+<td><p>スクロールバー本体</p></td>
121+<td><p>-</p></td>
122+<td><p>全部</p></td>
123+</tr>
124+<tr>
125+<td><p>clBackground</p></td>
126+<td><p>?</p></td>
127+<td><p>-</p></td>
128+<td><p>全部</p></td>
129+</tr>
130+<tr>
131+<td><p>clActiveCaption</p></td>
132+<td><p>アクティブウィンドのタイトルバー</p></td>
133+<td><p>-</p></td>
134+<td><p>なし</p></td>
135+</tr>
136+<tr>
137+<td><p>clInactiveCaption</p></td>
138+<td><p>非アクティブウィンドのタイトルバー</p></td>
139+<td><p>-</p></td>
140+<td><p>なし</p></td>
141+</tr>
142+<tr>
143+<td><p>clMenu</p></td>
144+<td><p>標準メニューアイテムの背景色</p></td>
145+<td><p>-</p></td>
146+<td><p>なし</p></td>
147+</tr>
148+<tr>
149+<td><p>clWindow</p></td>
150+<td><p>選択されていない文字の一般背景ブラシ。TEdit、TComboBox、TMemo、TListBox、TTreeView などのコントロール用に定義されています。</p></td>
151+<td><p>-</p></td>
152+<td><p>なし</p></td>
153+</tr>
154+<tr>
155+<td><p>clWindowFrame</p></td>
156+<td><p>ウィンドウの周り、フレームの色</p></td>
157+<td><p>-</p></td>
158+<td><p>なし</p></td>
159+</tr>
160+<tr>
161+<td><p>clMenuText</p></td>
162+<td><p>clMenu と共に使われるフォント色</p></td>
163+<td><p>-</p></td>
164+<td><p>なし</p></td>
165+</tr>
166+<tr>
167+<td><p>clWindowText</p></td>
168+<td><p>clWindow と共に使われるフォント色</p></td>
169+<td><p>-</p></td>
170+<td><p>なし</p></td>
171+</tr>
172+<tr>
173+<td><p>clCaptionText</p></td>
174+<td><p>アクティブウィンドのタイトルバーの文字色</p></td>
175+<td><p>-</p></td>
176+<td><p>なし</p></td>
177+</tr>
178+<tr>
179+<td><p>clActiveBorder</p></td>
180+<td><p>?</p></td>
181+<td><p>-</p></td>
182+<td><p>なし</p></td>
183+</tr>
184+<tr>
185+<td><p>clInactiveBorder</p></td>
186+<td><p>?</p></td>
187+<td><p>-</p></td>
188+<td><p>なし</p></td>
189+</tr>
190+<tr>
191+<td><p>clAppWorkspace</p></td>
192+<td><p>MDI メインフォームの背景色</p></td>
193+<td><p>-</p></td>
194+<td><p>なし</p></td>
195+</tr>
196+<tr>
197+<td><p>clHighlight</p></td>
198+<td><p>選択要素のブラシ色</p></td>
199+<td><p>-</p></td>
200+<td><p>なし</p></td>
201+</tr>
202+<tr>
203+<td><p>clHighlightText</p></td>
204+<td><p>選択文字のフォント色(clHighligh と共に使用)</p></td>
205+<td><p>-</p></td>
206+<td><p>なし</p></td>
207+</tr>
208+<tr>
209+<td><p>clBtnFace</p></td>
210+<td><p>ボタンの背景色</p></td>
211+<td><p>-</p></td>
212+<td><p>なし</p></td>
213+</tr>
214+<tr>
215+<td><p>clBtnShadow</p></td>
216+<td><p>アクティブの 3D エフェクトに使われているボタンの影の色(下と右側)</p></td>
217+<td><p>-</p></td>
218+<td><p>なし</p></td>
219+</tr>
220+<tr>
221+<td><p>clGrayText</p></td>
222+<td><p>無効要素のフォント色</p></td>
223+<td><p>-</p></td>
224+<td><p>なし</p></td>
225+</tr>
226+<tr>
227+<td><p>clBtnText</p></td>
228+<td><p>clBtnFace と共に使われるボタンのフォント色</p></td>
229+<td><p>-</p></td>
230+<td><p>なし</p></td>
231+</tr>
232+<tr>
233+<td><p>clInactiveCaptionText</p></td>
234+<td><p>非アクティブウィンドのタイトルバーの文字色</p></td>
235+<td><p>-</p></td>
236+<td><p>なし</p></td>
237+</tr>
238+<tr>
239+<td><p>clBtnHighlight</p></td>
240+<td><p>アクティブの 3D エフェクトに使われているボタンのハイライトの色(上と左側)</p></td>
241+<td><p>-</p></td>
242+<td><p>なし</p></td>
243+</tr>
244+<tr>
245+<td><p>cl3DDkShadow</p></td>
246+<td><p>?</p></td>
247+<td><p>-</p></td>
248+<td><p>なし</p></td>
249+</tr>
250+<tr>
251+<td><p>cl3DLight</p></td>
252+<td><p>?</p></td>
253+<td><p>-</p></td>
254+<td><p>なし</p></td>
255+</tr>
256+<tr>
257+<td><p>clInfoText</p></td>
258+<td><p>ヒント用のフォント色。clInfoBk と共に使用。</p></td>
259+<td><p>-</p></td>
260+<td><p>全部</p></td>
261+</tr>
262+<tr>
263+<td><p>clInfoBk</p></td>
264+<td><p>ヒント用のブラシ色。clInfoText と共に使用。</p></td>
265+<td><p>-</p></td>
266+<td><p>全部</p></td>
267+</tr>
268+<tr>
269+<td><p>clHotLight</p></td>
270+<td><p>?</p></td>
271+<td><p>-</p></td>
272+<td><p>なし</p></td>
273+</tr>
274+<tr>
275+<td><p>clGradientActiveCaption</p></td>
276+<td><p>アクティブウィンドウのタイトルバーのグラデーション作成時に使われるもう片方の色</p></td>
277+<td><p>-</p></td>
278+<td><p>なし</p></td>
279+</tr>
280+<tr>
281+<td><p>clGradientInactiveCaption</p></td>
282+<td><p>非アクティブウィンドウのタイトルバーのグラデーション作成時に使われるもう片方の色</p></td>
283+<td><p>-</p></td>
284+<td><p>なし</p></td>
285+</tr>
286+<tr>
287+<td><p>clMenuHighlight</p></td>
288+<td><p>選択されているメニューアイテムの背景色</p></td>
289+<td><p>-</p></td>
290+<td><p>なし</p></td>
291+</tr>
292+<tr>
293+<td><p>clMenuBar</p></td>
294+<td><p>メニューバーの背景色</p></td>
295+<td><p>-</p></td>
296+<td><p>なし</p></td>
297+</tr>
298+<tr>
299+<td><p>clForm</p></td>
300+<td><p>?</p></td>
301+<td><p>-</p></td>
302+<td><p>なし</p></td>
303+</tr>
304+<tr>
305+<td><p>clColorDesktop</p></td>
306+<td><p>?</p></td>
307+<td><p>-</p></td>
308+<td><p>なし</p></td>
309+</tr>
310+<tr>
311+<td><p>cl3DFace</p></td>
312+<td><p>?</p></td>
313+<td><p>-</p></td>
314+<td><p>なし</p></td>
315+</tr>
316+<tr>
317+<td><p>cl3DShadow</p></td>
318+<td><p>?</p></td>
319+<td><p>-</p></td>
320+<td><p>なし</p></td>
321+</tr>
322+<tr>
323+<td><p>cl3DHiLight</p></td>
324+<td><p>?</p></td>
325+<td><p>-</p></td>
326+<td><p>なし</p></td>
327+</tr>
328+<tr>
329+<td><p>clBtnHiLight</p></td>
330+<td><p>clBtnHighlight と同じ</p></td>
331+<td><p>-</p></td>
332+<td><p>なし</p></td>
333+</tr>
334+</tbody>
335+</table>
336+
337+# カスタムコントロールにテーマ要素を描画する
338+
339+ユニット **Themes** は標準コントロールの画一された要素の描画のための関数を提供しています。例えば、TTreeView などの展開(+/-など)ボタンを描画するには、以下のようなコードを使用します。
340+
341+``` pascal
342+uses Themes;
343+
344+...
345+
346+procedure TYourCustomControl.Paint;
347+const
348+ PlusMinusDetail: array[Boolean {強調表示}, Boolean {展開しているか}] of TThemedTreeview =
349+ (
350+ (ttGlyphClosed, ttGlyphOpened),
351+ (ttHotGlyphClosed, ttHotGlyphOpened)
352+ );
353+var
354+ Details: TThemedElementDetails;
355+ R: TRect;
356+ Collapse: boolean;
357+begin
358+ ...
359+ //テーマに沿った展開ボタンを描画します。
360+ Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);
361+ R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);
362+ ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
363+ ...
364+end;
365+```
366+
367+---
368+*From the Free Pascal wiki, page "Colors/ja", 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](/wiki-contact).*

Back to history