Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambiar color de letras de acuerdo al color de fondo (https://www.clubdelphi.com/foros/showthread.php?t=61645)

Adrian Murua 15-11-2008 15:44:25

Cambiar color de letras de acuerdo al color de fondo
 
Esimados amigos:

Tengo un componente DBGRID al que le cambio el color de fondo de una fila de acuerdo a un campo de la tabla en la que realizo la consulta, esto lo hago mediante el evento DrawColumnCell del componente.

Código:

procedure TFrmMgnBancos.GrillaDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  If (Datos.MgnBancos.FieldByName('Activo').AsInteger = 1 )
    then Grilla.canvas.brush.color := clMaroon;

    Grilla.DefaultDrawColumnCell(rect,DataCol,Column,State)
end;

La duda es la siguiente, yo deseo permitir que el usuario pueda cambiar el color de fondo de la fila (mediante una personalizacion del componente ), pero me encuentro con el problema de que si el usuario elige, como en el codigo anterior, un color de fondo oscuro, en la grilla se veria ese color oscuro de fondo y las letras negras , por lo que no se podra leer bien las letras , habria alguna forma de automatizar el color de de las letras de acuerdo al color de fondo elegido, teniendo en cuenta que no estaria en los planes permitir que el usuario eliga el color de las letras?.:cool:

Desde ya Muchas Gracias.

coso 15-11-2008 16:21:18

Hola, puedes buscar el negativo del color :

Código Delphi [-]
color_neg := $FFFFFF xor color;

o bien comparar luminosidades, y poner ciertos colores fijos (blanco, gris, negro, etc...) segun esta. Para calcularla tansolo tendras que sumar las componentes r,g,b de cada uno :

Código Delphi [-]
function Red(c : TColor) : integer;
begin
        Red := c and $FF;
end;

function Green(c : TColor) : integer;
begin
        Green := (c and $FF00) div $100;
end;

function Blue(c : TColor) : integer;
begin
        Blue := (c and $FF0000) div $10000;
end;

function Lum(c : TColor) : integer;
begin
        Lum := (Red(c) + Green(c) + Blue(c)) div 3;
end;

var
  l : integer;
begin
    l := Lum(backcolor);
    if l < 64  then font.color := clWhite  else
    if l < 128 then font.color := clSilver else
    if l < 192 then font.color := clGray   else font.color := clBlack;
end;

saludos.

Adrian Murua 15-11-2008 18:36:21

Muchas gracias por responder, lo de las luminosidades , me salio perfecto, lo voy a implkemedntar en el control , gracias.:p


La franja horaria es GMT +2. Ahora son las 02:09:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi