Punteado no dibujado al tomar foco

Post Reply
User avatar
Antonio Linares
Site Admin
Posts: 42559
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 80 times
Contact:

Punteado no dibujado al tomar foco

Post by Antonio Linares »

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

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
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Punteado no dibujado al tomar foco

Post by carlos vargas »

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



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)
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Punteado no dibujado al tomar foco

Post by Francisco Horta »

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
User avatar
Antonio Linares
Site Admin
Posts: 42559
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 80 times
Contact:

Re: Punteado no dibujado al tomar foco

Post by Antonio Linares »

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: 42559
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 80 times
Contact:

Re: Punteado no dibujado al tomar foco

Post by Antonio Linares »

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

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

METHOD GetDlgCode() VIRTUAL
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Patricio Avalos Aguirre
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

Re: Punteado no dibujado al tomar foco

Post by Patricio Avalos Aguirre »

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

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
Post Reply