Page 2 of 3

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 8:54 pm
by Antonio Linares
carlos vargas wrote:antonio, he logrado que me funcione, ya no muestra en bold los textos en los dialogos en un folder, tanto en xp como en w7

he modificado un poco y habilitado el metodo handlevent de la clase tcheckbox

si la version es xp entonces llamo al super:handlevent.
no creo que sea lo adecuado este codigo, pero te puede dar luz de donde este el problema, revisalo por favor.

Code: Select all  Expand view

#define WM_UPDATEUISTATE  0x0128

METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TCheckBox

   IF nMsg == WM_UPDATEUISTATE
      ::Refresh(.f.)
      RETURN NIL
   ENDIF

RETURN IIf( "XP" $ Upper( cWinVersion() ), Super:HandleEvent( nMsg, nWParam, nLParam ), NIL )
 


Carlos,

El efecto de pintado en negrita viene de la función FixSays() que hace que los SAYs se pinten en modo transparente, pero se pintan sobre su propia imagen. Es decir, habría que borrar su imagen antes de que se pintasen. Estamos intentando encontrar una solución a eso.

En tu solución lo que evitas es el repintado, pero si muves la caja de dialogo fuera de la pantalla y luego dentro forzando un repintado, el efecto aparecera.

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 8:56 pm
by Antonio Linares
carlos vargas wrote:otra cosa Antonio.

cuando en XP o Win7 se tiene activado

Propiedades de pantalla->Apariencia->Efectos->Ocultar las letras subrayadas de acceso rapido hasta que presione la tecla ALT.


los controles checkbox y radiobuttons al obtener el foco la primera vez no muestra el borde punteado.

pero cuando esa propiedad esta activa.

ambos controles muestran correctamente el borde punteado, de ahi que muchas personas
reporte el problema y mucho otros indiquen que no tienen el problema.


ahi estaba el misterio.

ahora a saber que lo soluciona. :-)

disculpa la jodarria con esto, pero es para que el producto FWH quede cada dia mejor. :-)

salu2


Carlos,

Puedes poner un pantallazo de la opción de Windows, no la localizo. Posiblemente cambie un valor del registro, si lo localizamos, podriamos hacerlo configurable desde FWH :-)

Gracias por tu ayuda, asi conseguimos que FWH sea cada vez mejor :-)

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 9:07 pm
by carlos vargas
Image

Uploaded with ImageShack.us

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 9:11 pm
by carlos vargas
casualmente, eso pensaba, que aca entraba fixsays en accion, por ello consideraba que el mimso no era un fix valido.

he mirado el codigo que tengo de esa funcion, que realmente no se si es la version mas reciente.
para ver por donde van los tiros.

veo que hay una secion donde se usa la misma tecnica de doble buffer. :-)

Code: Select all  Expand view

  if( uMsg == WM_ERASEBKGND )
   {
      return 1;
   }
   else if( uMsg == WM_UPDATEUISTATE )
   {
      LONG lResult = CallWindowProc( ( WNDPROC ) GetProp( hWnd, "__FWTRANS" ), hWnd, uMsg, wParam, lParam );
      InvalidateRect( hWnd, NULL, TRUE );
      return lResult;
   }
   else if( uMsg == WM_PAINT )
   {
      PAINTSTRUCT ps;
      char text[ 256 ];
      RECT rct;
      HDC hDC = BeginPaint( hWnd, &ps );
      HGDIOBJ hOldFont;

      GetWindowText( hWnd, text, 255 );
      GetClientRect( hWnd, &rct );
      SetBkMode( hDC, TRANSPARENT );
      SelectObject( hDC, GetStockObject( DEFAULT_GUI_FONT ) );

      SendMessage( GetParent( hWnd ), WM_CTLCOLORSTATIC, ( WPARAM ) hDC, ( LPARAM ) hWnd );
      hOldFont = SelectObject( hDC, ( HGDIOBJ ) SendMessage( hWnd, WM_GETFONT, 0, 0 ) );

      if( ( GetWindowLong( hWnd, GWL_STYLE ) & SS_BLACKFRAME ) ==   SS_BLACKFRAME )
      {
         RECT rct;
         GetClientRect( hWnd, &rct );
         WindowBoxBlack( hDC, &rct );
      }
      else if( GetWindowLong( hWnd, GWL_STYLE ) & SS_CENTER )
      {
         DrawText( hDC, text, lstrlen( text ), &rct,  DT_CENTER | DT_WORDBREAK );
      }
      else if( GetWindowLong( hWnd, GWL_STYLE ) & SS_RIGHT )
      {
         DrawText( hDC, text, lstrlen( text ), &rct,  DT_RIGHT | DT_WORDBREAK );
      }
      else if( GetWindowLong( hWnd, GWL_STYLE ) & SS_LEFTNOWORDWRAP )
      {
         DrawText( hDC, text, lstrlen( text ), &rct,  DT_LEFT );
      }
      else
      {
         DrawText( hDC, text, lstrlen( text ), &rct,  DT_LEFT );
      }
      SelectObject( hDC, hOldFont );
      EndPaint( hWnd, &ps );
      return 0;
   }

 


