 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Jue 01 Jul, 2004 6:07 pm Asunto: Cambiar color de la barra de seleccion ?? |
|
|
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 |
|
 |
jorgito Invitado
|
Publicado: Vie 02 Jul, 2004 3:42 pm Asunto: |
|
|
A mi tambien me interesaria saberlo, si lo consigues o alguien lo sabe please, que lo ponga..
Thx!! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
|
| Volver arriba |
|
 |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Sab 03 Jul, 2004 5:48 pm Asunto: |
|
|
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
Un saludo! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 07 Jul, 2004 5:49 pm Asunto: |
|
|
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 |
|
 |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Mie 07 Jul, 2004 8:12 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 07 Jul, 2004 8:37 pm Asunto: |
|
|
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 |
|
 |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Jue 08 Jul, 2004 10:18 am Asunto: |
|
|
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 .. , 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 |
|
 |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Jue 08 Jul, 2004 11:20 am Asunto: |
|
|
He tenido un momento de lucidez (raro en mi ) 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 08 Jul, 2004 11:50 am Asunto: |
|
|
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 |
|
 |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Vie 09 Jul, 2004 10:03 pm Asunto: |
|
|
| Muchas gracias de nuevo _leo, era justo lo que queria.! |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Lun 12 Jul, 2004 7:32 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 12 Jul, 2004 8:16 pm Asunto: |
|
|
| 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);
} |
De nada espero haber entendido bien tus preguntas. |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Lun 12 Jul, 2004 8:30 pm Asunto: |
|
|
Gracias _Leo, como siempre, perfecto.  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mie 24 Nov, 2004 4:13 pm Asunto: CheckBbox y TListView |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|