Berechnung der Textfarbe für TStringGrid in "OnDraw()"
-
Hallo Leute,
ich habe eine Tabelle, in der ich die Hintergrundfarbe der Zellen selbst bestimme.
Passend zu der aktuellen Hintergrundfarne ändere ich die Textfarbe. Das heißt,
wenn die Hintergrundfarbe sehr dunkel ist, dann wähle ich weiße Textfarbe. Bei
heller Hintergrundfarbe wird eine schwarze Textfarbe verwendet.Das Problem ist, dass ab und zu die Textfarbe bei dunkler Hinterdrundfarbe
schwarz bleibt. Ich finde einfach den Fehler nicht.Hat jemand von euch schon mal etwas ähnliches Programmiert, oder irgendwo gesehen?
if( (StringGrid1->Canvas->Brush->Color) < 128 || ((StringGrid1->Canvas->Brush->Color > 256)&&(StringGrid1->Canvas->Brush->Color < (128*256)))) { // Textfarbe auf weiss setzen: StringGrid1->Canvas->Font->Color = 16777215; } else { // Textfarbe auf schwarz setzen: StringGrid_Selection_1->Canvas->Font->Color = 0; } // Hintergrundfarbe der Zelle zeichnen: // ==================================== StringGrid1->Canvas->FillRect(Rect); // Ausrichtung des Zelleninhaltes bestimmen: // ========================================= hAlign = 1; // 0/1/2 - Linksbündig/ Mittig/ Rechtsbündig // Zelleninhalt auf die Hintergrundfarbe schreiben: // ================================================ DrawText(StringGrid1->Canvas->Handle, StringGrid1->Cells[ACol][ARow].c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
-
Deine Farbvergleiche sind nicht korrekt.
Beispielsweise überprüft "Color < 128" nur, ob der Rotanteil kleiner als 128 ist (und der Blau- und Grünanteil genau 0 ist).Und die Farben setzen solltest du besser mit den vordefinierten Konstanten (z.B. clWhite oder clBlack) bzw. im HEX-Format (0xBBGGRR).
Um die Helligkeit zu bestimmen, müßtest du ersteinmal den Farbwert in das HSV-Modell umrechnen (s.a. http://de.wikipedia.org/wiki/HSV-Farbraum).
Wenn du nur vordefinierte feste Hintergrundfarben in deiner Anwendung verwendest, dann erzeuge doch dazu gleich eine Tabelle mit der passenden Textfarbe.