| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Perco Invitado
|
Publicado: Mie 17 Ago, 2005 6:35 pm Asunto: Añadir "..." al final de un caption si se sale del |
|
|
Hola a todos
Por favor, necesito saber como añadir tres puntos "..." al final del caption de un TLabel si el texto se va a salir, por ejemplo
|esto es un Label Larg|
|esto es un Label La...|
Es como lo que hace windows con el nombre de los iconos en el escritorio, que les añade "..." si son muy largos los nombres.
Muchas gracias y espero que se entienda el tema. |
|
| Volver arriba |
|
 |
Lalo Ens


Registrado: 24 Jun 2005Mensajes: 39Ubicación: Bs. As. (Argentina)
|
Publicado: Jue 18 Ago, 2005 1:18 pm Asunto: |
|
|
if(Label1->Caption.Length()>5)
Label1->Caption=Label1->Caption.SubString(1,5)+"..."; _________________ Saludos.
Lalo. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Jue 18 Ago, 2005 1:26 pm Asunto: |
|
|
Gracias por la respuesta,
pero yo me refiero a si el texto del Caption se sale del ancho del TLabel, ya que cambiando el tipo o el tamaño del texto pues ya no es lo mismo, ya que a tamaño normal, si es de mas de 5 chars pues no se sale, pero si aumentamos el tamaño de los 5 chars pues si se sale aunque sigan siendo 5 chars.
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 18 Ago, 2005 2:06 pm Asunto: |
|
|
Una manera sencilla es usar el componente TStaticText (pestaña:Additional), poner la propiedad Autosize a false y en el constructor del Form lo siguiente:
| Código: | HWND h = StaticText1->Handle;
SetWindowLong(h, GWL_STYLE, GetWindowLong(h, GWL_STYLE) | SS_ENDELLIPSIS);
|
|
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Vie 19 Ago, 2005 8:05 am Asunto: |
|
|
Hola Leo,
la opción con TStaticText funciona muy bién, lo que ocurre es que en ese componente no tengo la propiedad Transparent con la tiene el TLabel lo que me provoca algún que otro contratiempo. En un principio iba a cambiar todos los TLabel por TStaticText pero ahora me lo estoy pensando.
Muchas gracias |
|
| Volver arriba |
|
 |
edwinhp Cdt

Registrado: 11 Ago 2005Mensajes: 5
|
Publicado: Vie 19 Ago, 2005 9:20 pm Asunto: |
|
|
Hola
Podrías utilizar la función que se encuentra en el para obtener el resultado que buscas.
Saludos !!! _________________ Si puedo ayudarles en algo, no duden en consultarme !!! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 20 Ago, 2005 12:19 am Asunto: |
|
|
| Cita: | | no tengo la propiedad Transparent |
Tienes varias formas de solucionarlo, la más sencilla que se me ocurre y sin tener que crear un nuevo componente, es la siguiente.
- En el constructor del Form lo siguiente:
| Código: | // repetimos esto por cada TStaticText que necesitemos
HWND h = StaticText1->Handle;
SetWindowLong(h, GWL_STYLE, GetWindowLong(h, GWL_STYLE) | SS_ENDELLIPSIS);
SetWindowLong(h, GWL_EXSTYLE, GetWindowLong(h, GWL_EXSTYLE) | WS_EX_TRANSPARENT); |
- En el apartado privado de la cabecera de la clase lo siguiente:
| Código: | private: // User declarations
void __fastcall WmCtlColorStatic(TWMCtlColor& msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_CTLCOLORSTATIC, TWMCtlColor, WmCtlColorStatic)
END_MESSAGE_MAP(inherited) |
- Y finalmente implementamos la función que acabamos de declarar:
| Código: | void __fastcall TForm1::WmCtlColorStatic(TWMCtlColor& msg)
{
inherited::Dispatch(&msg);
if (FindControl(msg.ChildWnd)->ClassNameIs("TStaticText"))
{
SetBkMode(msg.ChildDC, TRANSPARENT);
msg.Result = reinterpret_cast<int>(GetStockObject(NULL_BRUSH));
}
} |
NOTA: Un detalle importante para que la transparencia funcione correctamente es que el TStaticText tenga la propiedad ParentColor a true. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Lun 22 Ago, 2005 10:47 pm Asunto: |
|
|
Hola de nuevo,
muchas gracias por las aclaraciones y consejos, yo he estado mirando una funcion que es asi,
Label1->Canvas->TextWidth()
y que devuelve el ancho en pixeles, entonces...
no podria comparar el ancho del texto con el ancho del TLabel y si se sale pues añadir los "..."?
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 23 Ago, 2005 12:38 am Asunto: |
|
|
En la solución de arriba es Windows quien decide cuando poner los puntos, pero si esto no te gusta también puedes usar una solución mas "manual" como dices con el "Label1->Canvas->TextWidth()". Usando la siguiente función:
| Código: | void LabelEllipsis(TLabel* lbl, String str)
{
HFONT oldFnt = SelectObject(lbl->Canvas->Handle, lbl->Font->Handle);
const int maxWidth = lbl->Width - lbl->Canvas->TextWidth("...");
if (!lbl->AutoSize && lbl->Canvas->TextWidth(str) > lbl->Width)
{
while (lbl->Canvas->TextWidth(str) > maxWidth)
str.SetLength(str.Length()-1);
str += "...";
}
SelectObject(lbl->Canvas->Handle, oldFnt);
lbl->Caption = str;
}
|
Y para usarla:
LabelEllipsis(Label1, "Copiamos este texto al TLabel y pone los puntos si es necesario");
Si el texto es ruta+nombre de archivo puedes usar "MinimizeName" como te indican mas arriba. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Mar 23 Ago, 2005 12:47 pm Asunto: |
|
|
hola,
muchas gracias por todo, he decidido utlizar la ultima función expuesta por Leo ya que me parece las más simple y controlable (de momento, al menos para mi nivel de programación). |
|
| Volver arriba |
|
 |
|