Entwickler-Ecke

Multimedia / Grafik - Komplimentärfarbe von Screen.HintFont.Color ist immer falsch


trm - Mi 24.02.10 20:53
Titel: Komplimentärfarbe von Screen.HintFont.Color ist immer falsch
Huhu.

Ich habe mal wieder eine Knacknuss, bei der ich nicht weiterkomme.

Wenn ich mir Screen.HintFont.Color, dann hat das einen negativen Wert bei mir unter Windows XP (Delphi 7): -16777193 = $FFFFFFFFFF000017
Soweit so gut.

Doch, wenn ich nun die Komplimentärfarbe davon errechnen möchte, dann ergibt folgendes Konstrukt:

Canvas.Font.Color := Screen.HintFont.Color xor $FFFFFF;

-24 = $FFFFFFFFFFFFFFE8

Dadurch, weil der Wert Negativ ist, erhelte ich letztenendes wieder fast die gleiche Farbe wie der Originalwert.

Gibt es einen Weg (den ich nicht gefunden habe, ohne etliche if/case - Prüfungen), diesen Windowsfarbwert in einen Delphifarbwert umzurechnen?
Eigentlich müsste ich ja nur vom Original oder vom Ergebnis $FFFFFFFFFF000000 subtrahieren, damit es stimmt, oder gibt es wirklich eine Funktion, die bei Delphi 7 schon nutzbar ist?

Viele Grüße
~Mathias


Reinhard Kern - Mi 24.02.10 23:46

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich mir Screen.HintFont.Color, dann hat das einen negativen Wert bei mir unter Windows XP (Delphi 7): -16777193 = $FFFFFFFFFF000017 ...


Hallo,

TColor ist KEIN RGB-Wert, muss es jedenfalls nicht sein. Siehe mal da:

http://www.delphipraxis.net/post600828.html

Gruss Reinhard


trm - Do 25.02.10 00:32

Hallo Reinhard,

danke für Deinen Tipp. Jedoch weiss ich nicht, wie ich das anwenden soll, da ich ja einen riesengroßen Wert habe.

Hier ist jetzt mein aktuelles Konstrukt:


Delphi-Quelltext
1:
2:
3:
4:
    Canvas.Font.Assign(Screen.HintFont);
    Canvas.Brush.Color := (Canvas.Font.Color xor $00FF77); // ist zwar keine Koplimentärfarbe, aber so will ich es haben.
    if Canvas.Brush.Color < 0 then
      Canvas.Brush.Color := Canvas.Brush.Color and $FFFFFFFFFF000000;


Meinst Du, das ist ok so?


Xentar - Do 25.02.10 10:24

Du arbeitest da mit Systemfarben.. die kann man nicht einfach so invertieren, da der Farbwert erst von Windows, abhängig vom aktuellen Theme, zugewiesen wird.
Soweit ich weiß gibt es aber eine Funktion, um diese Systemfarbe zur Laufzeit als RGB Wert zu erhalten. Weiß leider den Namen nicht mehr, aber vielleicht hilft das schon als Suchbegriff?


Xion - Do 25.02.10 12:42


Delphi-Quelltext
1:
2:
Form1.Color:=clRed;
Form1.Color:=RGB( 255-GetRValue(Form1.Color),255-GetGValue(Form1.Color),255-GetBValue(Form1.Color) );


Ok, ob das jetzt die Komplementärfarbe ist...für rot ist es türkis, könnte hinkommen, aber ich weiß nicht wie z.B. die Komplementärfabre von (128,128,128)=grau(?) ist...weil das wäre sie mit dem Code wieder selbst.
So kann man auf jeden Fall Color nach RGB wandeln ;)


trm - Do 25.02.10 17:22

hallo Xion,

danke für Deine Hilfe.

Nebenbei: Glückwunsch zur 1200 :D

~Liebe Grüße
Mathias