Antonio Linares por favor Ayudaaaa con TOOLTIPS EN TOOLBAR

Antonio Linares por favor Ayudaaaa con TOOLTIPS EN TOOLBAR

Postby Cgallegoa » Thu Jan 25, 2007 5:24 pm

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
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Thu Jan 25, 2007 6:58 pm

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  Expand view  RUN
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  Expand view  RUN
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: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Antonio Linares » Thu Jan 25, 2007 7:01 pm

En teoría este es el código que debiera funcionar:
Code: Select all  Expand view  RUN
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
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby A&C » Thu Jan 25, 2007 8:23 pm

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
User avatar
A&C
 
Posts: 214
Joined: Sat Aug 19, 2006 1:37 pm
Location: Chile

Postby Cgallegoa » Fri Jan 26, 2007 3:31 am

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
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Fri Jan 26, 2007 8:42 am

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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Cgallegoa » Fri Jan 26, 2007 6:02 pm

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
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 87 guests