Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-05-2008
underwater underwater is offline
Miembro
 
Registrado: oct 2007
Ubicación: Argentina
Posts: 23
Poder: 0
underwater Va por buen camino
Dibujar sobre el list view!!

Buenos dias!!

Bueno sigo intentando hacer mas bonitas mis aplicaciones... el tema que traigo hoy a ustedes es que yo quiero mostrar algo de la informacion que traigo en forma de tarjeta (vieron como muestra la informacion de contactos el outlook!!) y dije seguro que el List view sirve, y si me sirve pero(siempre hay un pero...je) la cuetion esta en que no puedo escribir en mas de una linea si que me pinte de un color raro las cosas...
el tema es asi...
Yo pongo en un form un TListView, un boton, un popupmenu y 2 Image List. Lo que hago es lo siguiente:
Primero que nada asigno a las propiedades Height y Widht de uno de los imagelist(imagelist1) un tamaño grande 150 y 200, respectivamente, y este imagelist lo asigno en la propiedad LargeImage del ListView1(este imagelist no contiene ninguna imagen, lo utilizo nomas para poder dibujar sobre el listview un cuadrado lo suficientemente grande para que quepan mis datos).
Eso es lo que hago a nivel diseño, luego lo que coloco en el
evento [color=Red]CustomDrawItem [color=Black]del ListView1 es lo siguiente:
Código Delphi [-]
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; 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 + 42;
                        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:');

                        //Titulo Direccion
                        RectDireccion :=  IconRect;
                        RectDireccion.Left  := IconRect.Left + 42;
                        RectDireccion.Top   := IconRect.Top + Canvas.TextHeight('Valor de la dirección:')+20;
                        SetDCBrushColor(Canvas.Handle, clWhite);
                        SetDCPenColor(Canvas.Handle, clWhite);
                        UpdateColors(Canvas.Handle);
                        RectDireccion.Bottom  :=  RectDireccion.Top + Canvas.TextHeight('Direccion : ');
                        Canvas.FrameRect(RectDireccion);
                        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;
                        SetDCBrushColor(Canvas.Handle, clWhite);
                        SetDCPenColor(Canvas.Handle, clWhite);
                        UpdateColors(Canvas.Handle);
                        RectTelefono.Bottom  :=  RectTelefono.Top + Canvas.TextHeight('Teléfono : ');
                        Canvas.FrameRect(RectTelefono);
                        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;
                        SetDCBrushColor(Canvas.Handle, clWhite);
                        SetDCPenColor(Canvas.Handle, clWhite);
                        UpdateColors(Canvas.Handle);
                        RectEmail.Bottom  :=  RectEmail.Top + Canvas.TextHeight('Email : ');
                        Canvas.FrameRect(RectEmail);
                        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:  begin                         end;
          vsList: begin                   end;
          vsReport: begin                     end;
        end;
      end;
end;

Que es lo que se encarga de dibujar... Lo dibuja hace lo que tiene que hacer... pero el problema mio esta en que si yo quiero que la primera linea de texto que coloco salga resaltada con un fondo.. este sale..
pero se vuelve a repetir en las demas lineas, ejemplo:

TITULO //A esto lo resalto y le coloco un color de fondo azul, por ejemplo.
LINEA 1 //Esto tendria que no salir resaltado ni con un color de fondo, en todo caso el color de fondo seria blanco, lo cual tampoco consigo..
LINEA 2
LINEA 3


En definitiva lo que yo quiero es mostrar una tarjeta tipo outlook, pero no me sale... si alguno conoce algun metodo para realizar esto o alguna otra forma... y si me lo puede decir se lo agradeceria...
Aca les dejo una imagen de lo que me sale actualmente. La unica linea que quiero resaltar es la primera "Titulo 1:". Despues el texto "Direccion", "Telefono", "email", quiero quitar ese maldito fondo azul!!!jejeje

Gracias de antemano!!

saludos
Archivos Adjuntos
Tipo de Archivo: zip Imagen que no quiero.zip (4,5 KB, 20 visitas)
Responder Con Cita
  #2  
Antiguo 28-05-2008
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
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
  #3  
Antiguo 29-05-2008
underwater underwater is offline
Miembro
 
Registrado: oct 2007
Ubicación: Argentina
Posts: 23
Poder: 0
underwater Va por buen camino
Muchas gracias!!!

ni se me habia ocurrido que podria ser eso!!..

Saludos..
hasta la proxima...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dibujar sobre una imagen. toorbye Gráficos 25 25-04-2017 10:47:55
List View en Grupos?? underwater Varios 5 16-11-2007 15:39:10
Dibujar sobre Timagen eljose Gráficos 7 13-12-2006 11:01:58
Como saber que un List View esta vacio zvf OOP 3 19-09-2006 01:09:38
Ayuda sobre un action list Oni Varios 2 04-05-2006 18:12:50


La franja horaria es GMT +2. Ahora son las 16:00:51.


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
Copyright 1996-2007 Club Delphi