salu2

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 9:39 pm
by Antonio Linares
Carlos,

Y en Windows 7 sabes desde donde se accede a esa opción ?

El problema del código viene de SetBkMode( hDC, TRANSPARENT ); que hace que el texto se pinte encima del anterior. Pero si lo quitamos, entonces el fondo no es transparente. A ver que solución se le puede encontrar...

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 9:41 pm
by carlos vargas
dejame buscarla, que aca en el brete no tenemos win7.
te comento en breve.

Re: Pressing ALT erasing parts of dialog

PostPosted: Tue Dec 13, 2011 9:58 pm
by carlos vargas
segun san google

http://social.technet.microsoft.com/For ... 38929ddb3c

La opción está en Panel de control, Centro de accesibilidad, Cambiar el funcionamiento del teclado, Subrayar los métodos abreviados de teclado y las teclas de acceso.

Re: Pressing ALT erasing parts of dialog

PostPosted: Wed Dec 14, 2011 12:46 am
by Antonio Linares
Carlos,

Parece que ya tenemos una solución efectiva al problema de los SAYs que se van poniendo en negrita :-)

Ahora le pasamos a FixSays() como segundo parámetro el brush del diálogo y asi el SAY antes de pintar el texto, rellena su superficie con el brush del diálogo. Asi desde dialog.prg ahora hacemos:

FixSays( ::hWnd, ::oBrush:hBrush ) // Solo hay una llamada a FixSays() desde dialog.prg

y en FixSays() ahora usamos ese brush que recibimos :-)

Te envio por email las librerias modificadas, gracias por las pruebas

Re: Pressing ALT erasing parts of dialog

PostPosted: Wed Dec 14, 2011 1:42 am
by carlos vargas
gracias antonio, pruebo y te comento.

Re: Pressing ALT erasing parts of dialog (SOLVED)

PostPosted: Wed Dec 14, 2011 2:16 am
by carlos vargas
Antonio........

Estoy que lloro :cry: , pero de alegria.

todo anda como la seda.
ahora que ya se el truco para permitir el correcto pintado de los bordes (aunque sea manual la cosa)
y ahora con este cambio, en fixsays, o las modificaciones en checkboxy radiobutton para permitir que la tecla ENTER ejecute el salto del foco al siguiente control en un folder.

por fin la cosa esta como debe de estar.

te doy un 100 en conducta. :-)

si no es mucha molestia, me podrias pasar la modificaciones en lib para xhb.com que es el otro compilador que uso.

mil gracias antonio.

una pregunta antonio, el segundo parametro en fixsay es opcional?, ya que por ejemplo la otra parte donde se usa fixsays es en toolbars, por ejemplo la de rpreview.

aca esta la config del subrayado.
Image

Uploaded with ImageShack.us

Re: Pressing ALT erasing parts of dialog

PostPosted: Wed Dec 14, 2011 9:20 am
by Antonio Linares
Carlos,

En rpreview.prg hay que modificar asi:

Code: Select all  Expand view
  if lRebar .or. nStyle >= 2007
      FixSays( ::oBar:hWnd, ::oBar:oBrush:hBrush )
   endif


No lo he probado. Te envio las libs para xhb.com

Muy bien por localizar esa opción en Windows 7. Ahora se trataria de usar un programa monitor del registro para que al cambiar esa opción veamos que se cambia en él y asi poder configurarlo desde nuestras aplicaciones :-)

Re: Pressing ALT erasing parts of dialog

PostPosted: Wed Dec 14, 2011 9:26 am
by Antonio Linares

Re: Pressing ALT erasing parts of dialog

PostPosted: Wed Dec 14, 2011 11:59 am
by carlos vargas

Re: Pressing ALT erasing parts of dialog

PostPosted: Thu Dec 15, 2011 5:19 pm
by Antonio Linares
Carlos,

Creo que he localizado el valor que cambia en el registro :-)

HKEY_CURRENT_USER\Control Panel\Accesibility\Keyboard Preference\On

Confirmado

Re: Pressing ALT erasing parts of dialog

PostPosted: Thu Dec 15, 2011 6:53 pm
by carlos vargas
Antonio, has visto los link?
estas pensando modificar el reg cuando la app inice ? :-)

salu2