Ver Mensaje Individual
  #2  
Antiguo 28-05-2008
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Reputación: 21
xEsk Va por buen camino
Hola, la solución es bastante sencilla, debes realizar un "refresh" después de cambiar el color (por ejemplo).

Te pego el código "mejorado" (te he quitado trozos de código que no realizaban ninguna función o realizaban funciones repetidas):

Código Delphi [-]
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var
  IconRect,   RectDireccion,   RectTelefono,   RectEmail,   RectTitulo : TRect;
begin
  with Sender as TListView do
    begin
      case ViewStyle of
        vsIcon:
          begin
            IconRect  :=  Item.DisplayRect(drIcon);
            if(cdsSelected in State) then
              begin
                Canvas.Font.Style :=  Canvas.Font.Style + [fsBold];
                Canvas.Font.Color :=  clBlack;
                Canvas.Font.Name  :=  'Arial';

                RectTitulo  :=  IconRect;
                RectTitulo.Left  := IconRect.Left + 42;
                Canvas.Brush.Color  :=  clSkyBlue;
                Canvas.Pen.Style  :=  psDash;
                Canvas.FrameRect(RectTitulo);

                RectTitulo.Bottom :=  IconRect.Top + Canvas.TextHeight('Hola mundo');
                Canvas.TextRect(RectTitulo, RectTitulo.Left+2,RectTitulo.Top+5, 'Hola mundo');

                Canvas.Brush.Color  :=  $FFFFEE;
                Canvas.FillRect(IconRect);
              end;
            if((Item.Index mod 2) = 0)then
              begin
                Canvas.Font.Style :=  Canvas.Font.Style + [fsBold];
                Canvas.Font.Color :=  clBlack;
                Canvas.Font.Name  :=  'Arial';

                RectTitulo  :=  IconRect;
                RectTitulo.Left  := IconRect.Left + 41;
                Canvas.Brush.Color  :=  clSkyBlue;
                Canvas.FrameRect(RectTitulo);
                RectTitulo.Bottom :=  IconRect.Top + Canvas.TextHeight('Titulo 1:')+5;
                Canvas.TextRect(RectTitulo, RectTitulo.Left+2,RectTitulo.Top+5, 'Titulo 1:');

                // Cambiamos el color de fondo de los proximos textos
                Canvas.Brush.Color  :=  clWhite;
                Canvas.Refresh; // <<<<<<<<<<<<<< AQUI ESTA LA MAGIA xD

                //Titulo Direccion
                RectDireccion :=  IconRect;
                RectDireccion.Left  := IconRect.Left + 42;
                RectDireccion.Top   := IconRect.Top + Canvas.TextHeight('Valor de la dirección:')+20;
                RectDireccion.Bottom  :=  RectDireccion.Top + Canvas.TextHeight('Direccion : ');
                Canvas.TextRect(RectDireccion, RectDireccion.Left+2,RectDireccion.Top, 'Dirección : ');

                //Titulo Telefono
                RectTelefono :=  IconRect;
                RectTelefono.Left  := IconRect.Left + 42;
                RectTelefono.Top   := RectDireccion.Top + Canvas.TextHeight('Direccion : ')+10;
                RectTelefono.Bottom  :=  RectTelefono.Top + Canvas.TextHeight('Teléfono : ');
                Canvas.TextRect(RectTelefono, RectTelefono.Left+2, RectTelefono.Top, 'Teléfono : ');

                //Titulo Email
                RectEmail :=  IconRect;
                RectEmail.Left  := IconRect.Left + 42;
                RectEmail.Top   := RectTelefono.Top + Canvas.TextHeight('Email : ')+10;
                RectEmail.Bottom  :=  RectEmail.Top + Canvas.TextHeight('Email : ');
                Canvas.TextRect(RectEmail, RectEmail.Left+2, RectEmail.Top, 'Email : ');
              end;

            Canvas.Brush.Color  :=  clGrayText;
            Canvas.FrameRect(IconRect);
            ilOthersImages.Draw(Canvas, IconRect.Left, IconRect.Top,0);

            //Vacio el Caption ...
            Item.Caption  :=  '';
          end;
        vsSmallIcon:;
        vsList:;
        vsReport:;
      end;
    end;
end;

La mejora está en que después de pintar el titulo (el único que tu quieres de color azul) le cambiamos el color de la brocha a blanco y "refrescamos", y ya podemos ir pintando los textos.

Ahora te queda controlar cuando el item está seleccionado, para que no pinte el fondo del texto como blanco, sino del color de fondo de cuando está seleccionado.

Saludos, espero que te sirva

Editado:

Después de poner el mensaje, caí en que en lugar de asignarle el color "blanco" como fondo, se puede mejorar asignando la propiedad Canvas.Brush.Style:=bsClear; así queda transparente, y no debes preocuparte de cambiar el color para cuando el item este seleccionado.

Este seria el cambio que debería de realizarse en el código:
Código Delphi [-]
// Asignamos un fondo transparente a los proximos textos
Canvas.Brush.Style:=bsClear; // fondo transparente
Canvas.Refresh; // <<<<<<<<<<<<<< AQUI ESTA LA MAGIA xD

Última edición por xEsk fecha: 28-05-2008 a las 16:13:00. Razón: Una pequeña mejora
Responder Con Cita