Punteado no dibujado al tomar foco

Punteado no dibujado al tomar foco

Postby Antonio Linares » Fri Oct 14, 2011 7:44 pm

Este es un bug buscado por mucho tiempo que finalmente ha sido localizado y arreglado :-)

Si hay un GET justo antes de un ComboBox, podeis observar que al presionar TAB el combobox no muestra su foco punteado la primera vez, aunque si lo muestra bien las siguientes veces. También ocurría con un GET antes de un Button.

Este comportamiento erróneo se debe a que el GET devuelve DLGC_WANTALLKEYS como respuesta al mensaje de Windows WM_GETDLGCODE. Algo que está permitido por Windows pero sin embargo causa ese efecto no deseado. Simplemente con modificar el Método GetDlgCode() de esta forma el punteado se mostrará bien:

Code: Select all  Expand view
METHOD GetDlgCode( nLastKey ) CLASS TGet

   if Len( ::oWnd:aControls ) == 1
      return DLGC_WANTALLKEYS
   endif

   ::oWnd:nLastKey = nLastKey

return nil // DLGC_WANTALLKEYS
regards, saludos

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

Re: Punteado no dibujado al tomar foco

Postby carlos vargas » Fri Oct 14, 2011 9:26 pm

Mil gracias Antonio, finalmente cayo ese bug. :-)

solo falta dilucidar por que con xhb.com y fwh en algunas condiciones, ciertos recursos incluidos en el EXE no son accesibles por tbrush y tbitmap.
en este caso las funciones palbmpload y LoadBitmap fallan.

si los recursos estan incluidos en una dll las funciones no fallan.

( he trabajado los recursos ya con rc.exe, brc.exe y xrc.exe asi que los tiros no van por ahi )
( he validado que los recursos que fallan existan en el exe)

con xharbour y harbour para borland no falla.

le he metido tiempo a encontrar las condiciones para que el fallo se manifieste, pero nada. :-(

Code: Select all  Expand view


en brush falla:
      case cBmpRes != nil
           ::hBitmap = LoadBitmap( GetResources(), cBmpRes ) /*aca ::hbitmap=0*/

en bitmap falla:

   if ! Empty( cResName )
      aBmpPal    = PalBmpLoad( cResName )
      ::hBitmap  = aBmpPal[ 1 ] /*aca ::hbitmap=0*/
      ::hPalette = aBmpPal[ 2 ]
 


salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Punteado no dibujado al tomar foco

Postby Francisco Horta » Fri Oct 14, 2011 10:11 pm

Antonio,

efectivamente se corrige el problema cuando usamos TAB, estoy probando con "ENTER" y no puntea los controles en la primera pasada, hasta la segunda los muestra
saludos
paco
____________________
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Punteado no dibujado al tomar foco

Postby Antonio Linares » Sat Oct 15, 2011 7:37 am

Paco,

El problema con Enter es que no es un comportamiento estandard de Windows. Es algo que se ha implementado para simular la funcionalidad de las aplicaciones en MsDos pero Windows no lo soporta de forma estandard y por eso vuelve a aparecer ese efecto.

Estamos viendo la forma de simular la pulsación de Tab al pulsar Enter, pues parece que la solución es dejar a Windows que haga su trabajo estandard :-)
regards, saludos

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

Re: Punteado no dibujado al tomar foco

Postby Antonio Linares » Sat Oct 15, 2011 9:25 am

Paco,

Solucionado el problema al usar Enter :-)

Hemos implementado una nueva función SendKey() basada en la función SendInput() del API de Windows:
viewtopic.php?f=6&t=22664&p=120948#p120948

y el método GoNextCtrl() de la Clase TWindow queda así:
Code: Select all  Expand view
METHOD GoNextCtrl( hCtrl ) CLASS TWindow

   local hCtlNext, nAt

   if Upper( ::ClassName() ) != "TDIALOG"
      nAt = AScan( ::aControls, { | o | o:hWnd == hCtrl } )
      if nAt != 0
         if nAt < Len( ::aControls )
            hCtlNext = ::aControls[ nAt + 1 ]:hWnd
         else
            hCtlNext = ::aControls[ 1 ]:hWnd
         endif
         if lAnd( GetWindowLong( hCtlNext, GWL_STYLE ), WS_TABSTOP )
            SetFocus( hCtlNext )
         endif
         return nil
      endif
   endif

   if ! Empty( ::aControls ) .and. hCtrl == ::LastActiveCtrl():hWnd
      if ! Empty( ::oWnd ) .and. ;
         ( ( Upper( ::oWnd:ClassName() ) $ "TFOLDER;TPAGES;TFOLDEREX" ) )
         hCtlNext = NextDlgTab( ::oWnd:oWnd:hWnd, ::oWnd:hWnd )
         ::hCtlFocus = hCtrl
         SetFocus( hCtlNext )
      endif
   else
      SendKey( VK_TAB )
   endif

return nil

 


Tambien hemos implementado el Método GetDlgCode() en la Clase TComboBox como VIRTUAL:
Code: Select all  Expand view
METHOD GetDlgCode() VIRTUAL
regards, saludos

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

Re: Punteado no dibujado al tomar foco

Postby Patricio Avalos Aguirre » Mon Oct 17, 2011 4:04 pm

Antonio.

Envio un ejemplo en folderX,

el archivo do.bat compila el fuente
ademas en la carpeta dbf\ hay 2 archivos
wcta1.exe que es sin modificaciones
wcta2.exe que esta con modificaciones solamente en tGET en el metodo
Code: Select all  Expand view
METHOD GetDlgCode( nLastKey ) CLASS TGet
..
return NIL //DLGC_WANTALLKEYS


http://www.megaupload.com/?d=B4O8JJ7I
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1059
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 95 guests