Page 1 of 1

Antonio Linares por favor Ayudaaaa con TOOLTIPS EN TOOLBAR

Posted: Thu Jan 25, 2007 5:24 pm
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

Posted: Thu Jan 25, 2007 6:58 pm
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

Posted: Thu Jan 25, 2007 7:01 pm
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; 
}

Posted: Thu Jan 25, 2007 8:23 pm
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 )

Posted: Fri Jan 26, 2007 3:31 am
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

Posted: Fri Jan 26, 2007 8:42 am
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

Posted: Fri Jan 26, 2007 6:02 pm
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