Difference between revisions of "Colors/de"

From Free Pascal wiki
Jump to navigationJump to search
(Überblick über den Artikel optimiert)
Line 1: Line 1:
 
{{Colors}}
 
{{Colors}}
<br>
+
 
<br>
+
Wie Farbwerte von Bildern im Arbeitsspeicher gespeichert werden, hängt von den verwendeten Klassen ab. In der [[Glossary/de#LCL|Lazarus Component Library (LCL)]], mit der grafische Anwendungen in Lazarus erstellt werden, wird dafür der Datentyp [http://lazarus-ccr.sourceforge.net/docs/lcl/graphics/tcolor.html TColor] verwendet. Dieser Datentyp besteht aus jeweils 1&nbsp;Byte für Rot, Grün und Blau ([[Glossary/de#RGB|RGB]]), kann aber auch auf Systemfarben wie clDefault verweisen. Bei Systemfarben entscheidet das Betriebssystem oder das [[Glossary/de#Widget|Widget-Set]], was genau gezeichnet wird; dies muss nicht zwangsläufig eine Farbe sondern kann auch eine Textur oder ein Bild sein. TColor ist vollständig zu TColor aus Delphi kompatibel.
Überblick
+
 
=Overview=
+
Die [[FCL/de|Free Component Library]] enthält in der Unit [[fcl-image|fpImage]] den Datentyp TFPColor. Dieser Datentyp speichert die Farben als RGBA ab; zusätzlich zur Farbe kann eine Transparenz angegeben werden. Jeder Farbkanal hat eine Auflösung von 16&nbsp;Bit. Systemfarben können nicht verwendet werden.
Die Standard-Farbe in der Lazarus Class Library (LCL) ist TColor, diese Farbe ist kompatibel zu Delphi TColor. TColor kann ein RGB-Wert (3 x 8bit), oder eine Systemfarbe wie clDefault sein.
+
 
Die LCL ermöglicht es mit der Unit fpImage und z. B. dem Datentyp TFPColor RGBA (4 x 16Bit) zu verwenden.
+
Die Verwendung der Farben wird in dem Artikel [[Developing with Graphics/de|Developing with Graphics]] erklärt.
<br>
+
 
 
=Konvertiere TColor nach RGB und wiederzurück=
 
=Konvertiere TColor nach RGB und wiederzurück=
Die Unit Graphics bietet dazu folgende Funktionen
+
In der Unit Graphics sind einige Funktionen definiert, die die Arbeit mit Farben vereinfachen sowie zwischen den verschiedenen Datentypen konvertieren:
 
<syntaxhighlight>
 
<syntaxhighlight>
 
function Blue(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
 
function Blue(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
Line 18: Line 18:
 
function TColorToFPColor(const c: TColor): TFPColor; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
 
function TColorToFPColor(const c: TColor): TFPColor; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
+
 
Es gibt einige vordefinierte Farbkonstanten:
+
= Vordefinierte Farbkonstanten =
 
<syntaxhighlight>
 
<syntaxhighlight>
 
   // standard colors
 
   // standard colors
Line 41: Line 41:
 
   clWhite  = TColor($FFFFFF);
 
   clWhite  = TColor($FFFFFF);
 
   </syntaxhighlight>
 
   </syntaxhighlight>
<br>
+
 
 
=Systemfarben=
 
=Systemfarben=
 
==Beispiel: clInfoBk, clInfoText==
 
==Beispiel: clInfoBk, clInfoText==
Line 87: Line 87:
 
Form1.Canvas.FillRect(10,10,50,50); // jetzt, wird der Farbwert des aktuellen Themas verwendet
 
Form1.Canvas.FillRect(10,10,50,50); // jetzt, wird der Farbwert des aktuellen Themas verwendet
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
 
  
 
==Tabelle der Systemfarben==
 
==Tabelle der Systemfarben==
In der folgenden Tabelle werden die Systemfarben und ihre Bedeutung aufgelistet. Werden die Systemfarben ausserhalb des definierten Geltungsbereiches verwendet, dann ist das Ergebnis unvorhersehbar. Die Systemfarben sind immer vom aktuell verwendeten widgetset (= Sammlung von Grafik Bibliotheken) und dem aktuell verwendeten Thema (= grafische Darstellung der Betriebssystemoberfläche) abhängig.<br>
+
In der folgenden Tabelle werden die Systemfarben und ihre Bedeutung aufgelistet. Werden die Systemfarben ausserhalb des definierten Geltungsbereiches verwendet, dann ist das Ergebnis unvorhersehbar. Die Systemfarben sind immer vom aktuell verwendeten Widget-Set (eine Sammlung von grafischen Bedienelementen) und dem aktuell verwendeten Thema (grafische Darstellung der Betriebssystemoberfläche) abhängig.
<br>
+
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Konstante !! LCL Definition !! Unterstützte Widgetsets
 
! Konstante !! LCL Definition !! Unterstützte Widgetsets
Line 171: Line 170:
 
|clBtnHiLight|| Das Gleiche wie clBtnHighlight || kein
 
|clBtnHiLight|| Das Gleiche wie clBtnHighlight || kein
 
|}
 
|}
<br>
 
  
 
==Zeichnen von Themaelementen auf Ihren benutzerdefinierten Steuerelementen==
 
==Zeichnen von Themaelementen auf Ihren benutzerdefinierten Steuerelementen==
Line 200: Line 198:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
+
 
<br>
 
 
--[[User:Olaf|Olaf]] 12:20, 6 August 2013 (CEST)
 
--[[User:Olaf|Olaf]] 12:20, 6 August 2013 (CEST)
 
[[Category:Graphics/de]]{{AutoCategory}}
 
[[Category:Graphics/de]]{{AutoCategory}}

Revision as of 20:58, 30 December 2013

Deutsch (de) English (en) español (es) suomi (fi) français (fr) 日本語 (ja) русский (ru) 中文(中国大陆)‎ (zh_CN)

Wie Farbwerte von Bildern im Arbeitsspeicher gespeichert werden, hängt von den verwendeten Klassen ab. In der Lazarus Component Library (LCL), mit der grafische Anwendungen in Lazarus erstellt werden, wird dafür der Datentyp TColor verwendet. Dieser Datentyp besteht aus jeweils 1 Byte für Rot, Grün und Blau (RGB), kann aber auch auf Systemfarben wie clDefault verweisen. Bei Systemfarben entscheidet das Betriebssystem oder das Widget-Set, was genau gezeichnet wird; dies muss nicht zwangsläufig eine Farbe sondern kann auch eine Textur oder ein Bild sein. TColor ist vollständig zu TColor aus Delphi kompatibel.

Die Free Component Library enthält in der Unit fpImage den Datentyp TFPColor. Dieser Datentyp speichert die Farben als RGBA ab; zusätzlich zur Farbe kann eine Transparenz angegeben werden. Jeder Farbkanal hat eine Auflösung von 16 Bit. Systemfarben können nicht verwendet werden.

Die Verwendung der Farben wird in dem Artikel Developing with Graphics erklärt.

Konvertiere TColor nach RGB und wiederzurück

In der Unit Graphics sind einige Funktionen definiert, die die Arbeit mit Farben vereinfachen sowie zwischen den verschiedenen Datentypen konvertieren:

function Blue(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function Green(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function Red(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function RGBToColor(R, G, B: Byte): TColor;
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function FPColorToTColor(const FPColor: TFPColor): TColor;
function TColorToFPColor(const c: TColor): TFPColor; // arbeitet nicht mit den vordefinierten Systemfarben zusammen

Vordefinierte Farbkonstanten

  // 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); // Alias: clSilver
  clDkGray  = TColor($808080); // Alias: clGray
  clWhite   = TColor($FFFFFF);

Systemfarben

Beispiel: clInfoBk, clInfoText

Systemfarben sind Farbkonstanten mit einer besonderen Bedeutung. Ihr wirklicher Wert hängt vom Kontext und dem Windowsthema ab. Sie sind keine einfachen Farben.
clInfoBk zum Beispiel:

Form1.Canvas.Brush.Color:=clInfoBk;  // verwende den Standardhintergrund Pinsel für ein Hinweisfenster
Form1.Canvas.FillRect(10,10,50,50);


Ein Hinweisfenster unter MS-Windows könnte einen weißen Hintergrund haben. Unter Linux/GTK2 könnte das Hinweisfenster eine metallische Beschaffenheit haben. Wenn Sie nun einen Text in diese Fläche schreiben möchten, dann müssen Sie, wenn Sie den Text lesen möchten die Farbe auf einen Wert wie clInfoText ändern. Zum Beispiel:

Form1.Canvas.Brush.Color:=clInfoBk;  // verwende den Pinsel für die Standardhintergrundfarbe für ein Hinweisfenster
Form1.Canvas.FillRect(10,10,50,50);
Form1.Canvas.Font.Color:=clInfoText;  // verwende den Pinsel für die Standardtextfarbe für ein Hinweisfenster
Form1.Canvas.TextOut(10,10,'Hint');


Die Systemfarbe clInfoBk kann nicht für Pen.Color und nicht für Font.Color verwendet werden. Wenn Sie dies tun, dann ist das Ergebnis nicht definiert und hängt vom verwendeten widgetset (= Sammlung von Grafik Bibliotheken) und dem vom Benutzer gewählten Thema (= grafische Darstellung der Betriebssystemoberfläche) ab. Das gleiche gilt für clInfoText. Es kann nur als Font.Color verwendet werden. eine Verwendung mit Brush.Color wird nicht funktionieren. Im Moment erlauben alle widgetsets die Verwendung mit Pen.Color.

Ändern des Fensterthemas des Betriebssystems

Wenn z. B. der Benutzer das Thema (= grafische Darstellung der Betriebssystemoberfläche) wechselt dann kann das Betriebssystem seine Farben ändern. clInfoBk kann sich z. B. von weiß nach blau ändern oder von einer Farbe zu einer Textur. Das kann dem Programmierer Probleme bereiten. Das liegt daran, das sich der Farbwert der vordefinierten Systemfarben im eigenen Programm nicht automatisch anpasst. Der Programmierer muss dafür sorgen, das die Systemfarben den aktuellen Wert erhalten.
Dazu ist ein Zwischenschritt nötig.
Beispiel:

Form1.Canvas.Brush.Color:=clInfoBk; // der Pinsel erhält die aktuellen Systemfarben
Form1.Canvas.FillRect(10,10,50,50); // dies erstellt einen Pinsel mit dem Farbwert
                                    // des Hinweisfensters des aktiven Fensterthemas
...
// Wenn das Thema (= grafische Darstellung der Betriebssystemoberfläche) vom Anwender
// zwischenzeitlich geändert wird, dann hat der Pinsel noch die vorhergehenden Farbwerte
...
Form1.Canvas.FillRect(10,10,50,50); // mit dem Pinsel wird der Farbwert des vorhergehenden Themas gezeichnet
Form1.Canvas.Brush.Color:=clInfoBk; // durch eine erneute Zuweisung wird der
                                    // vorhergehenden Farbwert nicht aktualisiert
Form1.Canvas.FillRect(10,10,50,50); // mit dem Pinsel wird der Farbwert des alten Themas gezeichnet
Form1.Canvas.Brush.Color:=clRed;    // eine Zuweisung mit einem neuen Farbwert macht den
                                    // vorhergehenden Farbwert ungültig
Form1.Canvas.Brush.Color:=clInfoBk; // eine Zuweisung mit einem neuen Farbwert macht den
                                    // vorhergehenden Farbwert ungültig
Form1.Canvas.FillRect(10,10,50,50); // jetzt, wird der Farbwert des aktuellen Themas verwendet

Tabelle der Systemfarben

In der folgenden Tabelle werden die Systemfarben und ihre Bedeutung aufgelistet. Werden die Systemfarben ausserhalb des definierten Geltungsbereiches verwendet, dann ist das Ergebnis unvorhersehbar. Die Systemfarben sind immer vom aktuell verwendeten Widget-Set (eine Sammlung von grafischen Bedienelementen) und dem aktuell verwendeten Thema (grafische Darstellung der Betriebssystemoberfläche) abhängig.

Konstante LCL Definition Unterstützte Widgetsets
clNone Der Farbwert ist nicht definiert. D. h. er hat keine Auswirkungen bzw. er kann im Einzelfall einen weißen Farbwert haben. alle
clDefault Verwendet die vorgesehene Standardfarbe alle
clScrollBar Scrollbar Körper alle
clBackground ? alle
clActiveCaption Titelleiste des aktiven Fensters kein
clInactiveCaption Titelleiste des inaktiven Fensters kein
clMenu Regular menu item background color kein
clWindow The normal background brush of unselected text. Defined for controls like TEdit, TComboBox, TMemo, TListBox, TTreeView. kein
clWindowFrame Farbe der Rahmen um das Fenster kein
clMenuText Die Schriftfarbe ist zusammen mit clMenu zu verwenden kein
clWindowText Die Schriftfarbe ist zusammen mit clWindow zu verwenden kein
clCaptionText Textfarbe das aktiven Fensters kein
clActiveBorder ? kein
clInactiveBorder ? kein
clAppWorkspace MDIMain form background kein
clHighlight Die Pinselfarbe des ausgewählten Elements kein
clHighlightText Schriftfarbe vom ausgewählten Text (zusammen mit clHighligh). kein
clBtnFace Button Hintergrund kein
clBtnShadow Farbe des Button Schattens wird verwendet, um 3D-Effekt zu erzielen kein
clGrayText Die Schriftfarbe von einem deaktiverten Element kein
clBtnText Button Schriftfarbe zu verwenden mit clBtnFace kein
clInactiveCaptionText Textfarbe der inaktiven Fenstertitelleiste kein
clBtnHighlight Button Farbhervorhebung wird verwendet, um 3D-Effekt zu erzielen kein
cl3DDkShadow ? kein
cl3DLight ? kein
clInfoText Schriftfarbe für Hinweise. Ist zu verwenden mit clInfoBk alle
clInfoBk Pinselfarbe für Hinweisse. Ist zu verwenden mit clInfoText alle
clHotLight ? kein
clGradientActiveCaption Die zweit Farbe um die aktive Fenstertitelleiste mit verlaufenden Farben darzustellen kein
clGradientInactiveCaption Die zweit Farbe um die inaktive Fenstertitelleiste mit verlaufenden Farben darzustellen kein
clMenuHighlight Die Hintergrundfarbe des ausgewählten Menüpunkts kein
clMenuBar Die Hintergrundfarbe der Menüleiste kein
clForm ? kein
clColorDesktop ? kein
cl3DFace ? kein
cl3DShadow ? kein
cl3DHiLight ? kein
clBtnHiLight Das Gleiche wie clBtnHighlight kein

Zeichnen von Themaelementen auf Ihren benutzerdefinierten Steuerelementen

Die Unit Themes bietet Funktionen, um einzelne Elemente der Standard-Controls zu erweitern. Zum Beispiel um ein Contol wie ein TTreeView zu erweitern verwenden Sie folgenden 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
  ...
  // zeichnet eine Erweiterung
  Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);
  R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);
  ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
  ...
end;

--Olaf 12:20, 6 August 2013 (CEST)