Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cambiar color de la barra de seleccion ??

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cambiar color de la barra de seleccion ?? Responder citando

SAludos!
Me interesaria poder cambiar el color de la fila seleccionada en un ListView. Como sabeis al seleccionar la fila, o cualquier casilla, esta se pone de un azul oscuro muy feo, me interesaria poder cambiar este color a otro mas clarito.. si ademas.. ya puediera darle un efectillo de linea oscura en los bordes seria fantastico..
Mi interes es darle una apariencia tipo.. emule. No se si habreis visto la seleccion mas chula que tiene.

Gracias!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

A mi tambien me interesaria saberlo, si lo consigues o alguien lo sabe please, que lo ponga..
Thx!!
Volver arriba
Mensaje    Asunto: Responder citando

Buscan dentro del foro, la Opcion "Cambiar color a un Edit", esto te cambia el contenido de los componentes, asi mismo puede que te de una idea..


https://cppbuilder.es/viewtopic.php?t=8358&highlight=edit

bye
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Saludos Cesar!
Gracias por tu respuesta, quizas vayan por ahi los tiros, pero me temo que no es tan sencillo.. Lo he intentado y lo unci que he conseguido es que todo el componente cambie de color.. Yo me refiero solo a la linea que va seleccionando las filas... no tengo ni idea de como puedo acceder a sus propiedades..
En el dibujado puedo saber si el item que voy a dibujas esta seleccionado.. pero no me sirve para nada.porque no se cambia el color.. el color de la seleccion queda por encima siempre.

