Antonio Linares por favor Ayudaaaa con TOOLTIPS EN TOOLBAR

Post Reply
Cgallegoa
Posts: 335
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador
Contact:

Antonio Linares por favor Ayudaaaa con TOOLTIPS EN TOOLBAR

Post by Cgallegoa »

Antonio necesito tu ayuda, estoy atorado con lo siguiente:

Los tooltips en la Clase TOOLBAR tienen un limite de 40 caracteres de largo. Hay alguna forma de poder ampliarlo a, por ejemplo, 120.

En la clase Window pude lograr un ancho de 120 con:
SendMessage( hWnd, TTM_SETMAXTIPWIDTH, 0, 120)

Funciona muy bien, pero no con ToolBar. Parece que esta invoca a una función diferente para construir los ToolTips. He probado de todo y no lo he logrado. Alguna sugerencia ?

Tampoco funciona:
oToolBar1:SetTextRows(3) ni
nRows := 2
SendMessage( oToolBar1:hWnd, TB_SETMAXTEXTROWS, nRows, 0 )

Tengo FWH 2.7 de Agosto 2006, xHarbour 0.99.61 y BCC 5.5

Saludos y gracias por tu atención,

Carlos Gallego
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Carlos,

Para asignar el texto a los tooltips usamos el dato szText de la estructura NMTTDISPINFO que por definición es así (como ves esta limitado a 40 caracteres unicode (80 bytes)):

Code: Select all

typedef struct tagNMTTDISPINFOA {
    NMHDR hdr;
    LPSTR lpszText;
    char szText[80];
    HINSTANCE hinst;
    UINT uFlags;
#if (_WIN32_IE >= 0x0300)
    LPARAM lParam;
#endif
} NMTTDISPINFOA, FAR *LPNMTTDISPINFOA;
Según el API de Windows para textos superiores a los 40 caracteres (ya que szText usa unicode) hay que usar lpstText y hacer hinst = NULL, pero lo hemos probado y no funciona.
Te copiamos aqui la función que necesitas por si quieres hacer pruebas:

Code: Select all

HB_FUNC( TTNSETTEXT ) // pNMTTDISPINFO, cTooltipText
{
   LPNMTTDISPINFO pti = ( LPNMTTDISPINFO ) hb_parnl( 1 );

   MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED,
                        ( LPCSTR ) hb_parc( 2 ), -1, ( LPWSTR ) pti->szText,
                        hb_parclen( 2 ) + 1 );

   pti->hinst = NULL;
   pti->lpszText = NULL;
   pti->uFlags = 0;
}
Prueba a ponerle un "_" delante del nombre y llama a esta función desde la Clase ToolBar
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

En teoría este es el código que debiera funcionar:

Code: Select all

HB_FUNC( TTNSETTEXT ) // pNMTTDISPINFO, cTooltipText 
{ 
   LPNMTTDISPINFO pti = ( LPNMTTDISPINFO ) hb_parnl( 1 ); 
   static char buffer[ 200 ];

   MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, 
                        ( LPCSTR ) hb_parc( 2 ), -1, buffer, 
                        hb_parclen( 2 ) + 1 ); 

   pti->hinst = NULL; 
   pti->lpszText = buffer; 
   pti->uFlags = 0; 
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
A&C
Posts: 214
Joined: Sat Aug 19, 2006 1:37 pm
Location: Chile

Post by A&C »

Antonio disculpa lo inpertinente...

pero todo este codigo es un lenguaje acaso es C

o cual

(Editado por Antonio: Sí, es C )
Mi segundo amor es Programar
Cgallegoa
Posts: 335
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador
Contact:

Post by Cgallegoa »

Antonio, gracias por tu respuesta.

No funcionó.

En el primer caso,

HB_FUNC( TTNSETTEXT ) // pNMTTDISPINFO, cTooltipText
{
LPNMTTDISPINFO pti = ( LPNMTTDISPINFO ) hb_parnl( 1 );

MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED,
( LPCSTR ) hb_parc( 2 ), -1, ( LPWSTR ) pti->szText,
hb_parclen( 2 ) + 1 );

pti->hinst = NULL;
pti->lpszText = NULL;
pti->uFlags = 0;
}

pone la misma longitud, 40 caracteres y corta el exceso sobre 40.

En el segundo caso,

HB_FUNC( TTNSETTEXT ) // pNMTTDISPINFO, cTooltipText
{
LPNMTTDISPINFO pti = ( LPNMTTDISPINFO ) hb_parnl( 1 );
static char buffer[ 200 ];

MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED,
( LPCSTR ) hb_parc( 2 ), -1, buffer,
hb_parclen( 2 ) + 1 );

pti->hinst = NULL;
pti->lpszText = buffer;
pti->uFlags = 0;
}

no pinta nada. Parece que es la característica de buffer. Será que incide en algo el tipo de variable, por ejemplo LPWSTR ? He probado pero tampoco sale nada.

Agradezco mucho tu ayuda. Un cliente me tiene loco pues quiere poner en los tooltips mensajes de hasta 180 caracteres, así como poder poner en 2 líneas el prompt de TBBUTTON y debo entregar con urgencia la aplicación.

Nuevamente anticipo mi agradecimiento por tu ayuda.

Saludos,

Carlos Gallego
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Carlos,

Como te he indicado, Microsoft tiene la limitación char szText[80]; de ahí que sólo se visualicen 40 caracteres.

La función modificada TTNSETTEXT() debería funcionar pero no lo hace. Así que hasta que aparezca una posible solución, tendrás que indicarle a tu cliente que no se puede y que hay que hacerlo de otra forma
regards, saludos

Antonio Linares
www.fivetechsoft.com
Cgallegoa
Posts: 335
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador
Contact:

Post by Cgallegoa »

Antonio, entiendido :(

Esta limitación aplica SOLO a TOOLBARS porque en los demás controles no hay problema. En todas mis aplicaciones tengo los ToolTips seteados para que muestran hasta 100 caracteres de ancho por línea.

Para esto en Windows.prg en el método ShowToolTip() puse:
SendMessage( hWnd, TTM_SETMAXTIPWIDTH, 0, 573)

Si en cualquier control, incluído BUTTONBAR (excepto TOOLBAR), pones un

oCtrlxxx:cToolTip:="123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234567890"

verás que te pone en una sola línea toda la cadena.

Es decir, la limitante sólo aplica para TOOLBAR. Estoy en lo correcto ?

Saludos,

Carlos Gallego
Post Reply