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 

Añadir "..." al final de un caption si se sale del

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Añadir "..." al final de un caption si se sale del Responder citando

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
Mensaje    Asunto: Responder citando

if(Label1->Caption.Length()>5)
Label1->Caption=Label1->Caption.SubString(1,5)+"...";
_________________
Saludos.
Lalo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

Hola

Podrías utilizar la función
Código:
MinimizeName
que se encuentra en el
Código:
FileCtrl.hpp
para obtener el resultado que buscas.

Saludos !!!
_________________
Si puedo ayudarles en algo, no duden en consultarme !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
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.