A ver si podemos sacarlo.. o que nos ayude_leo Razz
Un saludo!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Puedes usar lo siguiente en el evento OnAdvancedCustomDrawItem del ListView:
Código:
void __fastcall TForm1::ListView1AdvancedCustomDrawItem(
      TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
      TCustomDrawStage Stage, bool &DefaultDraw)
{
    TListView* lv = static_cast<TListView*>(Sender);

    TRect IconRect = Item->DisplayRect(drIcon);
    TRect CaptionRect = Item->DisplayRect(drLabel);
    TRect ItemRect = Item->DisplayRect(drBounds);
    InflateRect(&ItemRect, -1, 0);
    InflateRect(&CaptionRect, -2, 0);

    // Pintamos el fondo del elemento
    if (State.Contains(cdsSelected))
    {
        lv->Canvas->Brush->Color = static_cast<TColor>(0xF4E6DC);
        lv->Canvas->Pen->Color = static_cast<TColor>(0xD48A4C);
        lv->Canvas->Rectangle(ItemRect);
    }
    else
    {
        lv->Canvas->Brush->Color = lv->Color;
        lv->Canvas->FillRect(ItemRect);
    }

    // Dibujamos el icono si lo hubiese
    if (lv->SmallImages)
    {
        lv->SmallImages->Draw(lv->Canvas,
            IconRect.Left, IconRect.Top, Item->ImageIndex, true);
    }

    // Dibujamos el texto del elemento
    SetBkMode(lv->Canvas->Handle, TRANSPARENT);
    DrawText(lv->Canvas->Handle, Item->Caption.c_str(),
        Item->Caption.Length(), &CaptionRect, DT_END_ELLIPSIS);

    // Dibujamos el texto de los subelementos
    for (int i=0; i<Item->SubItems->Count; i++)
    {
        TRect SubItemRect;
        ListView_GetSubItemRect(lv->Handle,
            Item->Index, i+1, LVIR_BOUNDS, &SubItemRect);
        InflateRect(&SubItemRect, -6, 0);
        String str = Item->SubItems->Strings[i];
        DrawText(lv->Canvas->Handle, str.c_str(),
            str.Length(), &SubItemRect, DT_END_ELLIPSIS);
    }

    DefaultDraw = false;
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias! funciona muy bien, es lo que estaba buscando.. muchas gracias.

De todas formas estos dias he estado dandole vueltas al tema, y vi que existia un objeto TStyle que en el tiene un medoto DrawFocusRect donde se pueden modificar los paramentros por defecto de la seleccion y de otras muchas cosas de la aplicacion.
Pego aqui:
typedef void __fastcall (__closure *TDrawFocusRectEvent)(TObject* Sender, TCanvas* Canvas, const TRect Rect, bool AtBorder, bool &DefaultDraw);

No se si iba bien encaminado.. estaba intentando saber como poder sacar el estilo de la aplicacion o del componente y sobreescribir el estilo..
Descrubri los objetos TApplicationStyle TWidgetStyle..
Pero la verdad no me aclaro.

Seria posible hacerlo tambienb de esta forma?
Como se podrian cambiar cosas del estilo por defecto de la aplicacion? no he podido saber donde sacar los parametros de estilo
Muchas gracias!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

El TStyle que mencionas no pertenece a la VCL, sino a la CLX, es la librería que trae Kylix y el BCB6 como alternativa compatible con esta, donde no se usan los controles nativos de Windows. Por así decirlo TStyle son los eventos equivalentes en la CLX a lo que usamos mas arriba para pintar el control a nuestro gusto, al no ser controles nativos sino dibujados es más fácil centralizar la apariencia personalizada.

Usar la librería CLX solo tiene sentido si mas tarde tienes pensado portar tu proyecto a Linux usando el Borland Kylix. Aunque es dudosa la continuación de este producto
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo! poco a poco me voy aclarando..
Bueno.. una ultima cosilla..
He migrado todo el codigo que tenia on otros eventos custom draw etc a el avanced draw del item, ya que parece ser que al poner defaultdraw=false ya no ejecuta los demas..
Funciona todo muy bien.. pero hay un problema.. poruqe no puedo cambiar la fuente de las letras en los distintos subitems?? tampoco puedo incluir un circulo en un subitem como tenia antes.. solo funciona el brush y el fillrect... me interesaria poner distintos tipos de letra en los subitems..
Posiblemente sea una tonteria pero es que tengo un lio entre tanto DefeultDraw.. customDraw advancedDraw etc .. Razz , quizas si puedes aclarame los conceptos te lo agradeceria muchisimo.
Actualmente en el AdvancedCustomDrawItem tengo el codigo que me has proporcionado, yo simplemente le quiero añadir que segun que subimtem, cambie la letra.. o incluya una figura dentro del subitem.. Para saber en que subitem estoy utilizo la variable i del contador cuando se van a escribir los captions de los subitems..
if (i==0) //subitem 1
Sender->Canvas->Font->Color=clBlue; //no me hace ni caso..
if (i==1) //subitem 2
.. etc

Otra cosilla que estoy intentando es incluir Un Check Box dentro de un SubItem.. pero no consigo que salga..

Espero no ser pesado.

Muchisimas gracias y un gran saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He tenido un momento de lucidez (raro en mi Razz) jaaj y he solucionado varias cosillas..

Para cambiar el color del texto es con la API SetTextColor(COLORREF color);
Para cambiar la fuente y su estilo.. no consigo entender la api.. a ver si alguien puede ponerme un ejemplillo.

He conseguido dibujar un checkBox dentro de Un subitem mediante..
DrawFrameControl(lv->Canvas->Handle, (RECT*) &CaptionRect,
DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED);
Ahora como puedo hacer que sea sensible? y como podria cambiar su estado?

Si el LIstView tiene la propiedad Checkboxes a true aparecen unos checks box a la izquieda del item.. esos no se dibujan , quizas falte algo en el AdvancedCustomDraw.. que seria ?

Muchas graciasss
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Espero que se entienda:

Código:
void __fastcall TForm1::ListView1AdvancedCustomDrawItem(
      TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
      TCustomDrawStage Stage, bool &DefaultDraw)
{
    TListView* lv = static_cast<TListView*>(Sender);

    TRect IconRect = Item->DisplayRect(drIcon);
    TRect CaptionRect = Item->DisplayRect(drLabel);
    TRect ItemRect = Item->DisplayRect(drBounds);
    InflateRect(&ItemRect, -1, 0);
    InflateRect(&CaptionRect, -2, 0);

    // Pintamos el fondo del elemento
    if (State.Contains(cdsSelected))
    {
        lv->Canvas->Brush->Color = static_cast<TColor>(0xF4E6DC);
        lv->Canvas->Pen->Color = static_cast<TColor>(0xD48A4C);
        lv->Canvas->Rectangle(ItemRect);
    }
    else
    {
        lv->Canvas->Brush->Color = lv->Color;
        lv->Canvas->FillRect(ItemRect);
    }

    // Pintamos el checkbox del elemento si esta activa esta opción
    if (lv->Checkboxes)
    {
        TRect CheckBoxRect = ItemRect;
        CheckBoxRect.Right = CheckBoxRect.Left + 20;
        InflateRect(&CheckBoxRect, -2, -2);
        DrawFrameControl(lv->Canvas->Handle, &CheckBoxRect,
            DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_MONO
            | (Item->Checked ? DFCS_CHECKED:0));

    }

    // Dibujamos el icono si lo hubiese
    if (lv->SmallImages)
    {
        lv->SmallImages->Draw(lv->Canvas,
            IconRect.Left, IconRect.Top, Item->ImageIndex, true);
    }

    // Dibujamos el texto del elemento
    SetBkMode(lv->Canvas->Handle, TRANSPARENT);
    DrawText(lv->Canvas->Handle, Item->Caption.c_str(),
        Item->Caption.Length(), &CaptionRect, DT_END_ELLIPSIS);

    // Dibujamos el texto de los subelementos
    for (int i=0; i<Item->SubItems->Count; i++)
    {
        TRect SubItemRect;
        ListView_GetSubItemRect(lv->Handle,
            Item->Index, i+1, LVIR_BOUNDS, &SubItemRect);
        InflateRect(&SubItemRect, -6, 0);
        String str = Item->SubItems->Strings[i];

        switch (i)
        {
            case 0:
                SetTextColor(lv->Canvas->Handle, clBlue);
                DrawText(lv->Canvas->Handle, str.c_str(),
                    str.Length(), &SubItemRect, DT_END_ELLIPSIS);
                break;
            case 1:
                // Si hay texto pintamos el checkbox marcado,
                //  en caso contrario lo pintamos desmarcado
                InflateRect(&SubItemRect, -2, -2);
                DrawFrameControl(lv->Canvas->Handle, &SubItemRect,
                    DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_MONO
                    | (str.IsEmpty() ? 0:DFCS_CHECKED));
                break;
            default:
                SetTextColor(lv->Canvas->Handle, clBlack);
                DrawText(lv->Canvas->Handle, str.c_str(),
                    str.Length(), &SubItemRect, DT_END_ELLIPSIS);
        }
    }

    DefaultDraw = false;
}

Si necesitas cambiar el estado de los checkbox de los subelementos pulsando sobre ellos, podrías hacerlo usando el evento OnMouseUp del ListView. Una macro del API que te seria útil para esto: "ListView_SubItemHitTest".
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias de nuevo _leo, era justo lo que queria.!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ese codigo funciona si se pulsa sobre la primera columna, que habria que hacer para que se marcarse, al pulsar sobre un elemento de cualquier columna.

Otra cosa. Si quisiera recoger informacion sobre la opcion elegida, ¿Como lo haria?

Ejemplo: En la parte:
Código:

    // Pintamos el fondo del elemento
    if (State.Contains(cdsSelected))
    {
        lv->Canvas->Brush->Color = static_cast<TColor>(0xF4E6DC);
        lv->Canvas->Pen->Color = static_cast<TColor>(0xD48A4C);
        lv->Canvas->Rectangle(ItemRect);

Edit1->Text=ListView1->Selected->Caption;   // Recogemos el valor

    }

De esta manera, si pulso sobre un elemento de la columna llamada "uno", obtengo su valor. Pero si pulso sobre otra columna no.

¿Como podria, pulsando sobre cualquier columna, obtener todos los datos?

Por ejemplo, si pulso sobre la columna llamada "Cuatro" en "martes", ¿como podria obtener:?

"Martes Dos asdasd"

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Cita:
...que habria que hacer para que se marcarse, al pulsar sobre un elemento de cualquier columna.

Para que se marque la fila pulsando en cualquier columna tienes que poner la propiedad RowSelect a true.

Cita:
Si quisiera recoger informacion sobre la opcion elegida, ¿Como lo haria?

Si lo quieres hacer desde dentro del evento donde se pinta solo tienes que leer la variable "Item", Item->Caption (para la primera columna), Item->SubItems... (para el resto).

Cita:
¿Como podria, pulsando sobre cualquier columna, obtener todos los datos?

Como digo mas arriba, si queremos detectar donde pulsamos con el ratón usando el evento OnMouseUp del ListView, podemos usar la macro ListView_SubItemHitTest, un ejemplo:

- Metemos el siguiente código en el evento OnMouseUp del ListView:
Código:
LVHITTESTINFO hti;
hti.pt = Point(X, Y);
ListView_SubItemHitTest(ListView1->Handle, &hti);
if (hti.iItem != -1)
{
    TListItem* item = ListView1->Items->Item[hti.iItem];
    String str;
    if (hti.iSubItem)
    {
        if (item->SubItems->Count >= hti.iSubItem)
            str = item->SubItems->Strings[hti.iSubItem-1];
    }
    else
        str = item->Caption;

    ShowMessage("Se pulso sobre: " + str);
    str = item->Caption + "\n";
    str += item->SubItems->Text;
    ShowMessage("Todas las columnas de esa fila:\n" + str);
}

Cita:
Gracias

De nada Wink espero haber entendido bien tus preguntas.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo, como siempre, perfecto. Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: CheckBbox y TListView Responder citando

Hola _Leo!
Seria posible mostrar un checkbox (y poder cambiar su estado) en el titulo de una columna? La idea es que al hacer click yo pueda seleccionar todos los item.

saludos
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.